Страница 1 из 1
Как вызывается функция? (Язык си)
Добавлено: Вт май 09, 2023 13:27:01
maksimdag0
Доброго дня! Гуру, нужна ваша помощь. Вопрос связан с вызовом функции.
К примеру, есть два файла (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(). Так ли это работает?
Или подскажите пожалуйста где и что нужно почитать что бы понять это. (По просторам интернета я уже бегал).
Re: Как вызывается функция? (Язык си)
Добавлено: Вт май 09, 2023 14:39:46
veso74
Как написали, функция Sum() представляет собой макрос (x = 7 + 6): будет вычисляться один раз при компиляции (= 13) и каждый раз, когда вызывается Sum(), заменяется с 13.
Чтобы не ошибиться в объяснении, сделайте функцию напр. с входные аргументы. Напр.:
FILE2.c
Код: Выделить всё
int Sum(int k)
{
int x = 0;
x = 7 + k;
return x;
}
и вызовите в main(), когда необходимо:
Re: Как вызывается функция? (Язык си)
Добавлено: Вт май 09, 2023 14:56:44
Martian
[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] В настройках компилятора включаем опцию "выдать листинг ассемблера и смотрим его. Поэтому ассемблер знать обязательно. Это понимание работы и отладка. Изучение ассемблера и архитектуры позволяет понять все эти вызовы-возвраты, что приоисходит с регистрами, стэком, прерываниями и т.д и т.п.
Полагаю, поиском здесь на форуме что-то типа "книжки по изучению микроконтроллеров" найти можно, они предлагались много раз.
З. Ы. Рекомендуемую литературу можно было бы давно сделать какой-нить закрепленной шапкой в ветках.... плохо, что этого нет на форуме
Re: Как вызывается функция? (Язык си)
Добавлено: Вт май 09, 2023 15:16:02
КРАМ
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4413234#p4413234"]выполняет эту функцию и возвращается обратно в main().[/uquote]
В вашем случае компилятор вообще проигнорирует вызов функции, поскольку вы вызываете функцию возвращающую значение и ничему это значение не присваиваете. Это безотносительно замены функции на константу, о чем вам ранее сказали.
Re: Как вызывается функция? (Язык си)
Добавлено: Вт май 09, 2023 21:37:46
maksimdag0
Спасибо!
Если б ассемблер знал, то скорее всего такие вопросы бы не возникли)
Re: Как вызывается функция? (Язык си)
Добавлено: Вт май 09, 2023 22:04:11
valentinovich
maksimdag0 писал(а):Если б ассемблер знал, то скорее всего такие вопросы бы не возникли)
Если хотите
именно программировать, а не создавать видимость сего процесса, то для применяемого вами МК -
Martian писал(а): ассемблер знать обязательно. Это понимание работы и отладка. Изучение ассемблера и архитектуры позволяет понять все эти вызовы-возвраты, что происходит с регистрами, стэком, прерываниями и т.д и т.п.
Увы, но только так и никак иначе.

Re: Как вызывается функция? (Язык си)
Добавлено: Ср май 10, 2023 13:49:08
Vladimir86
Если Вы так сильно переживаете за время вызова функции и ресурсов памяти, то чем Вас не устраивает вариант
#define SUM(x,y)((x)+(y))