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é.

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
 
 
         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
Quand je lance ce code, j'obtiens les affichages suivants avant que cela ne segfaulte :
(dans cet exemple, il y a un bloc ESSAI constitué de 10 sous bloc CYCLE_2 ne
comprenant aucun autre cycle)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Il semble y avoir un problème avec le pointeur bloc_i au niveau supérieur.

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 ?