указание jmp_buf как указателя

Я пытаюсь определить jmp_buf как указатель и использовать его во вложенных longjmp (s), как показано ниже:

 ...
jmp_buf *bfj;
...

а затем написать if else:

if( setjmp(*bfj) == 0){
DS[SP-2].int_val=(int)bfj;;
//to store the bfj
}else {}

и где-то еще, используя сохраненный bfj в longjmp

 bfj = (jmp_buf *)DS[TOP].int_val;
 longjmp(*bfj,1);

где DS [TOP] .int_val - это место, где я его сохранил. как это может показаться ясным, я хочу делать вложенные gotos и возвращать, используя сохраненный bfj. но хорошо, когда я пытаюсь отладить, я получаю «необработанное исключение». Я получаю это с самого начала:

if( setjmp(*bfj) == 0)

Буду рад, если кто-нибудь подскажет решение.


person angela    schedule 21.06.2010    source источник
comment
Вам сказали, что то, что вы пытаетесь сделать, не является хорошей идеей. Если вы не прислушиваетесь к совету, о чем вы просите?   -  person sbi    schedule 22.06.2010
comment
Я знаю, что использовать longjmps - не лучшая идея, но когда вы пытаетесь написать код, близкий к языку ассемблера для вывода семантической фазы компилятора, это единственное решение, которое приходит мне в голову. Поэтому для случая, когда Я пишу, это способ и да, это не лучший способ. Я должен создать код, близкий к сборке (трехадресный код). Я никогда не использую goto или longjmp для обычных программ, но в этом случае я должен создать такой код. это естественно для компиляторов.   -  person angela    schedule 22.06.2010
comment
Нет, это не свойственно компиляторам. Компилятор ничем не отличается от любой другой программы: все, что он делает, это переводит какой-то ввод в какой-то вывод. Тот факт, что вы думаете, что вам нужно использовать longjmp (и что вы явно не понимаете, что он делает или как работает), предполагает, что вы делаете что-то очень неправильно.   -  person greyfade    schedule 22.06.2010
comment
Я понял это. Я сказал, что третья фаза компилятора --- ›курс компилятора в университете, а не те обычные и простые компиляторы, как вы думаете. компилятор для Fortran оценил трудозатраты в 18 человеко-лет! Это не так просто, как вы думаете. (Обычное определение компиляторов)   -  person angela    schedule 22.06.2010
comment
Я думаю, будет справедливой оценкой сказать, что разница между двумя последними компиляторами Microsoft C ++ составляет 18 человеко-лет усилий! Но грейфейд прав: даже сложный компилятор просто преобразует структуры данных.   -  person MSalters    schedule 22.06.2010
comment
Думаю, вы не видите в университете курса компилятора и, кажется, не знаете, что такое трехадресный код.   -  person angela    schedule 23.06.2010


Ответы (1)


Из вашего кода вы фактически не выделяете память для своего jmp_buf. Вы можете сделать следующее:

  1. Динамически выделяйте свой jmp_buf с помощью new, и вы захотите delete, когда закончите с ним
  2. Поместите jmp_buf в стек jmp_buf bfj;, и когда вам понадобится указатель, вы возьмете его адрес с помощью &bfj.

Итак, №1 будет выглядеть так:

jmp_buf *bfj = new jmp_buf;
...

if( setjmp(*bfj) == 0){
DS[SP-2].int_val=(intptr_t)bfj;

а №2 будет выглядеть так:

jmp_buf bfj;
...

if( setjmp(bfj) == 0){
DS[SP-2].int_val=(intptr_t)&bfj;

Другая потенциальная проблема заключается в том, что вы никогда не должны приводить указатель к int, поскольку указатель может занимать больше памяти, чем int (это происходит в обычных 64-битных моделях программирования). Если вы не можете сохранить указатель напрямую, вы должны использовать вместо этого intptr_t.

person R Samuel Klatchko    schedule 21.06.2010
comment
действительно спасибо за ваш ответ. но я получаю сообщение об ошибке не могу преобразовать из int * в jmp_buf. что я должен делать? - person angela; 22.06.2010
comment
@angela - вы использовали int * вместо intptr_t (они не совпадают). - person R Samuel Klatchko; 22.06.2010
comment
спасибо! (вы были правы) но похоже, что longjmp не возвращается к setjmp. а где-то еще. нужно ли показывать мой код? - person angela; 22.06.2010
comment
ну, я отследил код, и он показал, что он в цикле! это не заканчивается. - person angela; 22.06.2010