Bonsoir,
j'ai crée une fonction qui me crée une cellule à partir d'une image.
Version imprimable
Bonsoir,
j'ai crée une fonction qui me crée une cellule à partir d'une image.
c'est pas possible de savoir a quel type appartient un objet,
a ta place, j'enleverai toutes tes structure NW SW NE SE,
et je rajouterai a la structure cell , le membre:
et ensuite quand tu crée un NW SW NE ou SECode:int type
tu met le type adequat !
plutot que d'essayer de chercher le type...
un moyen qui aurai pu etre possible, aurait été d'utiliser sizeof()...mais comme ils on tous la meme taille...c'est pas possible de les differencier...
PS: j'espere avoir compris ta question...
Salut,
En gros, il te "suffit" de rajouter, à ta structure, un pointeur de type
que tu initialise sous la forme (par exemple) deCode:struct cellule *Pere;
que tu veilles, en "racine" de l'arbre, à initialiser sur NULL...Code:
1
2
3 Noeud_qui_recoit_l_enfant->NE=nouveau_noeud; nouveau_noeud->Pere=Noeud_qui_recoit_l_enfant;
Pour le type, de fait, tu met un int Type (où 1=NE,2=NW,3=SE,4=SW, par exemple) et que tu pouras récupérer, via les enfants, sous la forme de
Il ne te restera alors plus qu'à utiliser typeparent dans un switch...case adapté à tes besoins ;)Code:
1
2int typeparent=Noeud_Enfant->Parent->Type;
Heuuu.... est-il nécessaire de préciser qu'il ne faudra en aucun cas faire un free sur l'élément Noeud->Parent :question:
Normalement, c'est le parent qui libère d'abord la mémoire allouée àl'enfant avant de libérer sa propre mémoire... Toute tentative de faire autrement risque de faire perdre tout contact avec le reste de l'arbre... et donc, occasionner de sérieuses fuites mémoires ;)
Dis toi bien que tu peux tres bien utiliser un code du genre de
Pour autant que tu sois sur qu'il y aie bien au moins quatre niveau au dessus de ton noeud d'origine... cela va de soit... (d'ailleurs, pour les valeurs de Type, il serait intéressant de prévoir une valeur de plus: 0=racine ;) )Code:
1
2 Noeud_D_Origine->Pere->Pere->Pere->Pere->SW
Ceci dit, comme tu utilise des fonctions récursives, tu ne devrais pas avoir besoin de recourrir à cela...
exemple
Evidemment, dans Ce qu'il faut faire, tu peux prévoir un test qui renverrait 0 en cas d'échec...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 int FonctRecursive(const struct cellule *noeud) { if(noeud->NE!=NULL) { /*appel pour l'enfant NE */ if(FonctionRecursive(noeud->NE)==0) { /*la fonction a renvoyé une valeur d'echec... que faire :question:*/ } } if(noeud->NW!=NULL) { /*appel pour l'enfant NW */ if(FonctionRecursive(noeud->NW)==0) { /*la fonction a renvoyé une valeur d'echec... que faire :question:*/ } } if(noeud->SE!=NULL) { /*appel pour l'enfant SE */ if(FonctionRecursive(noeud->SE)==0) { /*la fonction a renvoyé une valeur d'echec... que faire :question:*/ } } if(noeud->SW!=NULL) { /*appel pour l'enfant SW */ if(FonctionRecursive(noeud->SW)==0) { /*la fonction a renvoyé une valeur d'echec... que faire :question:*/ } } /*arrivé ici, tous les enfants et enfants des enfants ont étés correctement gérés... il reste à gérer noeud */ /*Ce qu'il faut faire */ return 1; }
Si tu as du mal à comprendre la récursivité, tu peux aller jeter un oeil sur la ==>page qui leur est dédiée sur mon site <==, en espérant que cela t'aide à "fixer" un peu les choses ;)