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