Страница 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(), когда необходимо:

Код: Выделить всё

...
Sum(6) ;
...

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 писал(а): ассемблер знать обязательно. Это понимание работы и отладка. Изучение ассемблера и архитектуры позволяет понять все эти вызовы-возвраты, что происходит с регистрами, стэком, прерываниями и т.д и т.п. 8)
Увы, но только так и никак иначе. :dont_know:

Re: Как вызывается функция? (Язык си)

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