Bonjour,
j'ai un petit problème avec une subroutine recursive.
Je souhaite simuler un essai qui est défini par des couples (profils de cycles,
nombre de fois qu'il faut répéter chaque cycle).
Chacun de ces cycles peut lui même être composés de sous cycles
Voilà pour l'instant le code que j'ai écrit - je vous épargne le détail des structures que j'ai utilisé.
Quand je lance ce code, j'obtiens les affichages suivants avant que cela ne segfaulte :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 RECURSIVE SUBROUTINE simul_essai(liste_cycles, level_bloc, ind, tab_result) type (t_level_bloc), intent(in) :: level_bloc type (t_liste_cycles), intent(in) :: liste_cycles integer, intent(in) :: ind real, dimension(:,:), pointer, intent(inout) :: tab_result integer, save :: ind_t integer :: i_i, i_j, ind2 type (t_cycle_bloc), pointer :: bloc_i=>null() ! initailisation bloc_i => liste_cycles%tab(ind)%p print *, ind, ' => ', bloc_i%nom ! boule sur les sous-cycles de bloc_i do i_i=1, bloc_i%nb ind2 = bloc_i%tab(i_i)%ind if (bloc_i%contains_cycle) then ! bloc_cycle => simulation des sous blocs do i_j=1, bloc_i%tab(i_i)%nb write(*, "('s/bloc ',I3,' du cycle',I3,' (',A10,')',& &' => cycle',I3,' -',I3,'/',I3)") & & i_i, ind, bloc_i%nom, ind2, i_j, bloc_i%tab(i_i)%nb call simul_essai(liste_cycles, level_bloc, ind2, tab_result) end do else ! bloc_palier => simulation des paliers [ calculs et remplissage de tab_result ] ind_t = ind_t+1 end if end do return END SUBROUTINE
(dans cet exemple, il y a un bloc ESSAI constitué de 10 sous bloc CYCLE_2 ne
comprenant aucun autre cycle)
Il semble y avoir un problème avec le pointeur bloc_i au niveau supérieur.Code:
1
2
3
4
5
6
7
8 % ./test_cycle 1 => ESSAI s/bloc 1 du cycle 1 (ESSAI ) => cycle 2 - 1/ 10 2 => CYCLE_2 s/bloc 1 du cycle 1 (CYCLE_2 ) => cycle 2 - 2/ 10 2 => CYCLE_2 s/bloc 1 du cycle 1 (CYCLE_2 ) => cycle 2 - 3/ 10
En effet, la ligne 's/bloc ...' n'est affichée que lorsque l'on est au niveau du bloc ESSAI puisque CYCLE_2 ne comprend aucun autre cycle.
On voit bien sur cette ligne que le numéro du cycle courant (ind) est égal à 1 mais le nom du bloc a changé après la ligne "2=> CYCLE_2".
j'ai l'impression que ce qui s'est passé lors du traitement du bloc CYCLE_2 a affecté le pointeur bloc_i défini au niveau supérieur et ce dernier ne pointe plus sur le même bloc après l'appel à simul_essai.
Est-ce normal ? Comment empêcher ça ?