addition affectation...

addition affectation... - C++ - Programmation

Marsh Posté le 15-05-2003 à 20:02:59    


long ad_suiv = 0;
long taille_reserv = 4;
 
 
pointeur_e->ad_dans_zone = ad_suiv ;
 
ad_suiv = (E.ad_dans_zone + taille_reserv) ;
 
fprintf (stderr, "%d, %d, %d\n", ad_suiv, E.ad_dans_zone, taille_reserv);
 
le fprintf me rend
0, 0, 4
 
ou est le probleme dans mon addition?


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 20:02:59   

Reply

Marsh Posté le 15-05-2003 à 20:07:47    

qu'est ce que tu veux qu'on en sache ?
 
on sait pas c koi E.ad_dans_zone , ni ce qu'il y a dedans, donc moi je dis qu'elle marche tres bien ton addition :O


Message édité par chrisbk le 15-05-2003 à 20:08:52
Reply

Marsh Posté le 15-05-2003 à 20:17:44    

ad_dans_zone c est un champ d une structure E
un long


Message édité par theorie du chaos le 15-05-2003 à 20:18:16

---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 20:18:51    

depuis quand 0 = 0 + 4 ?


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 20:20:12    

Theorie du chaos a écrit :

depuis quand 0 = 0 + 4 ?


 
oué je viens de reussir a demeler ca de ton code (tain les noms de variable ca rigole pas chez toi :D)
 
c vrai que c chelou [:meganne]

Reply

Marsh Posté le 15-05-2003 à 20:22:26    

j ai ma soutenance demain...
mes deux binomes sont partis...
y en a un qui viendra pas a l oral...
 
 
et ce prog de merde ne veut rien me modifier :mad:


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 20:24:33    

probleme arrange finalement...
 
tuez moi svp :'(


Message édité par theorie du chaos le 15-05-2003 à 20:24:55

---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 20:30:10    

Theorie du chaos a écrit :

probleme arrange finalement...
 
tuez moi svp :'(


 
une preference ?

Reply

Marsh Posté le 15-05-2003 à 20:36:53    

mes champs sont modifies
 
un truc qui fait pas mal :/


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 20:46:07    

Theorie du chaos a écrit :


long ad_suiv = 0;
long taille_reserv = 4;
 
 
pointeur_e->ad_dans_zone = ad_suiv ;
 
ad_suiv = (E.ad_dans_zone + taille_reserv) ;
 
fprintf (stderr, "%d, %d, %d\n", ad_suiv, E.ad_dans_zone, taille_reserv);
 
le fprintf me rend
0, 0, 4
 
ou est le probleme dans mon addition?


Si c'est %d, il est possible que ca prenne pas le long mais un int. Dans ce cas ca dépend sur combien d'octets est codé le int par rapport au long...
 
Mais je pense que tu as un système 32 bits.


Message édité par Poireau le 15-05-2003 à 20:49:46
Reply

Marsh Posté le 15-05-2003 à 20:46:07   

Reply

Marsh Posté le 15-05-2003 à 21:04:16    

merci le probleme est regle...
c etait beaucoup plus bete que ca...
une parenthese fermee trop tot :/
 
par contre la j ai un autre probleme...
je modifie des champs d une structure  
je les affiche avec printf - ils sont bons...
 
je les utilise dans un autre sous programme... ils sont faux :sweat:


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 21:10:51    

Code :
  1. static void   CalculAdrEtZones  (Elem *LeProg, int nbLigneLog) {
  2. long ad_suiv   ;
  3. int pres_align = 0 ;
  4. int  i ;
  5. int  cst_align ;
  6. int reste ;
  7. NomZone zone_courante = Z_TEXT;
  8. long taille_reserv ;
  9. ad_suiv = 0 ;
  10. for (i = 0; i< nbLigneLog; i++) {
  11.  Elem   E = LeProg [i] ;
  12.  Elem  *p_e = &E ;
  13.  LigneLog L = LeProg[i].ligne  ;
  14.  switch (L.nat) {
  15.   case LL_NONE  :
  16.    p_e->zone_cour = zone_courante ;
  17.    p_e->ad_dans_zone = ad_suiv ;
  18.    break ;
  19.   case LL_ETIQ  :
  20.    p_e->ad_dans_zone = ad_suiv ;
  21.    p_e->zone_cour = zone_courante ;
  22.    fprintf (stderr, "zone cour etiq %d\n", E.zone_cour) ;
  23.    break ;
  24.   case LL_INST  :
  25.    /* coder ad_dans_zone */
  26.    p_e->zone_cour = zone_courante ;
  27.    p_e->ad_dans_zone = ad_suiv ;
  28.    p_e->nb_bits = Construire_Code (&E, E, LeProg) ;
  29.    ad_suiv = E.ad_dans_zone + E.nb_bits ;
  30.    break ;
  31.   case LL_SECT  :
  32.    /* initialise ad_suiv change la zone courante */
  33.    zone_courante = L.u.sect;
  34.    ad_suiv = 0 ;
  35.    break ;
  36.   case LL_RESERV  :
  37.    /* verification qu on est en zone bss */
  38.    if (!(zone_courante == Z_BSS))
  39.       ErreurContext (SKIP, E) ;
  40.    p_e->zone_cour = zone_courante ;
  41.    /* modifier adresse suivante */
  42.    p_e->ad_dans_zone = ad_suiv ;
  43.    ad_suiv = E.ad_dans_zone + L.u.urni.taille ;
  44.   case LL_GLOBL  :
  45.    p_e->zone_cour = zone_courante ;
  46.    break ;
  47.   case LL_RESERV_INIT :
  48.    /* coder ad_dans_zone */
  49.    if (!(zone_courante == Z_DATA))
  50.       ErreurContext (DATA, E) ;
  51.    p_e->zone_cour = zone_courante ;
  52.    fprintf (stderr, "zone cour data %d\n", E.zone_cour) ;
  53.    p_e->ad_dans_zone = ad_suiv ;
  54.    switch (L.u.urni.dir) {
  55.    case R_ASCII:
  56.     taille_reserv = strlen (L.u.uri.p0.u.chaine) ;
  57.     break ;
  58.    case R_LONG :
  59.     taille_reserv = 4 ;
  60.     break ;
  61.    case R_HALF :
  62.     taille_reserv = 2 ;
  63.     break ;
  64.    case R_BYTE :
  65.     taille_reserv = 1 ;
  66.     break ;
  67.    case R_STRING :
  68.     taille_reserv = strlen (L.u.uri.p0.u.chaine) ;
  69.     break ;
  70.    default: printf ("C est quoi cette reservation?" ) ;
  71.    break ;
  72.    }
  73.    ad_suiv = (E.ad_dans_zone + taille_reserv) ;
  74.    fprintf (stderr, "%d, %d, %d\n", ad_suiv, E.ad_dans_zone, taille_reserv);
  75.    break ;
  76.   case LL_ALIGN  :
  77.    /* modifie toutes les adresses */
  78.    p_e->zone_cour = zone_courante ;
  79.    pres_align = 1 ;
  80.    cst_align = L.u.align ;
  81.    break ;
  82.  }
  83.  if (pres_align) {
  84.   reste =  (ad_suiv % cst_align) ;
  85.    if (reste != 0)
  86.     ad_suiv = ad_suiv + cst_align - reste ;
  87.  }
  88. }
  89. }
  90. La j ai un prog qui modifie mes champs
  91. adr_dans_zone et zone_cour...
  92. et apres...
  93. quand je veux donner les valeurs precedentes a mon pointeur...
  94. 000000000000000000000000000000000000000000000000000000000000000000000000
  95. int pasdanslist(Elem E, int est_global){
  96.   symb *le_pointeur;
  97.   le_pointeur = ma_table;
  98.  
  99.   le_pointeur->line = E.nl_source;
  100.   le_pointeur->adr = E.ad_dans_zone;
  101.   fprintf (stderr, "%d", E.zone_cour) ;
  102.   le_pointeur->type = Correspondance(E.zone_cour) ;
  103.   le_pointeur->next = NULL;
  104.       }
  105. }


Message édité par theorie du chaos le 15-05-2003 à 21:14:29

---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 21:11:03    

Theorie du chaos a écrit :

merci le probleme est regle...
c etait beaucoup plus bete que ca...
une parenthese fermee trop tot :/
 
par contre la j ai un autre probleme...
je modifie des champs d une structure  
je les affiche avec printf - ils sont bons...
 
je les utilise dans un autre sous programme... ils sont faux :sweat:


Le mieux serait d'afficher du code, et pas des morçeaux de code...
 
Oops :ange: Par contre utilise les balises de highlight syntax C/C++ prévu à cet effet !


Message édité par Poireau le 15-05-2003 à 21:13:06
Reply

Marsh Posté le 15-05-2003 à 21:13:04    

enfin c aussi que des morceaux :/


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 21:13:41    

je voudrais pas que les autres trinomes de mon ecole viennent pomper un code qui ne marche pas :o


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 21:17:45    

un break manquant :/
nan finalement c t pas ca...


Message édité par theorie du chaos le 15-05-2003 à 21:26:29

---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 21:40:00    

Des que je sors de CalculAdrEtZone
mes champs ad_dans_zone et zone_cour passent a zero...
 
comment faire pour que leur modification soit externe a CalculAdrEtZone ?


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 15-05-2003 à 21:52:18    

Theorie du chaos a écrit :

Des que je sors de CalculAdrEtZone
mes champs ad_dans_zone et zone_cour passent a zero...
 
comment faire pour que leur modification soit externe a CalculAdrEtZone ?


Tes morçeaux de code ne sont pas très lisibles, et regorge d'effet de bords...
 
Pour ton problème, je dirais au hazard que c'est parce que tu utilise des variables locales à la fonction (c'est à dire qu'ils sont dans la pile d'appel je crois). Ainsi, ces espaces mémoire sont invalides à la sortie de la fonction. Ton seul recours est d'utilisés des paramètres (pour éviter les effets de bord). Ou bien d'utiliser le tas avec une allocation dynamique (malloc).

Reply

Marsh Posté le 16-05-2003 à 08:16:59    

Code :
  1. /* ---------------------------------------------------------------------
  2. * CalculAdrEtZones
  3. * - Parcours des lignes logiques pour calculer les adresses.
  4. * Stockage dans les champs additionnels de la structure Elem.
  5. * ---------------------------------------------------------------------
  6. */
  7. static  void   CalculAdrEtZones  (Elem *LeProg, int nbLigneLog) {
  8. long ad_suiv   ;
  9. int pres_align = 0 ;
  10. int  i ;
  11. int  cst_align ;
  12. int reste ;
  13. NomZone zone_courante = Z_TEXT;
  14. Elem   E;
  15. Elem  *p_e;
  16. LigneLog L;
  17. ad_suiv = 0 ;
  18. for (i = 0; i< nbLigneLog; i++) {
  19.  E = LeProg [i] ;
  20.  p_e = &E ;
  21.  L = LeProg[i].ligne  ;
  22.  switch (L.nat) {
  23.   case LL_NONE  :
  24.    p_e->zone_cour = zone_courante ;
  25.    p_e->ad_dans_zone = ad_suiv ;
  26.    p_e->nb_bits = 0 ;
  27.    break ;
  28.   case LL_ETIQ  :
  29.    p_e->ad_dans_zone = ad_suiv ;
  30.    p_e->zone_cour = zone_courante ;
  31.    p_e->nb_bits = 0 ;
  32.    fprintf (stderr, "zone cour etiq %d\n", p_e->zone_cour) ;
  33.    break ;
  34.   case LL_INST  :
  35.    /* coder ad_dans_zone */
  36.    p_e->zone_cour = zone_courante ;
  37.    p_e->ad_dans_zone = ad_suiv ;
  38.    p_e->nb_bits = Construire_Code (&E, E, LeProg) ;
  39.    ad_suiv = E.ad_dans_zone + E.nb_bits ;
  40.    break ;
  41.   case LL_SECT  :
  42.    /* initialise ad_suiv change la zone courante */
  43.    zone_courante = L.u.sect;
  44.    p_e->ad_dans_zone = ad_suiv ;
  45.    ad_suiv = 0 ;
  46.    break ;
  47.   case LL_RESERV  :
  48.    /* verification qu on est en zone bss */
  49.    if (!(zone_courante == Z_BSS))
  50.       ErreurContext (SKIP, E) ;
  51.    p_e->nb_bits = L.u.urni.taille ;
  52.    p_e->zone_cour = zone_courante ;
  53.    /* modifier adresse suivante */
  54.    p_e->ad_dans_zone = ad_suiv ;
  55.    ad_suiv = E.ad_dans_zone + E.nb_bits ;
  56.    break ;
  57.   case LL_GLOBL  :
  58.    p_e->zone_cour = zone_courante ;
  59.    p_e->nb_bits = 0;
  60.    p_e->ad_dans_zone = ad_suiv ;
  61.    break ;
  62.   case LL_RESERV_INIT :
  63.    /* coder ad_dans_zone */
  64.    if (!(zone_courante == Z_DATA))
  65.       ErreurContext (DATA, E) ;
  66.    p_e->zone_cour = zone_courante ;
  67.    fprintf (stderr, "zone cour data %d\n", E.zone_cour) ;
  68.    p_e->ad_dans_zone = ad_suiv ;
  69.    switch (L.u.urni.dir) {
  70.    case R_ASCII:
  71.     p_e->nb_bits = strlen (L.u.uri.p0.u.chaine) ;
  72.     break ;
  73.    case R_LONG :
  74.     p_e->nb_bits = 4 ;
  75.     break ;
  76.    case R_HALF :
  77.     p_e->nb_bits = 2 ;
  78.     break ;
  79.    case R_BYTE :
  80.     p_e->nb_bits = 1 ;
  81.     break ;
  82.    case R_STRING :
  83.     p_e->nb_bits = strlen (L.u.uri.p0.u.chaine) ;
  84.     break ;
  85.    default: printf ("C est quoi cette reservation?" ) ;
  86.    break ;
  87.    }
  88.    ad_suiv = (E.ad_dans_zone + E.nb_bits) ;
  89.    fprintf (stderr, "%d, %d, %d\n", ad_suiv, E.ad_dans_zone, E.nb_bits);
  90.    break ;
  91.   case LL_ALIGN  :
  92.    /* modifie toutes les adresses */
  93.    p_e->zone_cour = zone_courante ;
  94.    pres_align = 1 ;
  95.    cst_align = L.u.align ;
  96.    break ;
  97.  }
  98.  if (pres_align) {
  99.   reste =  (ad_suiv % cst_align) ;
  100.    if (reste != 0)
  101.     ad_suiv = ad_suiv + cst_align - reste ;
  102.  }
  103. }
  104. }
  105. et si je declare comme ca, ca change quelque chose?


Message édité par theorie du chaos le 16-05-2003 à 08:17:43

---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 16-05-2003 à 08:42:50    

void Remplir_Champs (Elem *p_e, int ad_suiv, NomZone zone_courante, int nombre) {
 
 p_e->zone_cour = zone_courante ;
 p_e->ad_dans_zone = ad_suiv ;
 p_e->nb_bits = nombre ;
}
 
 
j ai fait un truc a part en prenant le pointeur en parametre
et ca marche tjrs pas...


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 16-05-2003 à 08:43:39    

c est quoi la syntaxe pour faire des malloc  la dedans
ce que je voulais faire a ete refuse...


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 16-05-2003 à 15:12:59    

bon...
 
adieu :D :hello:


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed