Pointeurs et tableaux de structure ?

cs_tintin72 Messages postés 122 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 22 juillet 2006 - 4 mai 2005 à 11:33
cs_tintin72 Messages postés 122 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 22 juillet 2006 - 4 mai 2005 à 19:28
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

MNEMONIC Messages postés 59 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 1 septembre 2006
4 mai 2005 à 11:44
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...
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
4 mai 2005 à 11:50
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...
0
cs_tintin72 Messages postés 122 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 22 juillet 2006
4 mai 2005 à 12:05
Merci à vous deux pour ces renseignements ;-)

Tintin 72
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
4 mai 2005 à 13:34
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
0

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

Posez votre question
cs_tintin72 Messages postés 122 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 22 juillet 2006
4 mai 2005 à 19:28
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
0
Rejoignez-nous