Problème de pointeur

Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007 - 30 déc. 2006 à 12:41
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007 - 31 déc. 2006 à 12:46
Bonjour.

J'ai déjà posé la question il y a deux trois jours mais je n'ai pas eu de réponse satisfaisante. Je me permet de réxpliquer mon problème

j'ai une structure de la forme :

struct global
{
       char *typeAction;
       char *codebar;
       char *champ1;
       char *champ2;
       char *champ3;
       char *champ4;
       char *champ5;
};

dans un fonction  j'utilise cette structure :
   
 struct global *pData ;
     pData = malloc(sizeof(struct global));

cette fonction me retourne le pointeur sur la structure.

Comme je dois appeller cette fonction 4096 fois, j'ai crée un tableau de pointeur dans la fonction appellante :

    struct global * pTable[4096] ;

a chaque appelle je rempli une case de mon tableau :

pTable[ind]  = splitTxt( pBuffer, ';');

 pBuffer est un pointeur vers un buffer

Mon problème est que sur le coup pTable[ind] contient bien mes infos, et qu'au passage suivant, l'info précédente semble être détruite en partie

merci d'avance;

Bonne fêtes à tous

11 réponses

cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
30 déc. 2006 à 13:54
 struct global * pTable[4096] ;
 struct global (* pTable)[4096] ;

c'est pas la meme chose,
le premier c'est un pointeur sur un tableau a 4096 elements
le second est un tableau de 4096 pointeurs

Pourquoi faire simple quand on peut faire compliqué ?
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
30 déc. 2006 à 14:01
Ok moi ce que je veux justement, c'est un tableau de 4096 pointeurs sur des structures de type "global"

Comment s'appelle donc mon tableau ?

si je fais pTable[i] = split(pBuffer, ';'); j'obtient le message d'erreur suivant : left operand must be l-value
 sachant que la fonction  split retourne un pointeur sur un struct global
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
30 déc. 2006 à 15:16
un petit up,  j'ai besoin d'une réponse je galère.

comment définir un tableau de pointeur sur une structure et comment donner la à chaque pointeur de ce tableau une valeur ?
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
30 déc. 2006 à 16:58
struct MyStruct{...}
MyStruct*pArray=(MyStruct*)malloc(nElements*sizeof(MyStruct*)); // tableau de pointeurs
pour initialiser un élément i :
pArray[i]=malloc(sizeof(MyStruct));
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
30 déc. 2006 à 17:05
Désolé j'ai oublié un * et je sais pas comment (si on peut) éditer le message une fois posté....
Donc la syntaxe correcte est :
struct MyStruct{...}
MyStruct**ppArray=(MyStruct**)malloc(nElements*sizeof(MyStruct*)); // tableau de pointeurs
pour initialiser un élément i :
ppArray[i]=(MyStruct*)malloc(sizeof(MyStruct));
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
30 déc. 2006 à 17:08
hmm je vais tester ca. Est ce que le fait que ma structure soit composé de pointeurs vers des chaines pose problème ?
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
30 déc. 2006 à 18:26
Apparement mes pointeurs sont toujours nuls. Je suis un peu (pour ne pas dire completement perdu dans l'écriture).

Voici mon code :

        char * buffer = malloc(sizeof(*buffer)*256);
   
    char * fichTxt;
    char * fichCsv;

    char * pBuffer;
    char resultString[10];
    char * end;
   

    int resultInt = 0;
    int i = 0;
    int ind = 0;
    int valueTemp = 0;
    int valueData = 0;

    struct global ** pTable = (struct global **) malloc(4096*sizeof(struct global*));
   
    // chemin des fichiers
    struct param *pLoad;   
    pLoad = setting();
    fichTxt = pLoad->temp;
    fichCsv = pLoad->csv;
   

    for (i=0;i<4096; i++)
    {
        pTable[i] = (struct global *) malloc(sizeof(struct global));
        initStruct(pTable[i]);
    }

    i = 0;
     if( (text fopen( fichTxt, "r")) NULL) return (-1);     if( (excel fopen( fichCsv, "w")) NULL) return (-2);
     
    temp = fopen("c:\\toto.txt", "w");
    fprintf(temp, "Zone 1; Zone 2; Zone 3; Codebar; Article; Prix Vente;\n");
    while ((fgets(buffer, 255, text)!= NULL))
    {
        pBuffer = buffer ;
       
        pTable[ind] = splitTxt( pBuffer, ';'); // ici les valeurs dans pTable[ind] existent bien, la fonction splitTxt fonctionne donc bien
        ind ++;
    }
    for (i = 0; itypeAction, "AJ Ref")) // le test n'est jamais vérifier quand je place cette condition en dehors du while
            fprintf(temp, "%s;%s;%s;%s;%s;%s\n", pTable[i]->champ3, pTable[i]->champ4, pTable[i]->champ5,
            pTable[i]->codebar,pTable[i]->champ1, pTable[i]->champ2);
    }

    fclose(text);
    fclose(excel);
    fclose(temp);
    return 1;

il semble que mes pointeurs soient vides. je pourrais faire le printf directement après le splitTxt mais dans une seconde fonction je ne pourrais pas le faire. Je dois donc créer un tableau de pointeurs que je garde pendant un certain temps.

voici ce que renvoie la fonction splitTxt  :

struct global *splitTxt( char * str, char c)
{
     int ind = 0 ;

     char *data = str;
     struct global *pData ;
     pData = malloc(sizeof(struct global));

     (.......) traitement sur les data du buffers. Allocation du genre  pData->typeAction = data;
                        
     return pData ;
}

merci
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
30 déc. 2006 à 20:33
struct global (* pTable)[4096] ;
ca marche pas ?!?

Pourquoi faire simple quand on peut faire compliqué ?
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
31 déc. 2006 à 10:47
Quand j'utilise struct global (* pTable)[4096] ; et que j'essaye par la suite de lui donner l'adresse d'un pointeur en faisant  pTable[i] = split(pBuffer, ';'); (split me retourne un pointeur), il me dit que l'opérand de gauche doit être une L-value
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
31 déc. 2006 à 11:32
Bon j'ai peut être un début d'élément de réponse.

alors j'utilise

struct global * pTable [4096]; Dans la littérature, je n'ai pas trouvé de parenthèses. Si j'en mets j'obtients des problèmes de compilations

<Type> *<NomTableau>[<N>]
déclare un tableau <NomTableau> de <N> pointeurs sur des données du type <Type>.

bon passons. Je lis dans un fichier avec la fonction gets. La ligne lue est placée dans un buffer. je crée un pointeur vers ce buffer que je passe en paramètre a ma fonction splitTxt.  Cette fonction découpe ma ligne en fonction des caractères ";" et déplace le pointeur au caractère suivant après avoir préalablement remplacé le ";" par un \0

dans ma ligne qui ressemblait donc au départ à
data1 ; data2 ; data3 ; data4 \0

maintenant elle est de type
data1 \0 data2 \0 data3 \0 data4 \0

Ce que vous ne pouviez pas voir  parce que j'avais pas montré le code se split, mais le voici :

char  * data = str;  // on crée un pointeur sur le buffer
      
     while( *str )  // on parcours les caractères du buffer
  {


   // si le caractère correspond :
         if ( *str == c )  // si le caractère correspond
   {
             *str = '\0'; //  on supprime le  ";" et on le remplace par "\0"
             ind++;  // pour compter mon nombre de colonne trouvée
             switch(ind)
             {
                        case 1 :
                             if (strcmp("", data)) // si la case zone 1 n'est pas vide
                             p->champ3 = data;  // on donne l'adresse initial au champ3
                             break;
                        case 2 : 
                            (...)
             }// end switch
             data = str+1;  // déplacement du pointeur sur le caractère suivant le ";"

Cette fonction marchait très bien du temps ou je faisais un printf derrière pour descendre mes infos sur papier.

Or le problème c'est que je veux garder l'intégralité de mon fichier en mémoire et créant un tableau de pointeur vers des structures.

Mon problème ici est que comme mon buffer de lecture de fichier est fixe.  A chaque fois que je viens lire une nouvelle ligne, celle ci est placé dans le buffer et du coup mes pointeurs précédents pointent vers des données qui ne sont plus les bonnes.

Comme ma fonction amont réserve de la place pour mes structures :

pTable[i] = (struct global *) malloc(sizeof(struct global));

si je passe a chaque fois ces pointeurs en paramètre pour indiquer ou écrire en mémoire :

pTable[ind] = splitTxt( pBuffer, ';', pTable[ind]);

Ca devrait peut être faire mon bonheur;
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
31 déc. 2006 à 12:46
Je n'arrive pas a dupliquer ma donnée.

pTableInd->typeAction = data ;

data est un pointeur vers une chaine de caractère

pTableInd est un pointeur vers une structure  et typeAction est un attribut de cette structure.

Ce que je veux c'est dupliquer la donnée contenu dans data , pas le pointeur.
0
Rejoignez-nous