Tableau Dynamiqu de pointeurs de structures C

Fermé
Euloiix - Modifié par Euloiix le 10/02/2011 à 12:01
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 13 févr. 2011 à 07:56
Bonjour à tous,

Un grand merci par avance à ceux qui m'aideront.
Voilà ma question ne doit pas être bien ordinaire mais bizarrement je ne trouve nulle part la réponse que je cherche tant.

Voici mon problème:

Je déclare la structure "word" suivante:

struct word {// We define the position of a word, as being the position of its first letter 
 int* position; 
 int* placed; // a boolean that will tell us if a word has already been placed or not 
};


Puis je veux l'initialiser de la sorte:

word* words = NULL; 
words = (word*)malloc(sizeof(word*) * 1632/48); 

while (database[i] != '\0') { 
  words[i/48]->*position = i; 
  words[i/48]->placed = 0; 
  i += 48; // We go to the next key  
}



On Visual C++, words[i/48] is underligned, saying expression must have pointer type.

L'idée de départ était de faire de "words" un tableau de pointeurs de structure, dont les champs étaient des pointeurs. Mais ça ne fonctionne visiblement pas comme cela ...

Encore une fois merci à ceux qui m'apporteront de l'aide.
Bonne fin de journée aux autres :)


3 réponses

flo13142 Messages postés 71 Date d'inscription mardi 7 décembre 2010 Statut Membre Dernière intervention 21 février 2011 18
10 févr. 2011 à 12:57
Bonjour,
remplace par :
 *(words[i/48].position) = i; 
  words[i/48].placed = 0; 


a mon avis ton sizeof (word *) n'est pas bon non plus
la taille de ta structure c'est sizeof (word), sizeof(word *) c'est la taille d'un pointeur : donc en gros 4
et la ta struct faisant 2 pt, ca devrait faire dans les 8:)
1
Merci beaucoup pour ta réponse !
Je teste ça demain et je te tiens au courant.
Mais une question sur ta remarque à propos du sizeof(word*), mon idée était d'avoir un pointeur sur chaque mot (structure word). D'avoir un tableau de pointeurs de structure. Meme dans ce cas c'est pas des (word*) que le tableau doit contenir ?
0
J'oubliais également qu'un typedef est effectué juste avant la déclaration de ma structure:

typedef struct word word;
0
Bonjour,

J'ai testé, ce code fonctionne bien :
int zero = 0;
	word* words = NULL; 
	words = (word*)malloc(sizeof(word*) * 1632/48); 

	while (i != 1632/48) { 
	  words[i/48].position = &i; 
	  words[i/48].placed = &zero; 

	  printf("\nStructure %d:\n\t %d \n\t %d ", i, *(words[i/48].position), *(words[i/48].placed));


Du coup je contourne un peu mon souci, qui était de changer directement les valeurs pointées. Là je lui passe juste de nouvelles adresses et avec cette synthaxe ça roule.

Une idée pour ne pas utiliser d'adresse à droite de l'égalité ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
13 févr. 2011 à 07:56
J'ai testé, ce code fonctionne bien
La syntaxe est bonne, mais fonctionnellement c'est faux.

words = (word*)malloc(sizeof(word*) * 1632/48);
Pas besoin de caster en word*, et ce n'est pas sizeof(word*) mais sizeof(word).

words[i/48].position = &i;
Je doute que cela fasse ce que tu penses.
Il ne faut pas mettre d'adresse à droite dans ton cas. Par contre la syntaxe ne sera plus bonne. C'est là que tu dois corriger.
Soit tu modifies ta structure et t'enlèves les pointeurs dedans.
Soit tu mets *(words[i...].position)=i; mais il ne faudra pas oublier d'allouer de la place à words[i...].position avec un joli malloc.
La remarque s'applique au champ placed.
Cdlt,
0