Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de pointeurs dans un programme

    18 juin 2020 à 14:47:29

    Bonjour,

    Je programme en C depuis maintenant 2 ans mais je rencontre encore beaucoup des problèmes avec l'utilisation des pointeurs notamment comme aujourd'hui avec le programme ci-dessous et dont je n'arrive pas à trouver la solution:

    Mon se trouve dans la variable "LedsEnDefaut" qui ne récupère pas la valeur de la variable "DetailsErreur"

    int main (int argc, char *argv[])
    {
    char LedsEnDefaut [8] [10];
    unsigned int erreur = 5;
    unsigned int DeciResult = 0;

    TraitementErreur(DeciResult, &NbrDefaut, &ReferenceValue[SEQ_LED_ROUGE_ON][Seq_Test], &LedsEnDefaut); return 0; } void TraitementErreur(unsigned int MesureDeci, int *Compteur, unsigned int *ValeurDeReference [8], char *DetailsErreur [8] [10]) { int MesureBin [14]; int ReferenceBin [14]; int i = 0 ; char LedDefaut [8] [30]; N_Ligne = 0 ; ConvertDeciToBin(MesureDeci, MesureBin); ConvertDeciToBin(ValeurDeReference[N_Ligne], ReferenceBin); //Compare les valeurs binaire et en ressort la valeur erronée for(N_Ligne = 1; N_Ligne <= 14; N_Ligne++) { if(MesureBin[N_Ligne - 1] != ReferenceBin[N_Ligne - 1]) { GetTableCellVal (panelTest_g, PANEL_TEST_TABLE, MakePoint (1, N_Ligne), LedDefaut [i]); (*DetailsErreur) [i] = LedDefaut [i]; i++; } //DetailsErreur [NbrDefaut] } *Compteur = i; }


    PS: Tout conseil pour l'amélioration du programme est bon à prendre

    En espérant que vous preniez le temps de me répondre. :D

    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2020 à 15:51:06

      Bonjour,

      La ligne 24 ne devrait pas compiler si tu avais défini correctement le dernier paramètre ligne 6 par char (*DetailsErreur)[8][10].
      Tu aurais : on ne peut pas avoir un tableau à gauche du signe égal.

      De plus, la variable DetailErreur contient une indirection de plus dont on peut se passer, on peut simplifier. Ça donne

      // ligne 2
      TraitementErreur(DeciResult, &NbrDefaut, &ReferenceValue[SEQ_LED_ROUGE_ON][Seq_Test], LedsEnDefaut); // pas de &
      
      // ligne 6 
      void TraitementErreur(unsigned int MesureDeci, int *Compteur, unsigned int *ValeurDeReference [8], char DetailsErreur[][10]) // pas de * et pas de risque d'oublier une parenthèse
      
      // ligne 24
                    memcpy( DetailsErreur[i] , LedDefaut[i] , sizeof DetailsErreur[i] ); // copier intégralement l'élément
      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        18 juin 2020 à 16:04:52

        Super je vous remercie tout fonctionne maintenant.

        Je voudrais juste comprendre un peu mieux si ça ne vous dérange pas.

        Qu'elle est la différence entre déclarer un pointeur :

        - char (*DetailsErreur) [8] [10],

        - char *DetailsErreur [8] [10]ou,

        - char DetailsErreur[][10]

        et enfin qu'est ce qu'une indirection ?

        • Partager sur Facebook
        • Partager sur Twitter
          19 juin 2020 à 8:57:29

          Un pointeur p, c'est une variable qui contient l'adresse de quelque chose.

          Ce quelque chose est accessible indirectement en passant par p, ça s'écrit  *p.  L'étoile, c'est l'opérateur d'indirection, qu'on applique au pointeur.

          --

          si on compile le code

          void f() 
          {
             char (*d1) [8] [10];
             char *d2 [8] [10];
             char d3 [][10];
          }
          

          la déclaration de d3 est rejetée :

          a.c:5:9: error: array size missing in ‘d3’
              char d3 [][10];
          


          d2, c'est un tableau (à deux dimensions) d'adresses de char. On peut faire

          char c;
          d2[2][3] = &c;    
          

          Pour d1, c'est un peu plus compliqué. Raisonnement

          • dans la déclaration   char (*d1) [8] [10];  on dit que (*d1) prend la place d'un truc. d1 est un pointeur sur ce truc
          • le truc serait déclaré   char truc [8][10];  donc c'est un tableau à deux dimensions de chars
          • donc d1 est un pointeur sur un tableau (2D) de chars.
          On pourrait donc faire ceci
          char truc[8][10];
          char (*d1) [8] [10];
          
          d1 = & truc;
          
          (*d1)[2][3] = 'z';



          -
          Edité par michelbillaud 19 juin 2020 à 9:13:46

          • Partager sur Facebook
          • Partager sur Twitter
            19 juin 2020 à 13:45:03

            Bonjour,

            Une précision pour le cas d3[][10]. C'est celui que j'ai utilisé. Cette syntaxe n'a pas de sens pour définir une variable, mais elle est possible dans la définition d'un paramètre.

            void fonction( char d3[][10] );   // d3 n'est pas un paramètre tableau de tableau
            // est équivalent à
            void fonction( char (*d3)[10] );  // d3 est un pointeur sur un tableau

            Cette syntaxe en tableau est une "tolérance" car elle correspond au cas où on veut transmettre un tableau, elle en garde la forme. Mais en fait, un tableau ne peut pas être passé en paramètre, il est immédiatement converti en un pointeur sur son premier élément à cet instant. On obtient donc bien la seconde ligne. On peut tout fait indiquer un nombre entre les premiers crochets comme tu l'as fait, mais ce nombre est forcément ignoré.



            • Partager sur Facebook
            • Partager sur Twitter

            En recherche d'emploi.

              1 juillet 2020 à 17:08:18

              D'accord merci bien je comprend beaccoup mieux d'autres erreur que j'ai sur d'autre programme un grand merci à vous.
              • Partager sur Facebook
              • Partager sur Twitter

              Erreur de pointeurs dans un programme

              × 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