Kurpeus1
Messages postés42Date d'inscriptionlundi 16 octobre 2006StatutMembreDernière intervention21 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
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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));
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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));
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);
}
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 ;
Kurpeus1
Messages postés42Date d'inscriptionlundi 16 octobre 2006StatutMembreDernière intervention21 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
Kurpeus1
Messages postés42Date d'inscriptionlundi 16 octobre 2006StatutMembreDernière intervention21 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 :