Je n'aime pas non plus mais c'est bien du C :
Citation:
Envoyé par 6.4.9 Comments
Version imprimable
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:
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:
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 !
concrêtement il faut que je fasse quoi alors?
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 :
parCode:p_temp = p_current+1;
Je te laisse le soin de trouver une meilleure solution ;)Code:p_temp = p_current+1 == p_max ? p_debut: p_current+1;
j'ai rajouté la condition suivante
et ensuite:Code:
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:
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:if(p_Current == p_Fin)
Par contre p_Current + 1, oui !
Et d'ou vient ce?Code:a_hwlpc_Context->p_CurrentSession
C'est quoi ?
OUPS!
Là est ce bon?Code:
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 ; }
ça me semble juste.
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:
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:index = (p_Temp - p_Debut) / sizeof(p_Debut[0])