Pointeurs et tableaux de structure ?

Signaler
Messages postés
122
Date d'inscription
mercredi 16 avril 2003
Statut
Membre
Dernière intervention
22 juillet 2006
-
Messages postés
122
Date d'inscription
mercredi 16 avril 2003
Statut
Membre
Dernière intervention
22 juillet 2006
-
Bonjour,

J'aimerai avoir un petit éclaircissement au sujet des tableaux de structure et des pointeurs.
Au cours du listage d'un tableau de structure, j'ai besoin de connaitre à chaque fois la valeur de l'élément précédent.
J'ai donc écrit un truc comme ça :

if ((pTabStruct - 1)->unElement == 2) ...

Apparement ça marche, mais qd même une chose me tracasse.
Lors du test, le pointeur pTabStruct va décrémenter l'index du tableau de structure de 1 et vérifier la valeur de unElement. Tant que l'index vaut 1, 2, 3 etc, pas de pb, le pointeur pointera toujours sur qq chose de valide. Mais que se passe t-il lorsque l'index est égal à zéro. Cela reviendrait à aller vérifier la valeur de unElement se trouvant dans TabStruct[-1], qui n'existe pas.
Est ce qu'il n'y a pas un risque que le pointeur pointe sur n'importe quoi et génère une erreur ou fasse planter le programme?

Si quelqu'un pouvait m'éclairer.

Merci

Tintin 72

5 réponses

Messages postés
59
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2006

Oui, il y a un risque de plantage, et oui, il peut te renvoyer n'importe quoi.
Par contre, je ne sais pas de quoi ça dépend (la différence entre les deux).
Le plantage que j'ai vu le plus souvent est un message "la mémoire ne peut pas être read" ou written dans le cas d'une écriture...
Si je me souviens bien, quand tu travailles avec des pointeurs, c'est à toi de gérer les effets de bord...
Messages postés
15112
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 août 2021
98
Effectivement, pTabStruct[-1] va poser problème. Je te conseille de traiter le 1er élément à part. Mais pourquoi tu fais pas un truc de ce genre:

for (int i=1; i<NB_ELEMENT; i++)
{
/* ... */
if (TabStruct[i]->unElement == 2)
....
}

Buno
----------------------------------------
L'urgent est fait, l'impossible reste à faire. Pour les miracles, prévoir un délai...
Messages postés
122
Date d'inscription
mercredi 16 avril 2003
Statut
Membre
Dernière intervention
22 juillet 2006

Merci à vous deux pour ces renseignements ;-)

Tintin 72
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
pTabStruct[-1] ???
Faudrait peut etre revoir les bases du C apparement :)

Ici on parle de pointeur et non d'indice de tableau!!!
Faut pas tout mélanger! Dans le cas ou tu essayes de lire le contenu de l'adresse mémoire qui précédent le point de départ de pTabStruct, dans le meilleure des cas tu lira quelques choses qui n'a rien a voir avec ton prog, ou alors le prog plante (dépassement des bords).

Pour corriger ce problème, tu n'as cas sauvegarder l'adresse de départ de pTabStruct, et la comparer à celle en cours.
Ainsi, tu sera si tu es au début de ton tableau ou pas.

Exemple:

MyStruct pTemp[20]; // Pointeur de meme type et de meme taille que pTabStruct

pTemp = pTabStruct;

while( pTemp != pTabStruct)
{
// Ici tu mets ton codes
if ((pTabStruct - 1)->unElement == 2)
{
// Ici l'action a éxécuter
}
}

Voila, sans oublier que ce n'est que le principe de base. Après il faut que tu puisses sortir de la boucle au cas ou tu aurais fini de parcourrir ton tableau.
Plusieurs solutions s'offrent a toi pour cela.
N'hésites pas si tu as des questions.

Shell
Messages postés
122
Date d'inscription
mercredi 16 avril 2003
Statut
Membre
Dernière intervention
22 juillet 2006

Merci pour cette précision ;-)
Je crois que je vais utiliser un truc genre: i = 1 comme mentionné plus haut car en plus ça m'arrange de pas avoir l'indice 0.
Mais ta solution est aussi intéressante et ça peut être une bonne alternative.

Tintin 72