Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1355 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Problème avec pointeur dans une structure

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Problème avec pointeur dans une structure

n°980758
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 11:05:16  profilanswer
 

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
mood
Publicité
Posté le 14-02-2005 à 11:05:16  profilanswer
 

n°980762
chrisbk
-
Posté le 14-02-2005 à 11:16:02  profilanswer
 

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

n°980764
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 11:17:31  profilanswer
 

chrisbk a écrit :

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


 
 
fo faire cmt alors?

n°980765
couak
Posté le 14-02-2005 à 11:18:26  profilanswer
 

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

n°980766
couak
Posté le 14-02-2005 à 11:18:59  profilanswer
 

nolimites a écrit :

fo faire cmt alors?


bah tu veux le faire pointer vers quoi ?

n°980768
FlorentG
Unité de Masse
Posté le 14-02-2005 à 11:20:06  profilanswer
 

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

n°980770
chrisbk
-
Posté le 14-02-2005 à 11:20:54  profilanswer
 


 
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.

n°980771
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 11:21:39  profilanswer
 

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]...

n°980772
couak
Posté le 14-02-2005 à 11:24:13  profilanswer
 

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 ?

n°980773
the-forgot​ten
Posté le 14-02-2005 à 11:24:22  profilanswer
 

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
mood
Publicité
Posté le 14-02-2005 à 11:24:22  profilanswer
 

n°980777
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 11:26:50  profilanswer
 

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

n°980779
chrisbk
-
Posté le 14-02-2005 à 11:28:36  profilanswer
 

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

n°980780
FlorentG
Unité de Masse
Posté le 14-02-2005 à 11:28:44  profilanswer
 

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
n°980787
the-forgot​ten
Posté le 14-02-2005 à 11:31:17  profilanswer
 

cf. mon premier post :o

n°980793
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 11:32:50  profilanswer
 

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

n°980797
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 11:35:37  profilanswer
 

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:

n°980802
couak
Posté le 14-02-2005 à 11:37:19  profilanswer
 

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

n°980821
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 11:45:18  profilanswer
 

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é???

n°980826
couak
Posté le 14-02-2005 à 11:46:18  profilanswer
 

nolimites a écrit :

Ou ai je encore merdé???


les warnings te le disent :o

n°980827
the-forgot​ten
Posté le 14-02-2005 à 11:46:28  profilanswer
 

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

n°980837
couak
Posté le 14-02-2005 à 11:51:00  profilanswer
 

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

n°980843
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 11:53:05  profilanswer
 

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)

n°980844
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 11:54:15  profilanswer
 

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:

n°980845
chrisbk
-
Posté le 14-02-2005 à 11:55:44  profilanswer
 

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

n°980848
couak
Posté le 14-02-2005 à 11:57:14  profilanswer
 

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)

n°980855
the-forgot​ten
Posté le 14-02-2005 à 12:00:51  profilanswer
 

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

n°980859
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 12:04:29  profilanswer
 

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:

n°980860
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 12:06:38  profilanswer
 

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???

n°980862
the-forgot​ten
Posté le 14-02-2005 à 12:07:42  profilanswer
 

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

n°980867
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 12:13:15  profilanswer
 

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?

n°980873
couak
Posté le 14-02-2005 à 12:15:42  profilanswer
 

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

n°980888
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 12:23:30  profilanswer
 

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 :(

n°980890
chrisbk
-
Posté le 14-02-2005 à 12:24:27  profilanswer
 

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

n°980926
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 12:55:00  profilanswer
 

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 :)

n°980937
podone
Posté le 14-02-2005 à 13:19:59  profilanswer
 

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++)

n°980943
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 13:28:49  profilanswer
 

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:

n°980944
podone
Posté le 14-02-2005 à 13:29:36  profilanswer
 

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

n°980946
chrisbk
-
Posté le 14-02-2005 à 13:31:36  profilanswer
 

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

n°980953
nolimites
Z'avez pas vu Mirza?
Posté le 14-02-2005 à 13:39:17  profilanswer
 

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???  :??:

n°981002
podone
Posté le 14-02-2005 à 14:18:20  profilanswer
 

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()

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Problème avec pointeur dans une structure

 

Sujets relatifs
problème après compilation...Probleme avec structure
Problème XHTML/CSSProblème texte dynamique
Problème de typage de pointeur de pointeur[J2ME] probleme de code réseau
[php] Probleme de conception - sessions/cookie&coEst-il possible de positionner automatiquement le pointeur de souris ?
[C] probleme structure et pointeur 
Plus de sujets relatifs à : Problème avec pointeur dans une structure


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR