Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2021, 01:15   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию Еще два вопроса по функции

1. Если по ходу выполнения функции, ничего не будет возвращено?
Условно
Код:
Function qqq(a, b:integer) : integer;
begin
if a>b then qqq:=1;
end;
Цитата:
d:=qqq(1, 2)
В этом случае, что будет с переменной d? Останется ее старое значение? Будет ошибка? Будет случайное значение из того что было в какой-то там области памяти?

2. В какой момент происходит присвоение?
Код:
Function qqq: integer;
begin
{какой-то код 1}
qqq:={что-то там}
{какой-то код 2}
Код:
d:=qqq;
Вопрос: на момент исполнения {какой-то код 2}, уже будет изменено значение переменной d, или еще нет?
Kronos913 вне форума Ответить с цитированием
Старый 23.04.2021, 09:02   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Вопрос: на момент исполнения {какой-то код 2}, уже будет изменено значение переменной d, или еще нет?
функция помещает свой результат на вершину стека данных.
значение переменной d заполняется из вершины стека ПОСЛЕ окончания работы(выполнения) функции.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 23.04.2021, 19:36   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

По первому вопросу, IDE сама предупреждает "[Warning]: Return value of function 'qqq' might be undefined". Будет случайное значение. Если посмотреть ассемблерный код, то перед вызовом qqq значения 1 и 2 будут положены в регистры eax и edx, затем вызвана функция qqq, внутри которой произойдет сравнение регистров eax и edx, если сравнение успешно, то в регистр ecx положат единицу, а иначе перескочат к следующей команде, которая записывает в регистр eax значение регистра ecx, а затем производится возврат из функции. При неудачном сравнении результатом будет по сути последнее значение регистра ecx.
Если нужно другое поведение (изменение переменной d на момент исполнения кода 2 или чтобы оставалось старое значение), то нужно написать процедуру:
Код:
procedure qqq(a, b: integer; var d: integer);
begin
  {какой-то код 1}
  if a > b then d := 1;
  {какой-то код 2}
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 24.04.2021, 03:14   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
В этом случае, что будет с переменной d? Останется ее старое значение? Будет ошибка? Будет случайное значение из того что было в какой-то там области памяти?
Будет случайное значение.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VB. Два вопроса Avatonk Помощь студентам 1 04.02.2013 21:19
Два простых вопроса skvair C++ Builder 4 31.01.2012 22:28
Два небольших вопроса :) f4rr3l Паскаль, Turbo Pascal, PascalABC.NET 5 10.01.2009 12:44
Два вопроса Никки Общие вопросы Delphi 2 19.01.2008 21:39