Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programme de C avec des pointeurs

ça plante

    28 novembre 2005 à 21:48:57

    Bonjour, dites moi ce qui ne va pas dans mon programme ?Car je ne vois pas, quand je l'execute il plante apres avoir entré le nom et age supplémentaire.
    [code]#include<stdio.h>
    #include<stdlib.h>

    typedef struct individu {
    char nom[20];
    int age;
    struct individu * suiv;
    } individu;

    int main()
    {
    individu * l, * q, * t;
    l = (individu *)malloc(sizeof(individu));
    printf("Entrer un nom :");
    scanf("%s", l->nom);
    printf("\nSon age : ");
    scanf("%d", &l->age);
    l->suiv = NULL;

    q = (individu *)malloc(sizeof(individu));
    l->suiv = q;
    printf("\nEntrer un autre individu :");
    scanf("%s", q->nom);
    printf("\nEntrer son age :");
    scanf("%d", &q->age);
    q->suiv = NULL;
    t = l;
    t = (individu *)malloc(sizeof(individu));
    while (t->suiv != NULL) {
    printf("%d", t->age);
    t = t->suiv;
    }

    system("PAUSE");
    return 0;
    }


    [/code]
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      28 novembre 2005 à 21:55:19

      Bon déja quelques remarques : scanf("%d", l->age); sans le & devant le l, de même pour le q, ensuite ta variable suiv dans la struct est à NULL dans toutes les parties. Corriges ça, indentes mieux le code et reviens si t'as encore des erreurs (en les précisant clairement).

      ;)
      • Partager sur Facebook
      • Partager sur Twitter
        28 novembre 2005 à 21:57:50

        mais ne doit-on ne pas mettre & quand ce sont des char ?
        Je comprends pas ta remarque sur le suiv ?
        Le suiv il point bien sur le prochaine maillon, c ca ?
        donc quand je fais l->suiv = q; la case suiv contenu dans la structure l va contenir l'adresse de q, c'est bien ca ?
        • Partager sur Facebook
        • Partager sur Twitter
          28 novembre 2005 à 22:09:16

          Salut,

          tu veux faire quoi en fait car je trouve ton code un peu bizarre. C'est quoi le but de ce programme ?

          Et pour remarque, une chaine de caractère étant une adresse, il ne faut pas que tu tapes le & dans le scanf. Effectivement, le scanf attend une adresse => &nombre renvoye l'adresse de la variable nombre (si nombre est int hein) par contre chaine (char chaine[50];) renvoie l'adresse du premier élément du tableau, donc pas besoin de &.
          • Partager sur Facebook
          • Partager sur Twitter
            28 novembre 2005 à 22:10:00

            le but du programme est d'ajouter un maillon à droite du premier.(c'est parce que c'est le debut d'un programme pour ajouter plusieurs nom à la suite etc.C'est ce qu'on nous demande de faire à l'école, mais ils expliquent tellement bien...)
            • Partager sur Facebook
            • Partager sur Twitter
              28 novembre 2005 à 22:24:09

              Je ne suis pas vraiment sur que ce que je vais te donner fera ce que tu es censé faire mais bon, cela ne pourrait pas fonctionner ? :

              #include "stdafx.h"
              #include "stdio.h"
              #include "stdlib.h"
              #include "conio.h"

              typedef struct individu {

                 char nom[20];
                 int age;

              };

              main(){
                     
                 struct individu *t;
                 int x;

                 t = (individu*) malloc(sizeof(individu)*2);

                 for (x = 0; x < 2; x++) {

                    printf ("nom :");
                    scanf ("%s", (t+x)->nom);
                    printf ("age : ");
                    scanf ("%d", &(t+x)->age);

                 }

                 for (x = 0; x < 2; x++) {

                    printf ("\nnom : %s", (t+x)->nom);
                    printf ("\nage : %d", (t+x)->age);

                 }

                 getch();
              }


              A toi de voir ce que ca donne et savoir si ca donne/fait bien ce que tu veux mais chez moi, ca a l'air de fonctionner.
              • Partager sur Facebook
              • Partager sur Twitter
                28 novembre 2005 à 22:31:52

                ce qui est demandé c'est d'avoir une liste chainée, donc c'est pas tout à fait ça.
                • Partager sur Facebook
                • Partager sur Twitter
                  28 novembre 2005 à 22:34:48

                  Espèce de gros malade, essaie déjà de poser sur papier le principe des listes chainées sinon tu t'en sortiras pas.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 novembre 2005 à 22:38:14

                    C'est bon j'ai trouvé, juste que j'allouais la mémoire pour t après avoir dit que t = l , d'où plantage.


                    J'ai un nouveau soucis. Ce programme fonctionne si je ne mets pas q = q->suiv;
                    q = (individu *)malloc(sizeof(individu));
                        l->suiv = q;
                        do {
                        if(ind) { q = l->suiv->suiv; }     
                           printf("\nEntrer un autre individu :");
                           scanf("%s", q->nom);/*la boucle passe une fois sans probleme,lorsqu'elle repasse c'est là que ca plante*/
                           printf("\nEntrer son age :");
                           scanf("%d", &(q->age));
                           printf("un autre individu ?(oui 1 non 0)");
                           scanf("%d",&ind);
                           q->suiv = NULL;
                       

                    }while ( ind != 0)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 novembre 2005 à 8:58:39

                      Ben si tu fais q = q->suiv, tu perds l espace mémoire préalablement alloué sur q. Donc pas glop du tout.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 novembre 2005 à 10:19:48

                        q = (individu *)malloc(sizeof(individu));
                            l->suiv = q;
                            do {
                            if(ind) { q = l->suiv->suiv; }


                        Ici soit ta variable ind est initialisé a 1, dans ce cas tu donne une valeur indéfinie a q vu que l->suiv est q qui n'a pas encore été défini (il vient d'etre alloué). Si la variable ind est init a 0 alors ce test n'a pas de sens au vu de la condition d'arret de ta boucle

                        printf("\nEntrer un autre individu :");
                               scanf("%s", q->nom);/*la boucle passe une fois sans probleme,lorsqu'elle repasse c'est là que ca plante*/


                        C'est normal si le champ nom est un char*. Il faut allouer aussi l'espace de la chaine. Lors de l'allocation de la structure, seul le pointeur est alloué (4octets généralement).

                        printf("\nEntrer son age :");
                               scanf("%d", &(q->age));
                               printf("un autre individu ?(oui 1 non 0)");
                               scanf("%d",&ind);
                               q->suiv = NULL;
                        }while ( ind != 0)


                        je ne vois pas ou tu fais q = q->suiv mais il faut dans ce cas que q->suiv soit alloué et il ne faut pas perdre q non plus.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Programme de C avec des pointeurs

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown