Problème avec pointeur dans une structure

Problème avec pointeur dans une structure - C - Programmation

Marsh Posté le 14-02-2005 à 11:05:16    

Bonjour,
 
je suis loin d'être une bête en c. Mon prof m'a demandé d'encoder des éléments dans une structure et de les afficher. Mais il veut que l'on utilise les pointeurs et c'est la que mon programme bug.
 
Pourriez vous me dire ce qui ne va pas et pour que je puisse enfin compiler ce soft :)
 
Merci d'avance  :jap:  
 

Code :
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<conio.h>
  4. #include<string.h>
  5. void affichage(int, struct FICHE *, struct INDEX *);
  6. void encodage(int, struct FICHE *, struct INDEX *);
  7. void tri();
  8. void insertion();
  9. struct FICHE
  10. {
  11. char nom[20];
  12. int age;
  13. char info[50];
  14. };
  15. struct INDEX
  16. {
  17. char nom[20];
  18. int indice;
  19. };
  20. void encodage(int nbre_elem, struct FICHE *pt, struct INDEX *pt2)
  21. {
  22. int i,j=0;
  23. for(i=0;i<nbre_elem;i++)
  24. {
  25.  printf("------Fiche numero %d-----",i+1);
  26.  printf ("\n\nVeuillez saisir le nom: " );
  27.  fflush(stdin);
  28.  gets(pt->nom);
  29.  printf ("\nVeuillez l'age: " );
  30.  fflush(stdin);
  31.  scanf ("%d",&pt->age);
  32.  printf ("\nVeuillez saisir l'info: " );
  33.  fflush(stdin);
  34.  gets(pt->info);
  35.  pt++;
  36.  strcpy (pt2->nom,pt->nom);
  37.  pt2->indice = j++;
  38.  pt2++;
  39. }
  40. }
  41. void affichage(int nbre_elem, struct FICHE *pt, struct INDEX *pt2)
  42. {
  43. int i;
  44. for(i=0;i<nbre_elem;i++)
  45. {
  46.  printf("------Fiche numero %d-----",i+1);
  47.  printf ("\nnom: " );
  48.  puts (pt->nom);
  49.  printf ("age: %d",pt->age);
  50.  printf ("\ninfo: " );
  51.  puts (pt->info);
  52.  pt++;
  53.  printf("------Vecteur index %d-----",i+1);
  54.  printf ("\nnom: " );
  55.  puts (pt2->nom);
  56.  printf ("age: %d",pt2->indice);
  57.  pt2++;
  58. }
  59. }
  60. void tri()
  61. {
  62. }
  63. void insertion()
  64. {
  65. }
  66. void main()
  67. {
  68. struct FICHE tab[50], * pt;
  69. struct INDEX tab2[50], * pt2;
  70. int nbre_elem;
  71. pt = &tab[0];
  72. pt2 = &tab2[0];
  73. printf ("Combien de fiches voulez vous encoder? : " );
  74. scanf ("%d", &nbre_elem);
  75. encodage(nbre_elem,pt,pt2);
  76. affichage(nbre_elem,pt,pt2);
  77. }


Message édité par nolimites le 14-02-2005 à 15:10:44
Reply

Marsh Posté le 14-02-2005 à 11:05:16   

Reply

Marsh Posté le 14-02-2005 à 11:16:02    

pt = &tab[0]
 
pourquoi tu converti un pointeur sur 'struct FICHE' en 'int *' ?

Reply

Marsh Posté le 14-02-2005 à 11:17:31    

chrisbk a écrit :

pt = &tab[0]
 
pourquoi tu converti un pointeur sur 'struct FICHE' en 'int *' ?


 
 
fo faire cmt alors?

Reply

Marsh Posté le 14-02-2005 à 11:18:26    

ca doit être un malheureux copier/coller d'un bouquin sur le C :p

Reply

Marsh Posté le 14-02-2005 à 11:18:59    

nolimites a écrit :

fo faire cmt alors?


bah tu veux le faire pointer vers quoi ?

Reply

Marsh Posté le 14-02-2005 à 11:20:06    

T'as une structure de type FICHE que tu castes en int, ça risque de pas marcher effectivement ;)

Reply

Marsh Posté le 14-02-2005 à 11:20:54    


 
bin explique moi la logique qui t'a guidé quand tu as ecrit :

Code :
  1. void encodage(int nbre_elem, int *pt)
  2. {
  3. ...
  4.          scanf ("%c",pt->nom);


 
?
 
pt etant de type 'int *' il n'a evidemment pas de membre 'nom'
 
tes void encodage(int nbre_elem, int *pt) doivent devenir  void encodage(int nbre_elem, struct FICHE *pt), pour que la logique soit sauve.

Reply

Marsh Posté le 14-02-2005 à 11:21:39    

couak a écrit :

ca doit être un malheureux copier/coller d'un bouquin sur le C :p


 
 
nan pas du tout je suis l'auteur de ce début de soft. Le problème est que je souhaite faire pointer pt sur tab0 comme prévu et pour utiliser la notion de pointeur en lieu et place de tab[0],tab[1]...

Reply

Marsh Posté le 14-02-2005 à 11:24:13    

nolimites a écrit :

nan pas du tout je suis l'auteur de ce début de soft. Le problème est que je souhaite faire pointer pt sur tab0 comme prévu et pour utiliser la notion de pointeur en lieu et place de tab[0],tab[1]...


tu veux faire un pointeur sur une structure ou utiliser des pointeurs à la place de la syntaxe en tableaux ?

Reply

Marsh Posté le 14-02-2005 à 11:24:22    

pourquoi t'utilises pas un "struct FICHE *" tout simplement pour faire office de pointeur? (au lieu de passer par un int *)
 
de toutes manières, ton "int *" il va falloir que tu le castes en "struct FICHE *" quand même si tu veux accéder aux champs de ta structure... comment veux-tu sinon que le compilo devines que c'est pas un int mais un struct FICHE que tu manipules dans tes fonctions?


Message édité par the-forgotten le 14-02-2005 à 11:25:45
Reply

Marsh Posté le 14-02-2005 à 11:24:22   

Reply

Marsh Posté le 14-02-2005 à 11:26:50    

chrisbk a écrit :

bin explique moi la logique qui t'a guidé quand tu as ecrit :

Code :
  1. void encodage(int nbre_elem, int *pt)
  2. {
  3. ...
  4.          scanf ("%c",pt->nom);


 
?
 
pt etant de type 'int *' il n'a evidemment pas de membre 'nom'
 
tes void encodage(int nbre_elem, int *pt) doivent devenir  void encodage(int nbre_elem, struct FICHE *pt), pour que la logique soit sauve.


 
ca va deja mieux en faisant je passe à 2 erreurs seulement visual c++ me dis que j'ai un erreur à mes appels de fonctions (ligne 68 et 69). Voici  son message d'erreur: function : incompatible types
 
on y est presque je pense  :p

Reply

Marsh Posté le 14-02-2005 à 11:28:36    

bin si ton pt est tjs de type 'int *' y'a pas de quoi s'etonner :o

Reply

Marsh Posté le 14-02-2005 à 11:28:44    

Oui, vu que t'as déclaré ton pt en int*
 
<edit>
  <grilled by="chrisbk" />
</edit>


Message édité par FlorentG le 14-02-2005 à 11:29:49
Reply

Marsh Posté le 14-02-2005 à 11:31:17    

cf. mon premier post :o

Reply

Marsh Posté le 14-02-2005 à 11:32:50    

couak a écrit :

tu veux faire un pointeur sur une structure ou utiliser des pointeurs à la place de la syntaxe en tableaux ?


 
 
je veux simplement éviter dans mes fonctions ceci
 
tab[0]->nom
au tour de boucle suivant
tab[1]->nom
 
etc...
 
En gros juste éviter les syntaxes des tableaux

Reply

Marsh Posté le 14-02-2005 à 11:35:37    

FlorentG a écrit :

Oui, vu que t'as déclaré ton pt en int*
 
<edit>
  <grilled by="chrisbk" />
</edit>


 
 
faut le déclarer en quoi alors? Désolé pour ces questions de gros noob mais j'ai une crève pas possible et pas mal de soucis et je dois dire que j'ai pas spécialement la tête pour faire du c...
 
Qqun pourrait il gentillement me dire quoi modif pour que ca fonctionne  :jap:

Reply

Marsh Posté le 14-02-2005 à 11:37:19    

nolimites a écrit :

faut le déclarer en quoi alors? Désolé pour ces questions de gros noob mais j'ai une crève pas possible et pas mal de soucis et je dois dire que j'ai pas spécialement la tête pour faire du c...
 
Qqun pourrait il gentillement me dire quoi modif pour que ca fonctionne  :jap:


hummm relis les réponses, on te l'a dis plusieurs fois

Reply

Marsh Posté le 14-02-2005 à 11:45:18    

couak a écrit :

hummm relis les réponses, on te l'a dis plusieurs fois


 
 
voila je viens de mettre à jour mon code. Cependant la déclaration de mon pointeur est elle mauvaise car la je n'ai plus d'erreurs mais 5 warnings et mon prog plante  :cry:  
 
Ou ai je encore merdé???

Reply

Marsh Posté le 14-02-2005 à 11:46:18    

nolimites a écrit :

Ou ai je encore merdé???


les warnings te le disent :o

Reply

Marsh Posté le 14-02-2005 à 11:46:28    

ne nous dit surtout pas quelles lignes provoquent des erreurs et la nouvelle tête qu'a prit ton code
non non  
pas la peine
on va deviner tous seuls :o

Reply

Marsh Posté le 14-02-2005 à 11:51:00    

the-forgotten a écrit :

ne nous dit surtout pas quelles lignes provoquent des erreurs et la nouvelle tête qu'a prit ton code
non non  
pas la peine
on va deviner tous seuls :o


jparie qu'il a fais un truc pas propre partout où le compilo lui renvoi un warning :o

Reply

Marsh Posté le 14-02-2005 à 11:53:05    

voici les erreurs:
 
C:\Documents and Settings\Cyg@ce\Mes documents\C\Seconde annee\Dossier\lc40.c(20) : warning C4028: formal parameter 2 different from declaration
 
C:\Documents and Settings\Cyg@ce\Mes documents\C\Seconde annee\Dossier\lc40.c(42) : warning C4028: formal parameter 2 different from declaration
 
C:\Documents and Settings\Cyg@ce\Mes documents\C\Seconde annee\Dossier\lc40.c(64) : warning C4133: '=' : incompatible types - from 'struct FICHE *' to 'int *'
 
C:\Documents and Settings\Cyg@ce\Mes documents\C\Seconde annee\Dossier\lc40.c(69) : warning C4133: 'function' : incompatible types - from 'int *' to 'struct $S2 *'
 
C:\Documents and Settings\Cyg@ce\Mes documents\C\Seconde annee\Dossier\lc40.c(70) : warning C4133: 'function' : incompatible types - from 'int *' to 'struct $S1 *'
 
 
 
lc40.obj - 0 error(s), 5 warning(s)

Reply

Marsh Posté le 14-02-2005 à 11:54:15    

couak a écrit :

jparie qu'il a fais un truc pas propre partout où le compilo lui renvoi un warning :o


 
regardez plus haut le code est mis à jour dans mon post aussi et provoque les warnings ci hauts  :pfff:

Reply

Marsh Posté le 14-02-2005 à 11:55:44    

"struct *" [:el g]
 
struct FICHE * :o
 
et ton pt est toujours de type 'int *' :o c'est mal :o

Reply

Marsh Posté le 14-02-2005 à 11:57:14    

nolimites a écrit :

regardez plus haut le code est mis à jour dans mon post aussi et provoque les warnings ci hauts  :pfff:


merci d'avoir prévenu, heureusement que le post ne fait pas plusieurs pages, sinon j'aurais du relire tous les messages (chose que tu ne fais pas de tte manière)

Reply

Marsh Posté le 14-02-2005 à 12:00:51    

pt=&tab[0]
si (et ça devrait être le cas le temps que j'intervienne) l'erreur du "int *pt" est corrigée, moi j'avoue que j'ai une préférence pour "pt=tab"
mais bon, chacun son truc aprés
j'ajouterais aussi une sécurité sur nbre_elem (max 50)
et donc une jolie constante plutôt que ces hideux 50 qui se balladent tous seuls

Reply

Marsh Posté le 14-02-2005 à 12:04:29    

couak a écrit :

merci d'avoir prévenu, heureusement que le post ne fait pas plusieurs pages, sinon j'aurais du relire tous les messages (chose que tu ne fais pas de tte manière)


 
 
ne te méprend pas le  :pfff:  n'était pas detiné à toi mais au fait que j'avais tjs des erreus c tt  :non:  :jap:

Reply

Marsh Posté le 14-02-2005 à 12:06:38    

chrisbk a écrit :

"struct *" [:el g]
 
struct FICHE * :o
 
et ton pt est toujours de type 'int *' :o c'est mal :o


 
bon je sais que ca va commencer à tenir du mega boulet mais je dois le mettre de quel type???

Reply

Marsh Posté le 14-02-2005 à 12:07:42    

nolimites a écrit :

bon je sais que ca va commencer à tenir du mega boulet mais je dois le mettre de quel type???


tu as la réponse sous les yeux
dans le propre post que tu viens de quoter

Reply

Marsh Posté le 14-02-2005 à 12:13:15    

the-forgotten a écrit :

tu as la réponse sous les yeux
dans le propre post que tu viens de quoter


 
 
je suis d'accord mais pt est un pointeur, donc pour le déclarer je le déclare de type int * pt(je sais pas si c'est le bon type,pt c'est le nom et le * indique que c'est un pointeur). Cette déclaration n'est pas bonne? ok mais alors de quel type doit être mon pt?

Reply

Marsh Posté le 14-02-2005 à 12:15:42    

si tu sais vers quoi tu veux faire pointer ton pointeur, tu trouveras la réponse :)

Reply

Marsh Posté le 14-02-2005 à 12:23:30    

voila je viens de mettre à jour mon code ci-dessus, j'ai plus d'erreurs ni de warning mais j'ai droit à un beau crash du programme après la saisie de l'age :(

Reply

Marsh Posté le 14-02-2005 à 12:24:27    

nolimites a écrit :

bon je sais que ca va commencer à tenir du mega boulet mais je dois le mettre de quel type???


 
 
t'as un tableau de TRUC. Genre
TRUC machin[20];
 
tu veux un pointeur vers le premier element de truc. Donc tu veux un pointeur sur TRUC.
Donc, "TRUC *"
 
vouala

Reply

Marsh Posté le 14-02-2005 à 12:55:00    

chrisbk a écrit :

t'as un tableau de TRUC. Genre
TRUC machin[20];
 
tu veux un pointeur vers le premier element de truc. Donc tu veux un pointeur sur TRUC.
Donc, "TRUC *"
 
vouala


 
en gros dans mon code ca donne quoi? peux tu faire le modif ds mon code direct merci :)

Reply

Marsh Posté le 14-02-2005 à 13:19:59    

Le programme plante parce qu'il faut incrémenter pt dans les boucles
pt++ et pas pt + i.
vaut mieux écrire
for (i = 0; i < nbre_elem; i++, pt++)

Reply

Marsh Posté le 14-02-2005 à 13:28:49    

podone a écrit :

Le programme plante parce qu'il faut incrémenter pt dans les boucles
pt++ et pas pt + i.
vaut mieux écrire
for (i = 0; i < nbre_elem; i++, pt++)


 
ca ne change rien j'ai tjrs la même erreur cad que le prog plante après la  saisie de l'âge  :cry:

Reply

Marsh Posté le 14-02-2005 à 13:29:36    

Que se passe-t-il après 50 saisies ?
Il faut travailler en allocation dynamique.

Reply

Marsh Posté le 14-02-2005 à 13:31:36    

nolimites a écrit :

ca ne change rien j'ai tjrs la même erreur cad que le prog plante après la  saisie de l'âge  :cry:


logique
 
scanf ("%d",pt->age);
 
pas bon
 
scanf ("%d",&pt->age);
 
bon

Reply

Marsh Posté le 14-02-2005 à 13:39:17    

chrisbk a écrit :

logique
 
scanf ("%d",pt->age);
 
pas bon
 
scanf ("%d",&pt->age);
 
bon


 
 
yep ca fonctionne merci à tous vous êtes super :jap:  :jap:  :jap:  
 
Par contre pqoi la je dois mettre un & et pas aux autres???  :??:

Reply

Marsh Posté le 14-02-2005 à 14:18:20    

Une mise en forme propre
 

Code :
  1. // struct.cpp : définit le point d'entrée pour l'application console.
  2. //
  3. #include "stdafx.h"
  4. // Taille du nom
  5. #define  NAMELENGTH     20
  6. #define  NAMEENTRY      "%20s"
  7. // Taille de l'information
  8. #define  INFOLENGTH     20
  9. #define  INFOENTRY      "%20s"
  10. // Structure fiche
  11. typedef struct _FICHE
  12. {
  13.    char  szNom[NAMELENGTH + 1];  // Nom
  14.    int   nAge;                   // Age
  15.    char  szInfo[INFOLENGTH + 1]; // Information
  16. }
  17. FICHE;
  18. typedef FICHE*          LPFICHE;
  19. // Encoder les fiches
  20. void Encoder(int     A_nFiches,     // IN
  21.              LPFICHE A_lpFiches);   // OUT
  22. // Afficher les fiches
  23. void Afficher(int       A_nFiches,     // IN
  24.               LPFICHE   A_lpFiches);   // IN
  25. int _tmain(int argc, _TCHAR* argv[])
  26. {
  27. // Nombre de fiches
  28. int         nFiches;
  29. // Fiches
  30. LPFICHE     lpFiches;
  31.    // Recuperer le nombre de fiches
  32.    printf("\nVeuillez saisir le nombre de fiches : " );
  33.    scanf("%d", &nFiches);
  34.    fflush(stdin);
  35.    // Allouer la memoire pour les fiches
  36.    lpFiches = (LPFICHE) malloc(nFiches * sizeof(FICHE));
  37.    // Recuperer les fiches
  38.    Encoder(nFiches, lpFiches);
  39.    // Afficher les fiches
  40.    Afficher(nFiches, lpFiches);
  41.    // Desallouer la memoire
  42.    free(lpFiches);
  43.  
  44. return 0;
  45. }
  46. // Encoder les fiches
  47. void Encoder(int     A_nFiches,  // IN
  48.              LPFICHE A_lpFiches) // OUT
  49. {
  50. // Compteur de boucles
  51. int         i;
  52.    // POUR chaque fiche
  53.    for (i = 0; i < A_nFiches; i++, A_lpFiches++)
  54.    {
  55.       // Recuperer le nom
  56.       printf("\nVeuillez saisir le nom : " );
  57.       scanf(NAMEENTRY, A_lpFiches->szNom);
  58.       fflush(stdin);
  59.       // Recuperer l'age
  60.       printf("Veuillez saisir l'age : " );
  61.       scanf("%d", &A_lpFiches->nAge);
  62.       fflush(stdin);
  63.       // Recuperer l'information
  64.       printf("Veuillez saisir l'information : " );
  65.       scanf(INFOENTRY, A_lpFiches->szInfo);
  66.       fflush(stdin);
  67.    }
  68.    // FIN POUR
  69. } // Fin Encoder()
  70. // Afficher les fiches
  71. void Afficher(int       A_nFiches,  // IN
  72.               LPFICHE   A_lpFiches) // IN
  73. {
  74. // Compteur de boucles
  75. int         i;
  76.    // POUR chaque fiche
  77.    for (i = 0; i < A_nFiches; i++, A_lpFiches++)
  78.    {
  79.       // Afficher le nom
  80.       printf("\n\nNom : %s", A_lpFiches->szNom);
  81.       // Afficher l'age
  82.       printf("\nAge : %d", A_lpFiches->nAge);
  83.       // Afficher l'information
  84.       printf("\nInfo : %s", A_lpFiches->szInfo);
  85.    }
  86.    // FIN POUR
  87. } // Fin Afficher()

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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