Voici un petit exemple de ce qui peut être fait.
J'ai fait ça avec int, mais pour d'autres types (struct) il suffit de quelques adaptations.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
41
42
43
44
45
46
47
48
49
50
51
52
53 void treat(int* p) { printf( "[%p] valeur=%d\n", p, *p ); } void algo3() { int ii, nb, annul; int** pdebut, ** pfin, ** pcur; int entiers[] = { 10, 20, 30, 40 }; const int nb_elements = sizeof(entiers)/sizeof(entiers[0]); int* pointeurs[nb_elements]; /* init du tableau de pointeurs */ for( ii = 0; ii < nb_elements; ++ii ) { pointeurs[ii] = &entiers[ii]; } /* init des bornes du tableau */ pdebut = &pointeurs[0]; pfin = &pointeurs[nb_elements]; pcur = &pointeurs[2]; annul = 1; nb = 0; printf("DEBUT\n"); while( nb < nb_elements ) { if( *pcur != NULL ) { treat( *pcur ); /* raz compteur */ nb = 0; } else { /* increment compteur de ptr NULL */ ++nb; } /* avancer sans dépasser la borne de fin */ if( ++pcur == pfin ) { pcur = pdebut; /* on NULLifie les pointeurs petit à petit */ /* pour que la boucle se termine un jour */ pointeurs[annul] = NULL; annul = (annul + 1) % nb_elements; } } printf("FIN\n"); }
J'ai opté pour le cas 2 (on parcourt une fois jusqu'à revenir au p_current).
Comment je peux savoir ce que vaut p_debut?
Ok j'ai trouvé comment faire pour le 1er element.
Par contre j'aimerais parser mon tableua à partir de p_current mais exclu. En gros je voudrais que p_temp ne soit plus egal a p_current mais à p_current incrémenté. Est ce bon?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 int b_fois = 0; p_max = p_debut + N; p_temp = p_current+1; while( b_fois < 1 ) { if (p_temp != NULL) treat(p_temp); /* on avance sans dépasser la borne max */ if( ++p_temp == p_max ) p_temp = p_debut; /* on compte le nombre de fois qu'on passe devant p_current */ if( p_temp == p_current ) ++b_fois; }
C'est pas suffisant :
Si p_current parcourt l'intervalle [p_debut;p_max[
alors p_current+1 peut être égale à p_max... et donc dépasser la borne max du tableau !
Faire en sorte que la valeur d'initialisation de p_debut ne puissent pas égaler p_max.
Une solution inélégante serait de remplacer :
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part p_temp = p_current+1;
Je te laisse le soin de trouver une meilleure solution
Code : Sélectionner tout - Visualiser dans une fenêtre à part p_temp = p_current+1 == p_max ? p_debut: p_current+1;![]()
j'ai rajouté la condition suivante
et ensuite:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 if(p_Current == p_Fin) { p_Temp=p_Debut+ 1 ; } else { p_Temp=a_hwlpc_Context->p_CurrentSession+ 1 ; }
Est ce bon?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 while( b_fois < 1 ) { if (p_temp != NULL) treat(p_temp); /* on avance sans dépasser la borne max */ if( ++p_temp == p_max ) p_temp = p_debut; /* on compte le nombre de fois qu'on passe devant p_current */ if( p_temp == p_current ) ++b_fois; }
p_Fin est équivalent à p_max ?
Si oui, ton testne sera jamais vérifié puisque p_Current est compris dans l'ensemblre [p_Debut;p_Fin[ (p_Fin est exclu) et donc p_Current ne peut jamais être égal à p_Fin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(p_Current == p_Fin)
Par contre p_Current + 1, oui !
Et d'ou vient ce?
Code : Sélectionner tout - Visualiser dans une fenêtre à part a_hwlpc_Context->p_CurrentSession
C'est quoi ?
OUPS!
Là est ce bon?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 if(p_Current+1 == p_Max) { p_Temp=p_Debut+ 1 ; } else { p_Temp= p_Current+ 1 ; }
J'aimerais récupérer l'indice de mon tableau avant ma fonction de treat. Est se possible? sachant que p_debut =a_Tab[0] et p_max=a_Tab[N].
A savoir:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 if(p_Current+1 == p_Max) { p_Temp=p_Debut+ 1 ; } else { p_Temp= p_Current+ 1 ; } while( b_fois < 1 ) { if (p_temp != NULL) { for(int i=0; i<N; i++) { if ( p_Temp == a_Tab[i]) treat(i); } } /* on avance sans dépasser la borne max */ if( ++p_temp == p_max ) p_temp = p_debut; /* on compte le nombre de fois qu'on passe devant p_current */ if( p_temp == p_current ) ++b_fois; }
Est ce bon? Ou y a t'il plus simple.?
Il y a plus simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part index = (p_Temp - p_Debut) / sizeof(p_Debut[0])
Partager