[Langage C] td3, exercice8

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu [Langage C] td3, exercice8

Message  jabberwok le Dim 23 Oct 2011, 17:29

Bonjour/Bonsoir,

Mon problème concerne le 4 ème test (getOneUnionInfo), je récupère l'adresse et le type, et tant que je reçois une adresse, j'affiche ce que j'ai reçu en fonction du type qui a été modifiée par l'appel de la fonction.

const UnionInfo * getOneUnionInfo ( TYPE * type );
retourne l'adresse d'une UnionInfo différente à chaque appel et met à
l'adresse passée en argument le TYPE de l'information. La fonction retourne
NULL quand elle n'a plus d'information à donner

mon bout de code :
Code:
TYPE * type = NULL;
   const UnionInfo * ptrUnionInfo = getOneUnionInfo(type);

   /* getOneUnionInfo */

   while (ptrUnionInfo != NULL){
      switch(*type){
      case T_DATE : printf("Date\n");printDate(ptrUnionInfo->date, VRAI); break;
      case T_UINT : printf("UINT\n"); printf("%d\n", ptrUnionInfo->uint); break;
      case T_DATEINT : printf("DATE INT\n"); printDate(ptrUnionInfo->di.date, VRAI); printf("delai %d: ", ptrUnionInfo->di.delai); break;
      }
      ptrUnionInfo = getOneUnionInfo(type);
   }

Ca compile, mais crash à l'exécution, quelqu'un pourrait m'indiquer mon erreur svp ?

ps : trouvé ^^', pour ceux qui ont pu avoir le même problème, il suffit de modifier le pointeur type par une simple variable.

jabberwok

Nombre de messages : 90
Prénom : ali
Statut : Gediplomeerd =)
Date d'inscription : 27/09/2010

Revenir en haut Aller en bas

resolu Re: [Langage C] td3, exercice8

Message  smb le Dim 23 Oct 2011, 18:19

Apparemment tu ne comprends pas encore bien les pointeurs Jabberwok.
Ton explication n'est en tout cas pas convaincante et même si "ça marche" comme tu dis, tu risques sans bien comprendre ce que tu fais, retrouver plus tard un problème similaire !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [Langage C] td3, exercice8

Message  jabberwok le Dim 23 Oct 2011, 19:49

Pourriez vous être plus précis ?

jabberwok

Nombre de messages : 90
Prénom : ali
Statut : Gediplomeerd =)
Date d'inscription : 27/09/2010

Revenir en haut Aller en bas

resolu Re: [Langage C] td3, exercice8

Message  nvs le Dim 23 Oct 2011, 20:41

il me semble que stéphan monbaliu est très clair.

pour ce qui me concerne : la manière dont tu présentes la solution que tu as trouvée à ton problème tient de la magie :
jabberwok a écrit:il suffit de modifier le pointeur type par une simple variable
rien ne laisse penser que :
  • tu as saisi pourquoi ton ancien code explosait à l'exécution ;
  • tu sois certain que ta solution est correcte et non une simple rustine ;
  • dans le cas où ta solution est la bonne, pourquoi l'est-elle.

évidemment, cela n'est que l'impression que me donne ton ps Smile







jocolor

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [Langage C] td3, exercice8

Message  galaeron le Lun 24 Oct 2011, 10:28

Si je peux me permettre de "compléter" les explications déjà fournies.
Il ne faut pas confondre adresses, pointeurs, et valeurs ...

Petit rappel :

Une variable est déterminée par 2 choses : son type et son adresse.
Sur cette image nous observons donc 3 variables :

  1. pi1 (pointeur d'int et d'adresse 23440)
  2. j (int et d'adresse 23443)
  3. i (int et d'adresse 23444)

Revenons à l’énoncé :
retourne l'adresse d'une UnionInfo différente à chaque appel et met à
l'adresse
passée en argument le TYPE de l'information
La différence entre les deux réside en les mots « retourne » et « met ».

  1. La valeur de retour :
    Si nous faisons l’analogie avec l’image la valeur de retour est 23443
    Comment stocker une adresse pour pouvoir accéder par la suite au contenu de la variable pointer par cette adresse?
    const UnionInfo * ptrUnionInfo = getOneUnionInfo(????) équivaut donc à déclarer j et à lui assigner comme valeur 23443 exactement ce que l’on veut.
  2. Le paramètre :
    Si on reprends le schéma cela veut dire que la fonction nécessite une Adresse et donc par conséquent il faut lui passer 23444.
    Pratiquement cela veut dire qu’on a besoin d’une variable de type « TYPE »
    Type type =0 ;
    &type permettra d’avoir accès à l’adresse 23444

J'ai essayé d'être le plus clair possible mais par écrit c'est relativement compliqué.

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

resolu Re: [Langage C] td3, exercice8

Message  smb le Lun 24 Oct 2011, 12:55

Je crois qu'il y a encore moyen d'être plus précis.

Je prends en exemple l'appel à la fonction getOneInfo dont le prototype est le suivant :
Code:

const void * getOneInfo ( TYPE * type ) ;
Cas 1 : appel le plus simple :
Code:

const void * p ;
TYPE type;
...
p = getOneInfo( &type );
Dans ce cas on donne directement comme argument lors de l'appel une adresse, car &type est une adresse (constante d'ailleurs).


Cas 2 : en utilisant un pointeur vers un TYPE :
Code:

const void * p ;
TYPE type;
TYPE * pType = &type ;
...
p = getOneInfo( pType );
Ici, on donne en argument lors de l'appel un nom de variable de type "pointeur". C'est le contenu de la variable qui est mis sur la pile lors de l'appel.

Cas 3 : autre utilisation d'un pointeur vers un TYPE :
Code:

const void * p ;
TYPE * pType = malloc ( sizeof(TYPE) ) ;
...
p = getOneInfo( pType );
Ici aussi on donne en argument un nom de variable de type "pointeur". C'est le contenu de la variable qui est mis sur la pile lors de l'appel. Mais dans ce cas, ce que certains étudiants oublient c'est l'allocation dynamique, ce qui provoque les erreurs classiques suivantes.

Erreur classique 1 :
Code:

const void * p ;
TYPE * pType ;
...
p = getOneInfo( pType );
La fonction va ranger un TYPE à l'adresse contenue dans pType, c'est-à-dire à une adresse inconnue puisque pType n'est pas initialisé ! Parfois ça passe, souvent non (boom !).

Erreur classique 2 :
Code:

const void * p ;
TYPE * pType = NULL ;
...
p = getOneInfo( pType );
La fonction va ranger un TYPE à l'adresse contenue dans pType, c'est-à-dire à l'adresse absolue 0 en mémoire ! Et ça ce n'est pas permis, donc -> boom !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [Langage C] td3, exercice8

Message  jabberwok le Lun 24 Oct 2011, 20:31

Merci à vous pour vos explications !

(Je pense saisir un peu mieux la manière dont il faut utiliser les pointeurs).

Bonne Journée/Soirée !

jabberwok

Nombre de messages : 90
Prénom : ali
Statut : Gediplomeerd =)
Date d'inscription : 27/09/2010

Revenir en haut Aller en bas

resolu Re: [Langage C] td3, exercice8

Message  Contenu sponsorisé Aujourd'hui à 14:30


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum