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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
maksimdag0
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

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

Сообщение 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(). Так ли это работает?

Или подскажите пожалуйста где и что нужно почитать что бы понять это. (По просторам интернета я уже бегал).
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение 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) ;
...
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение 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] В настройках компилятора включаем опцию "выдать листинг ассемблера и смотрим его. Поэтому ассемблер знать обязательно. Это понимание работы и отладка. Изучение ассемблера и архитектуры позволяет понять все эти вызовы-возвраты, что приоисходит с регистрами, стэком, прерываниями и т.д и т.п.

Полагаю, поиском здесь на форуме что-то типа "книжки по изучению микроконтроллеров" найти можно, они предлагались много раз.

З. Ы. Рекомендуемую литературу можно было бы давно сделать какой-нить закрепленной шапкой в ветках.... плохо, что этого нет на форуме
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 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: Как вызывается функция? (Язык си)

Сообщение maksimdag0 »

Спасибо!
Если б ассемблер знал, то скорее всего такие вопросы бы не возникли)
Реклама
Аватара пользователя
valentinovich
Электрический кот
Сообщения: 1004
Зарегистрирован: Ср окт 04, 2017 20:47:40

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

Сообщение valentinovich »

maksimdag0 писал(а):Если б ассемблер знал, то скорее всего такие вопросы бы не возникли)
Если хотите именно программировать, а не создавать видимость сего процесса, то для применяемого вами МК -
Martian писал(а): ассемблер знать обязательно. Это понимание работы и отладка. Изучение ассемблера и архитектуры позволяет понять все эти вызовы-возвраты, что происходит с регистрами, стэком, прерываниями и т.д и т.п. 8)
Увы, но только так и никак иначе. :dont_know:
Реклама
Vladimir86
Родился
Сообщения: 14
Зарегистрирован: Ср мар 18, 2020 10:25:01
Откуда: Москва

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

Сообщение Vladimir86 »

Если Вы так сильно переживаете за время вызова функции и ресурсов памяти, то чем Вас не устраивает вариант
#define SUM(x,y)((x)+(y))
Ответить

Вернуться в «ARM»