Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 12.07.2022
Сообщений: 5

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

09.05.2023, 13:37. Показов 921. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня! Гуру, нужна ваша помощь. Вопрос связан с вызовом функции.
К примеру, есть два файла (file1 и file2). В файле 1 находится main(). В файле 2 реализована функция Sum()
В функции main() вызывается функция Sum()

FILE1.c

C
1
2
3
4
5
6
#include “file2.h”
int main(void)
{
Sum();
return 0;
}



FILE2.c

C
1
2
3
4
5
6
int Sum(void)
{
Int x = 0;
x = 7+6;
return x;
}
Вопрос: Как осуществляется выполнение функции Sum()? Место прототипа функции (Sum() ) вставляется реализация этой функции?
Или осуществляется переход на эту функцию, где она реализована(то есть в файле 2)? Если да, то как это работает, когда эта программа загружена во flash память микроконтроллера? Я понимаю это так, что функция Sum() хранится в определенном месте в памяти. Выполняется функция main() и когда вызывается функция Sum(), то указатель перемещается на адрес в памяти где находится функция Sum(), выполняет эту функцию и возвращается обратно в main(). Так ли это работает?

Или подскажите пожалуйста где и что нужно почитать что бы понять это. (По просторам интернета я уже бегал).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.05.2023, 13:37
Ответы с готовыми решениями:

Не вызывается функция
помогите не понимаю почему не работает функция er_1 #include<iostream> #include<string> #include<vector> using namespace...

Не вызывается функция
Когда код функции находился в главной функции, то выполнялся без нареканий(не считая выскакивания из цикла, если превысить длину входящий...

Не вызывается функция?
int main() { cout<<"Let's go!\n\n\n"; int Fill_array(); } int Fill_array(double mac, int ArSize) { double...

2
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
10.05.2023, 02:16
Цитата Сообщение от MaksC Посмотреть сообщение
Выполняется функция main() и когда вызывается функция Sum(), то указатель перемещается на адрес в памяти где находится функция Sum(), выполняет эту функцию и возвращается обратно в main(). Так ли это работает?
Наверно не указатель, а программный счетчик? По разному.
Без оптимизаций да. При этом еще и регистры процессора могут пушиться на стек.
Но если функция достаточно простая/используется только один раз, то компилятор может просто подставить ее тело на место вызова чтобы сэкономить такты на дополнительные call/ret.
Цитата Сообщение от MaksC Посмотреть сообщение
Или подскажите пожалуйста где и что нужно почитать что бы понять это.
Самая точная информация находится в документации к компилятору и линковщику которые используешь. Конкретно то что ты ищешь, кажется, называется "соглашение о вызовах". Возможно мастистые микроконтроллерщики меня поправят.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
11.05.2023, 01:15
Цитата Сообщение от MaksC Посмотреть сообщение
Вопрос: Как осуществляется выполнение функции Sum()?
Так а что находится в файле file2.h? Почему не приведено его содержимое?

Цитата Сообщение от MaksC Посмотреть сообщение
Вопрос: Как осуществляется выполнение функции Sum()?
В месте вызова функции делается вызов функции, т.е. передача управления на тело функции.

Цитата Сообщение от MaksC Посмотреть сообщение
Место прототипа функции (Sum() ) вставляется реализация этой функции?
Не понял. Зачем вместо прототипа вставлять реализацию? О чем речь? О каком прототипе?

Цитата Сообщение от MaksC Посмотреть сообщение
Или осуществляется переход на эту функцию, где она реализована(то есть в файле 2)?
В файле 2 находится исходный текст функции. Туда не может быть никакого "перехода". Процессорам не нужен исходный текст. Процессоры не умеют выполнять исходный текст на языке С. Переход будет осуществляться туда, где находится точка входа в тело функции в скомпилированном коде вашей программы.

Цитата Сообщение от MaksC Посмотреть сообщение
Если да, то как это работает, когда эта программа загружена во flash память микроконтроллера?
"Flash память микроконтроллера" ничего не меняет.

Цитата Сообщение от MaksC Посмотреть сообщение
Я понимаю это так, что функция Sum() хранится в определенном месте в памяти.
Результат компиляции вашей функции Sum хранится в определенном месте в памяти.

Цитата Сообщение от MaksC Посмотреть сообщение
Выполняется функция main() и когда вызывается функция Sum(), то указатель перемещается на адрес в памяти где находится функция Sum(), выполняет эту функцию и возвращается обратно в main(). Так ли это работает?
Да, именно так это и работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.05.2023, 01:15
Помогаю со студенческими работами здесь

Не вызывается функция
Набросок программы, по работе с треугольником, хочу, чтобы выход с кейса в функции void choise() осуществлялся при нажатии необходимой...

Не вызывается функция
Проблема заключается в следующем: при выполнении в WM_CREATE не выполняется рекурсивная функция GetDIR. Первый меседжбокс выводится и...

Не вызывается функция
Здравствуйте. Не работает условие в цикле. Просто не вызывается функция prior. Как исправить? int prior(char s,char qu) { switch (s)...

Не вызывается функция
Здравствуйте. Не понимаю почему, но код работает, а программа даже не заходит в функцию. В чем может быть ошибка? Перепробовала всё, но...

Функция не вызывается 2й раз
Смысл - функция служит для записи числа в массив (посимвольно) int* read(int mass) { int i=0; while(cin>>mass) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru