IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Incompatible pointer type


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Par défaut Incompatible pointer type
    Bonjour,

    J'ai un petit soucis lors de l'appel d'une fonction. J'ai une structure, qui est placée en paramètres dans une fonction et certains champs de cette structure son remplis sans que je le veuille. J'ai initialisé toutes mes variable préalablement à '\0'... Bref, j'ai ce warning qui me dit incompatible pointer type... Donc je suppose que mon problème peut venir de la. Je vous présente tout cela

    Ma structure tout d'abord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
        struct Reperage
        {
            char flagTFLO;
            char TFLO;
            char flagCSAU;
            char CSAU;
            char flagSUPP;
            char SUPP;
            char flagSUPR;
            char SUPR;
            char flagREP1;
            char REP1[68];
            ReperagePosLgVal REP1_REPERAGE;
            char flagREP2;
            char REP2[68];
            ReperagePosLgVal REP2_REPERAGE;
            char flagREP3;
            char REP3[68];
            ReperagePosLgVal REP3_REPERAGE;
            char flagRES1;
            char RES1[68];
            char flagRES2;
            char RES2[68];
            char flagRES3;
            char RES3[68];
            char flagCHAMP[17];
            char CHAMP[17][68];
            ReperagePosLgVal CHAMP_REPERAGE[17];
            char flagDEST;
            char DEST[68];
            char DEST_CHAMP[5][8];
            char flagBANA;
            char BANA[68];
            char BANA_CHAMP[8][8];
            char flagFILI;
            char FILI[68];
            char FILI_CHAMP[2][8];
            char flagCRIT;
            char CRIT[68];
            char CRIT_CHAMP[2][8];
            char flagTYPE;
            char TYPE[68];
            char TYPE_CHAMP[2][8];
            char flagSTYP;
            char STYP[68];
            char STYP_CHAMP[2][8];
            char flagNBEN;
            char NBEN[4];
            char flagPLRES;
            char PLRES[68];
            ReperagePosLgVal PLRES_REPERAGE;
            char flagEXIT;
            char EXIT[68];
            char flagACCUEIL;
            char ACCUEIL[68];
            char flagZON[17];
            char ZON[9][68];
            char ZON_CHAMP[9][8][8];
            char flagFORMAT;
            char FORMAT[68];
            char flagSITE;
            char SITE[68];
            char flagOUTIL;
            char OUTIL[68];
            char flagDESTR;
            char DESTR[68];
            char DESTR_CHAMP[5][8];
        };
        typedef struct Reperage  Reperage ;
    Ma fonction en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    int A427_RECH_CHAMP (ZoneErreur *pZErr,
                         char * pParametreIn,
                         char *pValChamp,
                         int nbreMaxZones,
                         Reperage * pReperage)
     
    {
     
    /*--------------------------------------------------------------------*/
    /* Variables locales                                                  */
    /*--------------------------------------------------------------------*/
     
        int rc = 0;
        int i = 0;
        int x = 0;
        char * virg;
        char ValPos[2];    /* sert à controler les 2 caractères numériques
                              dans les rubrique "CHAMPxx" */
        char val[257];     /*Pointeur sur chaine de caractere de la valeur*/
    /*--------------------------------------------------------------------*/
    /* Debut de traitement                                                */
    /*--------------------------------------------------------------------*/
        #ifdef DEBUG
            printf("DEBUG : A427 : Debut de la fonction\n");
        #endif
     
        memset(ValPos, '\0', sizeof(ValPos));
        memset(val, '\0', sizeof(val));
        memset(pReperage, '\0', sizeof(pReperage));
        /* On verifie la presence d'espaces dans la chaine */
        if (pParametreIn[0] == ' ')
        {
            /* Dans ce cas la, on deplace le pointeur */
            strcpy(pParametreIn, pParametreIn + 1);
        }
        /* On effectue une boulece, tant que le nombre maximum de
         * zones a renseigner n'est pas atteint */
     
        while (i < nbreMaxZones)
        {
            /*Initialisations */
            memset(ValPos,'\0',sizeof(ValPos));
            memset(val,'\0',sizeof(val));
     
            /* si on ne trouve pas le caractère ',' ou finc de chaîne '\0
             * alors la carte est mal renseignée */
         printf("Valeur de pParametreIn dans A427 : %s\n", pParametreIn);
            if((pParametreIn[7] != ',') && (pParametreIn[7] != '\0'))
            {
                rc = c_R_ARRET;
                goto A427_RECH_CHAMP_END;
            }
     
            /* controle que les 5 premiers caracteres correspondent à
             *  "CHAMP" */
            if (strncmp(pParametreIn, "CHAMP", 5)!=0)
            {
                rc = c_R_ARRET;
                goto A427_RECH_CHAMP_END;
            }
     
            /* On recupere les valeur numeric de pParametreIn
             * comprises entre 01 et 16 pour ensuite les convertir en 
             * entier grace a atoi */
            ValPos[0] = pParametreIn[5];
            ValPos[1] = pParametreIn[6];
     
            printf("Valeur de ValPos dans A427 : %.2s\n", ValPos);
            /* Appel de A423 pour verifier que la valeur recupere est 
             * un entier */
            rc = A423_all_digits(ValPos);
     
            if((rc != c_R_OK) || (atoi(ValPos)>16) || (atoi(ValPos)==0))
            {
                rc = c_R_ARRET;
                goto A427_RECH_CHAMP_END;
            }
     
            if(pReperage->flagCHAMP[atoi(ValPos)] != 'Y')
            {
                FormatMsg("ACD010", pZErr->Libelle, "CHAMP", ValPos);
                rc = c_R_ARRET;
                goto A427_RECH_CHAMP_END;
            }
            else
            {
                printf("Avant le memcpy dans pValChamp\n");
                printf("Valeur de pParametreIn dans A427 :%s:\n",
                        pParametreIn);
                /* On recuper dans pValChamp les 7 caracteres lu dans 
                 * pParametreIn. i*8 permet de se deplacer de champ en 
                 * champ dans le tableau */
                memcpy(pValChamp + (i*8), pParametreIn, 7);
                printf(" ===>>Valeur de pValChamp + (%d*8) :<%s>:\n", i,
                pValChamp + (i*8));
                printf("Apres le memcpy dans pValChamp\n");
            }
     
            /* Recherche de la virgule dans pParametreIn */
            virg = strchr(pParametreIn, ',');
            printf("Valeur de virg dans A427 : %s\n", virg);
            if (virg != NULL)
            {
                /* On se deplace en attribuant la valeur apres la virgule
                 * a val et on recommence le traitement*/
                strcpy(val, virg +1);
                printf("Valeur de val : %s\n", val);
                printf("Valeur de virg : %s\n", virg);
                strcpy(pParametreIn, val);
                printf("Valeur de pParametreIn : %s\n", pParametreIn);
            }
            else
            {
                break;
            }
            i++;
        }
     
        /* Verification qu'il n'y a plus aucune valeur ni aucun 
         * champ a traiter et que les cartes sont valides */
        if((i == nbreMaxZones-1) &&(pParametreIn[7] != '\0'))
        {
            rc = c_R_WAR;
            goto A427_RECH_CHAMP_END;
        }
     
        for(x = 1; x<17; x++)
        {
            printf("* Affichage de CHAMP[%d] dans A427:<%s>\n",
             x, pReperage->CHAMP[x]);
        }
     
     
    A427_RECH_CHAMP_END:
        #ifdef DEBUG
            printf("DEBUG : A427 : Fin de la fonction \n");
        #endif
     
        return(rc);
    }
    Et enfin, l'appel de cette fonction :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    rc = A427_RECH_CHAMP(pZErr,
                                 pReperage->DEST,
                                 pReperage->DEST_CHAMP,
                                 5,
                                 pReperage);
    Si vous voyez une erreur ou autre, n'hésitez pas à m'en faire part. Merci de votre attention

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct Reperage
    {
        ...
        char DEST_CHAMP[5][8];
        ...
     };
     typedef struct Reperage  Reperage ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int A427_RECH_CHAMP (ZoneErreur *pZErr,
                         char * pParametreIn,
                         char *pValChamp,
                         int nbreMaxZones,
                         Reperage * pReperage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    rc = A427_RECH_CHAMP(pZErr,
                                 pReperage->DEST,
                                 pReperage->DEST_CHAMP,
                                 5,
                                 pReperage);

  3. #3
    Membre éclairé Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Par défaut
    Tu pourrai être plus clair??? Je ne vois pas bien la différence (s'il y en à une) avec mon code... Merci

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    A427_RECH_CHAMP() attend en 3ème argument un (char*) et tu lui passes un (char**) d'où le "incompatible pointer type".

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    A427_RECH_CHAMP() attend en 3ème argument un (char*) et tu lui passes un (char**) d'où le "incompatible pointer type".
    pReperage->DEST_CHAMP, n'est pas du type char** mais du type char (*)[8].

    Si la fonction A427_RECH_CHAMP attend pour ce paramètre un tableau à une dimension, ce paramètre est du type char * et l'argument correspondant devrait être pReperage->DEST_CHAMP[0]

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par diogene Voir le message
    pReperage->DEST_CHAMP, n'est pas du type char** mais du type char (*)[8].
    oui oui je sais, mais c'était plus simple à écrire même si c'est incorrect, et surtout je voulais que le PO comprenne plus facilement. d'ailleurs c'est aussi faux , il est bien du type char[5][8] et ne sera sera converti implicitement en char(*)[8] que dans la fonction.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. erreur : subscript requires array or pointer type
    Par GabrielD dans le forum C++
    Réponses: 1
    Dernier message: 18/04/2011, 07h51
  2. Réponses: 5
    Dernier message: 14/07/2010, 10h34
  3. Réponses: 15
    Dernier message: 21/01/2009, 15h21
  4. Réponses: 9
    Dernier message: 21/10/2006, 13h38
  5. Réponses: 9
    Dernier message: 06/07/2005, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo