Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Builder 6.0

Автор: Fanat 19.02.2008 15:00

Есть 3 функции...1ая и вторая вызывают 3ью..можно ли как то без введения дополнительных параметров определить в 3ей функции какая функция её вызвала?..как?..

Автор: hardcase 19.02.2008 15:18

Цитата(Fanat @ 19.02.2008 11:00) *
Есть 3 функции...1ая и вторая вызывают 3ью..можно ли как то без введения дополнительных параметров определить в 3ей функции какая функция её вызвала?..как?..
В управляемых средах (Java, .NET) подобный фокус возможен с помощью отражения и высокоуровневого анализа стека (реализуется в 2 строки).
В Билдере такое в принципе возможно: ассемблер + перелопачивание стека.

Автор: Fanat 19.02.2008 15:19

Цитата(hardcase @ 19.02.2008 11:18) *

В управляемых средах (Java, .NET) подобный фокус возможен с помощью отражения и высокоуровневого анализа стека.
В Билдере такое в принципе возможно: ассемблер + перелопачивание стека.


Мда...значит легче параметр добавить...

Автор: volvo 19.02.2008 15:46

В Билдере такое в принципе не возможно (я имею в виду, что программа, работающая стабильно, будет написана практически на чистом ассемблере, и ей будут недоступны многие "фишки" VCL; а программа, которая будет написана на С++ - будет работать очень нестабильно)

Fanat, __FUNC__ передавай в вызываемую программу...

Автор: Fanat 19.02.2008 16:07

Цитата(volvo @ 19.02.2008 11:46) *

Fanat, __FUNC__ передавай в вызываемую программу...


А ето что такое?..

Автор: volvo 19.02.2008 16:13

Это макрос такой - возвращает имя текущей функции, т.е., если сделать:

void f_3(const char *s = "")
{
ShowMessage(s);
}

void f_1()
{
f_3(__FUNC__);
}

void f_2()
{
f_3(__FUNC__);
}

, то получишь то, что тебе нужно...

Добавлено через 2 мин.
Хотя можно и так:
#define Call_f3 f_3(__FUNC__)
void f_3(const char *s = "")
{
ShowMessage(s);
}

void f_1()
{
Call_f3;
}
void f_2()
{
Call_f3;
}

blum.gif

Автор: Fanat 19.02.2008 16:42

Цитата(volvo @ 19.02.2008 12:13) *

blum.gif


good.gif