Доброго дня! Гуру, нужна ваша помощь. Вопрос связан с вызовом функции.
К примеру, есть два файла (file1 и file2). В файле 1 находится main(). В файле 2 реализована функция Sum()
В функции main() вызывается функция Sum()
FILE1.c
#include “file2.h”
int main(void)
{
Sum();
return 0;
}
FILE2.c
int Sum(void)
{
Int x = 0;
x = 7+6;
return x;
}
Вопрос: Как осуществляется выполнение функции Sum()? Место прототипа функции (Sum() ) вставляется реализация этой функции?
Или осуществляется переход на эту функцию, где она реализована(то есть в файле 2)? Если да, то как это работает, когда эта программа загружена во flash память микроконтроллера? Я понимаю это так, что функция Sum() хранится в определенном месте в памяти. Выполняется функция main() и когда вызывается функция Sum(), то указатель перемещается на адрес в памяти где находится функция Sum(), выполняет эту функцию и возвращается обратно в main(). Так ли это работает?
Или подскажите пожалуйста где и что нужно почитать что бы понять это. (По просторам интернета я уже бегал).
Как вызывается функция? (Язык си)
-
maksimdag0
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Чт апр 08, 2021 09:46:48
- Реклама
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1915
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Как вызывается функция? (Язык си)
Как написали, функция Sum() представляет собой макрос (x = 7 + 6): будет вычисляться один раз при компиляции (= 13) и каждый раз, когда вызывается Sum(), заменяется с 13.
Чтобы не ошибиться в объяснении, сделайте функцию напр. с входные аргументы. Напр.:
FILE2.c
и вызовите в main(), когда необходимо:
Чтобы не ошибиться в объяснении, сделайте функцию напр. с входные аргументы. Напр.:
FILE2.c
Код: Выделить всё
int Sum(int k)
{
int x = 0;
x = 7 + k;
return x;
}Код: Выделить всё
...
Sum(6) ;
...Re: Как вызывается функция? (Язык си)
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4413234#p4413234"]Как осуществляется выполнение функции Sum()? Место прототипа функции (Sum() ) вставляется реализация этой функции?[/uquote] Оптимизатор может так сделать, если посчитает нужным (если функция малесюнькая. то затраты на переходы возвраты больше, чем вставить ее всю).
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4413234#p4413234"]Или осуществляется переход на эту функцию, где она реализована(то есть в файле 2)?[/uquote] и так тоже, если оптимизатор посчитал нужным, обычно, именно так.
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4413234#p4413234"]когда вызывается функция Sum(), то указатель перемещается на адрес в памяти где находится функция Sum(), выполняет эту функцию и возвращается обратно в main(). Так ли это работает?[/uquote] ну, в общем, да.
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4413234#p4413234"]Или подскажите пожалуйста где и что нужно почитать что бы понять это.[/uquote] В настройках компилятора включаем опцию "выдать листинг ассемблера и смотрим его. Поэтому ассемблер знать обязательно. Это понимание работы и отладка. Изучение ассемблера и архитектуры позволяет понять все эти вызовы-возвраты, что приоисходит с регистрами, стэком, прерываниями и т.д и т.п.
Полагаю, поиском здесь на форуме что-то типа "книжки по изучению микроконтроллеров" найти можно, они предлагались много раз.
З. Ы. Рекомендуемую литературу можно было бы давно сделать какой-нить закрепленной шапкой в ветках.... плохо, что этого нет на форуме
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4413234#p4413234"]Или осуществляется переход на эту функцию, где она реализована(то есть в файле 2)?[/uquote] и так тоже, если оптимизатор посчитал нужным, обычно, именно так.
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4413234#p4413234"]когда вызывается функция Sum(), то указатель перемещается на адрес в памяти где находится функция Sum(), выполняет эту функцию и возвращается обратно в main(). Так ли это работает?[/uquote] ну, в общем, да.
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4413234#p4413234"]Или подскажите пожалуйста где и что нужно почитать что бы понять это.[/uquote] В настройках компилятора включаем опцию "выдать листинг ассемблера и смотрим его. Поэтому ассемблер знать обязательно. Это понимание работы и отладка. Изучение ассемблера и архитектуры позволяет понять все эти вызовы-возвраты, что приоисходит с регистрами, стэком, прерываниями и т.д и т.п.
Полагаю, поиском здесь на форуме что-то типа "книжки по изучению микроконтроллеров" найти можно, они предлагались много раз.
З. Ы. Рекомендуемую литературу можно было бы давно сделать какой-нить закрепленной шапкой в ветках.... плохо, что этого нет на форуме
- КРАМ
- Друг Кота
- Сообщения: 25385
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Как вызывается функция? (Язык си)
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4413234#p4413234"]выполняет эту функцию и возвращается обратно в main().[/uquote]
В вашем случае компилятор вообще проигнорирует вызов функции, поскольку вы вызываете функцию возвращающую значение и ничему это значение не присваиваете. Это безотносительно замены функции на константу, о чем вам ранее сказали.
В вашем случае компилятор вообще проигнорирует вызов функции, поскольку вы вызываете функцию возвращающую значение и ничему это значение не присваиваете. Это безотносительно замены функции на константу, о чем вам ранее сказали.
-
maksimdag0
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Чт апр 08, 2021 09:46:48
Re: Как вызывается функция? (Язык си)
Спасибо!
Если б ассемблер знал, то скорее всего такие вопросы бы не возникли)
Если б ассемблер знал, то скорее всего такие вопросы бы не возникли)
- Реклама
- valentinovich
- Электрический кот
- Сообщения: 1004
- Зарегистрирован: Ср окт 04, 2017 20:47:40
Re: Как вызывается функция? (Язык си)
Если хотите именно программировать, а не создавать видимость сего процесса, то для применяемого вами МК -maksimdag0 писал(а):Если б ассемблер знал, то скорее всего такие вопросы бы не возникли)
Увы, но только так и никак иначе.Martian писал(а): ассемблер знать обязательно. Это понимание работы и отладка. Изучение ассемблера и архитектуры позволяет понять все эти вызовы-возвраты, что происходит с регистрами, стэком, прерываниями и т.д и т.п.![]()
-
Vladimir86
- Родился
- Сообщения: 14
- Зарегистрирован: Ср мар 18, 2020 10:25:01
- Откуда: Москва
Re: Как вызывается функция? (Язык си)
Если Вы так сильно переживаете за время вызова функции и ресурсов памяти, то чем Вас не устраивает вариант
#define SUM(x,y)((x)+(y))
#define SUM(x,y)((x)+(y))


