2010-06-21 3 views
1

Je suis Tring pour définir jmp_buf comme pointeur et l'utiliser dans longjmp imbriquée (s) .Comme suivre:indiquant jmp_buf comme pointeur

... 
jmp_buf *bfj; 
... 

puis écrit si d'autre:

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

et un autre endroit en utilisant le BFJ stocké à longjmp

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

où DS [TOP] .int_val est où je stockées. comme cela peut sembler clair, je veux faire gotos imbriqués et retourne en utilisant bfj stocké. mais bien quand j'essaie de déboguer je reçois "exception non distribuée". J'obtiens ceci au point de départ:

if(setjmp(*bfj) == 0) 

Je serais heureux si quelqu'un dirait la solution.

+6

On vous l'a dit (http://stackoverflow.com/questions/3087268/question-with-longjmp) que ce que vous essayez de faire n'est pas une bonne idée. Si vous ne tenez pas compte des conseils, que demandez-vous? – sbi

+0

Je sais que ce n'est pas une bonne idée d'utiliser longjmps mais quand vous essayez d'écrire un code proche du langage assembleur pour la sortie de la phase sémantique d'un compilateur, c'est la seule solution qui me vient à l'esprit. que j'écris, c'est le chemin et oui ce n'est pas le bon moyen. Je dois produire du code qui soit proche de l'assemblage, (code trois adresses). Je n'utilise jamais goto ou longjmp pour les programmes standards mais dans ce cas, je dois produire un tel code. c'est le naturel des compilateurs. – angela

+4

Non, ce n'est pas le "naturel des compilateurs". Un compilateur n'est pas différent de tout autre programme: tout ce qu'il fait est de traduire une sorte d'entrée à un type de sortie. Le fait que vous pensez que vous devez utiliser 'longjmp' (et que vous ne comprenez pas clairement ce que ça fait ou comment cela fonctionne) suggère que vous faites quelque chose de très mal. – greyfade

Répondre

2

De votre code, vous n'allouez pas de mémoire pour votre jmp_buf. Il y a quelques choses que vous pouvez faire:

  1. allouent Dynamiquement votre jmp_buf avec new et vous voulez delete quand vous avez fini avec elle
  2. Mettre le jmp_buf sur la pile jmp_buf bfj; et quand vous voulez il est pointeur, vous prendriez son adresse avec &bfj.

Alors, # 1 ressemblerait à ceci:

jmp_buf *bfj = new jmp_buf; 
... 

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

alors que # 2 ressemblerait à ceci:

jmp_buf bfj; 
... 

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

Un autre problème potentiel est que vous ne devriez jamais jeter un pointeur sur un int comme un pointeur peut prendre plus de mémoire qu'un int (cela arrive sur les modèles de programmation 64 bits courants). Si vous ne pouvez pas stocker le pointeur directement, vous devez utiliser intptr_t à la place.

+0

vraiment merci pour votre réponse. Mais je reçois l'erreur ne peut pas convertir de 'int *' en jmp_buf. que devrais-je faire? – angela

+0

@angela - avez-vous utilisé 'int *' au lieu de 'intptr_t' (ils ne sont pas identiques). –

+0

merci (vous aviez raison) mais il semble que longjmp ne revienne pas à setjmp.but ailleurs. Est-il nécessaire de montrer mon code? – angela

Questions connexes