Адрес и время жизни переменной, которую возвращает функция

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Адрес и время жизни переменной, которую возвращает функция

Сообщение arthur2 » 10.03.2014 (Пн) 22:30

Есть некая функция, объявленная в модуле (то, что функции классов - особая песня, я в курсе, оставляю их за бортом вопроса). Можно или из самой функции каким-то образом узнать адрес, по которому она вернет результат? И когда уничтожается та переменная, в которую помещен результат - доживет ли она до конца вызвавшей процедуры или умрет сразу же, как выполнение перейдет на следующую строку?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Адрес и время жизни переменной, которую возвращает функц

Сообщение Хакер » 10.03.2014 (Пн) 23:12

Совершенно непонятно, о чём речь.

Модульная функция возвращает результат в регистре EAX, или в паре EDX:EAX, или на стеке FPU, или в обычном стеке (как если бы это был последний ByRef-параметр) в зависимости от типа возвращаемого значения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Адрес и время жизни переменной, которую возвращает функц

Сообщение arthur2 » 11.03.2014 (Вт) 5:03

Хакер писал(а): в зависимости от типа возвращаемого значения
Ну скажем, если массив? Если строка? Если структура?

Хакер писал(а):как если бы это был последний ByRef-параметр
То есть, адрес можем получить как VarPtr(last) - 4, где last- последний аргумент? А для какого это типа?

Ну и главное:
Код: Выделить всё
n=myFun(myPar)
doNextThing


Если в doNextThingя обращусь по адресу, по которому функция myFunвернула значение, там будут ещё действительные данные, или уже свободные?

Интуиция подсказывает мне, что в процедуре под каждую вызываемую функцию выделяется локальная безымянная переменная, которая уничтожится вместе с другими локальными переменными только после выхода из процедуры. Это так? или как именно?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Адрес и время жизни переменной, которую возвращает функц

Сообщение Хакер » 11.03.2014 (Вт) 5:25

arthur2 писал(а):Ну скажем, если массив?

Если массив — регистре EAX возвращается указатель на SA-дескриптор.
Если строка — в регистре EAX возвращается указатель на начало строки.

arthur2 писал(а):Если в doNextThingя обращусь по адресу, по которому функция myFunвернула значение, там будут ещё действительные данные, или уже свободные?

Кто тебе сказал, что возвращаемое значение само по себе должно размещаться в памяти? Не всегда должно и вряд ли размещается.

arthur2 писал(а):Если в doNextThingя обращусь по адресу, по которому функция myFunвернула значение

Ещё раз: функция в общем случае не записывает возвращаемое значение по какому-то адресу. Поэтому вопрос не имеет смысла. Но если обратишь по адресу переменной n, то значение там будет.

arthur2 писал(а):Интуиция подсказывает мне, что в процедуре под каждую вызываемую функцию выделяется локальная безымянная переменная, которая уничтожится вместе с другими локальными переменными только после выхода из процедуры. Это так? или как именно?

Нет, это чушь.


Вообще, какой смысл во всём этом? Совершенно точно ты пытаешься сделать что-то неким образом, которые однозначно неправильный и даже ни секунды не должен рассматривать и обдумываться как приемлемый.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Адрес и время жизни переменной, которую возвращает функц

Сообщение arthur2 » 11.03.2014 (Вт) 5:35

Я не пытаюсь сделать что-то конкретное, я пытаюсь разобраться, как конкретно это устроено, чтобы потом уже придумать, как это использовать :)

Если массив — регистре EAX возвращается указатель на SA-дескриптор.
Если строка — в регистре EAX возвращается указатель на начало строки.
А сами данные строки или массива - в какой момент они освобождаются? Что их освобождает и каким образом?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Адрес и время жизни переменной, которую возвращает функц

Сообщение Хакер » 11.03.2014 (Вт) 5:43

Освобождает новый владелец.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Адрес и время жизни переменной, которую возвращает функц

Сообщение arthur2 » 11.03.2014 (Вт) 5:50

То есть, в момент, когда данные из myFun попадают в n? То есть, во время doNextThing данные уже освобождены? А как это происходит? что именно провоцирует освобождение? при компиляции сюда что-то дописывается, что данные освобождает? или как?
Артур
 
   

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.03.2014 (Вт) 11:49

arthur2 писал(а):Интуиция подсказывает мне, что в процедуре под каждую вызываемую функцию выделяется локальная безымянная переменная, которая уничтожится вместе с другими локальными переменными только после выхода из процедуры. Это так? или как именно?

Если предположить, что твоё утверждение верно, то следующая вызванная функция эти же данные и сотрёт своей такой же переменой ;)
Но вот по поводу верности самого утверждения ничего точно сказать не могу. Предполагаю, что на начальном этапе это вполне может быть так, но компилятор, а точнее оптимизатор, может при желании эту переменную выкидывать или размещать в регистре.

Хакер писал(а):Вообще, какой смысл во всём этом? Совершенно точно ты пытаешься сделать что-то неким образом, которые однозначно неправильный и даже ни секунды не должен рассматривать и обдумываться как приемлемый.

Надеюсь, просто поэксперементировать - интересно же :)

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Адрес и время жизни переменной, которую возвращает функц

Сообщение ger_kar » 11.03.2014 (Вт) 19:13

Ну вообще если сильно нужно что-бы процедура или функция помещала возвращаемое значение к конкретную ячейку, то можно для этих целей юзать обычный ByRef аргумент.
Кстати а что может возвращаться
Хакер писал(а):Модульная функция возвращает результат в регистре EAX, или в паре EDX:EAX
в регистровой паре EDX:EAX? 64 битные переменные типа Currency или Date?
Бороться и искать, найти и перепрятать


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 52

    TopList