Partage
  • Partager sur Facebook
  • Partager sur Twitter

Opération sur un pointeur

Problème à la compilation

    26 janvier 2006 à 20:41:20

    Bonsoir tout le monde.
    J'essaye de faire un petit programme pour me familiariser avec la manipulation des pointeurs. Le programme lit un fichier dans lequel il cherche des projets. A chaque fois qu'il en trouve un il le stock en mémoire. Pour cela j'utilise une allocation de mémoire. Mais voilà lorsque je met un pointeur simple ca marche mais lorsque j'essaye d'incrémenter le pointeur là ca veut plus compiler. Visual me met cette erreur:"error C2106: '=' : left operand must be l-value"
    Voilà le code pour plus de clarté:

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>

    void menu(int *,char *);
    void passage_tableau(char *tableau[],int *compteur_projet);

    FILE *fp;

    void main(void)
    {
            char ligne[255];
            char *identificateur;
            char *projet;
            char *branche;
            char *projets = NULL;
            int compteur_projet = 0;
            int chiffre=0,i;

            fp = fopen("projects.txt","r");
           
            if(fp == NULL)
                    printf("Fichier introuvable.\n");
            else
            {
                    while(fgets(ligne,sizeof ligne,fp), !feof(fp))
                    {
                            identificateur = strtok(ligne," ");

                            if(strcmp(identificateur,"#"))
                            {
                                    identificateur = strtok(ligne,"\t");
                                    projet = strtok(NULL,"\t");
                                    branche = strtok(NULL,"\t");
                           
                                    if(!strcmp(branche,"\"\""))
                                    {              
                                            if(compteur_projet == 0)
                                                  projets + compteur_projet =(char*)malloc(strlen(projet)+1);//c'est ici qu'il y a l'erreur d'après le compilateur.
                                            strcpy((projets + compteur_projet),projet);
                                            compteur_projet++;
                                           
                   
                                    }
                            }
                    }
            fclose(fp);
            }
            for(i=0;i<compteur_projet;i++)
                    printf("%s\n",projets + i);
    }




    Est-ce que quelqu'un pourrait m'expliquer l'erreur que je fait?

    Merci d'avance.
    </span>
    • Partager sur Facebook
    • Partager sur Twitter
      26 janvier 2006 à 20:53:23

      ben "projets + compteur_projet" n'est pas une opérande de gauche (l-value). Tu ne peux pas attribuer une valeur à une expression.. D'ailleurs, ça n'aurait aucun sens, sémentiquement.

      Il faut remplacer par:

      projets =(char*)malloc(strlen(projet)+1);


      Et comme compteur_projet == 0 de toute façon, tu peux l'enlever

      PS: (je suis un peu bref, c'est pas facil d'écrire avec un bras dans le platre ^^ )
      • Partager sur Facebook
      • Partager sur Twitter
        26 janvier 2006 à 21:01:55

        Notes :
        main retourne un int
        C'est une mauvaise habitude de caster le retour de malloc, en C.
        • Partager sur Facebook
        • Partager sur Twitter
          26 janvier 2006 à 21:06:10

          lol ok! Merci.Ca va ca s'voit même pas que t'as un bras dans le platre. Mon code était un peu pourri. J'ai compris ce que tu voulais dire. Mais j'ai toujours mon problème. Je l'ai rapporté à un code plus simple. En gros mon idée c'est de stocker une chaine de caractère dans un espace pointé par un pointeur et dans stocker une autre à l'adresse suivante en incrémentant mon pointeur. Cependant j'ai ce problème de l-value.

          Comment Est-ce que je pourrais m'y prendre?


          Voilà un code plus simple ou on doit entré successivement des mois.

          #include<stdio.h>
          #include<stdlib.h>
          #include<string.h>

          void main(void)
          {
                  char *mois;
                  int i,chiffre;
                  char ouf[10];
                 
                  for(i=0;i<5;i++)
                  {
                          gets(ouf);
                          mois + i = (char*)malloc(sizeof(ouf));
                          strcpy((mois + 1),ouf);
                  }
                 
                  printf("Entrer un mois\n:");
                  scanf("%d",&chiffre);
                  printf("%s",mois[chiffre]);
                 
          }

          Bon rétablissement Gravestein
          • Partager sur Facebook
          • Partager sur Twitter
            26 janvier 2006 à 21:25:26

            Ahh ben alors là, il faut utiliser un tableau de pointeurs. Parce que l'addresse "mois + un_nombre_entier" n'est pas allouée, donc ton code va planter à tous les coups!

            Donc tu peux remplacer par:

            #include<stdio.h>
            #include<stdlib.h>
            #include<string.h>

            void main(void)
            {
                    char* mois[5]; //c'est pour faire simple, pas d'allocation dynamique
                    int i,chiffre;
                    char ouf[10];
                   
                    for(i=0;i<5;i++)
                    {
                            gets(ouf);
                            mois[i] = (char*)malloc(sizeof(ouf));
                            strcpy((mois[i]),ouf);
                    }
                   
                    printf("Entrer un mois\n:");
                    scanf("%d",&chiffre);
                    printf("%s",mois[chiffre]);
                   
            }


            EDIT: rz0 >> comment tu évite de caster, dans ce cas là?
            • Partager sur Facebook
            • Partager sur Twitter
              26 janvier 2006 à 21:34:12

              Oui ca c'est bien. En fait je suis parti de là et je voulais améliorer le truc en faisant un tableau dont la taille n'est pas prédéfinie. Et que à chaque fois qu'on veut entrer un nouvel éléments il suffit d'incrémenter le pointeur. J'ai réussi à réglé le problème du l-value en passant par une variable intermédiaire mais ca semble ne pas marcher. Ca couille grave. Voilà le code:

              #include<stdio.h>
              #include<stdlib.h>
              #include<string.h>

              void main(void)
              {
                      char *mois = NULL,*test;
                      int i,chiffre;
                      char ouf[10];
                     
                      for(i=0;i<2;i++)
                      {
                              gets(ouf);
                              test = mois + i;
                              test = (char*)malloc(sizeof(ouf));
                              strcpy(test,ouf);
                      }
                     
                      printf("Entrer un mois\n:");
                      scanf("%d",&chiffre);
                      printf("%s",(mois + chiffre));
                     
              }

              Ca serait stylé d'avoir un tableau dont la seule limite est la taille de la mémoire. Mais est-ce possible?
              • Partager sur Facebook
              • Partager sur Twitter
                26 janvier 2006 à 21:42:41

                Un tableau dynamique, en C, ça n'existe pas. Pour avoir quelque chose de dynamique, il faut utiliser des structures un peu plus complexes (listes chaînées, et tout ce qu'il s'en suit).
                Mais si t'as pas envie de réinventer la roue, utilise les string, vector et map de la STL (=> google est ton ami)

                Pour revenir à ton code, ta variable temporaire ne sert absolument à rien (mise à part à cacher une atrocité au compilateur).
                "test + 1" n'est pas alloué pour ton programme, donc ça va planter. Crées au moins un tableau de pointeur:
                char *mois[2],*test;
                • Partager sur Facebook
                • Partager sur Twitter
                  26 janvier 2006 à 21:43:05

                  > EDIT: rz0 >> comment tu évite de caster, dans ce cas là?</citation>
                  Tout pointeur universel (void *) est implicitement converti au type correspondant dans un contexte d'affectation.

                  foo_t *p;
                  p = malloc(sizeof *p);

                  est _la_ façon recommandée en C.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 janvier 2006 à 12:07:50

                    Voilà j'ai réussi à mettre mes mois à chaque adresse. j'ai vérifié ils sont bien stockés. Cependant maintenant je n'arrive pas à les retrouver. Lorsque je mets mois[i] et que i vaut 0 il m'affiche bien le mois mais celui stocké à la dernière adresse stocké dans mois. En gros dans le code qui suit si je rentre février en deuxième il m'affichera février. Et si je mets mois[1] il m'affiche ^février. Je comprend pas comment ca se fait que je n'arrive pas à revenir à l'adresse que je veux et que au lieu de ca il me parcourt ma chaine de caractère. Voici le code (ca vaut mieux que de trop longues explications).

                    #include<stdio.h>
                    #include<stdlib.h>
                    #include<string.h>

                    void main(void)
                    {
                            char *mois = NULL;
                            int i,chiffre;
                            char ouf[10];
                           
                            for(i=0;i<2;i++)
                            {
                                    gets(ouf);
                                    mois = mois + i;
                                    mois = (char*)malloc(sizeof(ouf));
                                    strcpy(mois,ouf);
                            }
                           
                            printf("Entrer un mois\n:");
                            scanf("%d",&chiffre);
                            mois = mois - chiffre;
                            printf("%s",mois);
                           
                    }


                    Si quelqu'un peut m'expliquer la ou ce m****?


                    Merci
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 janvier 2006 à 14:47:34

                      Euh... Tu fais exprès, ou tu veux pas comprendre? o_O
                      La réponse est dans les posts précédents...
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Opération sur un pointeur

                      × 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