Erreur de segmentation lors de l'appel du sous-programme pour la deuxième fois sur le compilateur pgf90 sous Linux
Question
Je ne peux pas appeler le même sous-programme deux fois en utilisant pgf90 fortran complier sur un environnement Linux.Appeler le sous-programme pour la 1ère fois est OK mais l'appeler pour la 2ème fois, cela donne une erreur de segmentation.Quelqu'un peut-il donner une suggestion, ce qui ne va pas avec mon code, comme un exemple simple est donné comme
P.S.avec gfortran c'est OK, même je l'ai essayé sur le fortran visuel intel et c'est OK
program main
use module_Append_1DI
implicit none
integer, allocatable:: Arr(:)
integer::Brr(2)
Brr=[3, 4]
call Append_1DI(Arr,Brr)
write(*,*)Arr
call Append_1DI(Arr,Brr)
write(*,*)Arr
end program main
module module_Append_1DI
contains
subroutine Append_1DI(A,B)
implicit none
!================================================
integer, allocatable, intent(inout)::A(:)
integer, intent(in)::B(:)
integer, allocatable::temp(:)
integer::sizeA,sizeB,sizeN
!================================================
sizeA=size(A); sizeB=size(B); sizeN=sizeA+sizeB
allocate(temp(sizeN)); temp(1:sizeA)=A
call move_alloc(from=temp,to=A)
A(sizeA+1:sizeN)=B
end subroutine Append_1DI
end module module_Append_1DI
La solution
Pour être honnête, je suis étonné que cela fonctionne la première fois que vous l'appelez.C'est parce que A n'est pas alloué ensuite et que vous n'êtes pas autorisé à utiliser la taille intrinsèque sur un tableau allouable non alloué.En fait, si vous activez tous les indicateurs de vérification, ifort vous le dit
Wot now? ifort --version
ifort (IFORT) 12.0.4 20110427
Copyright (C) 1985-2011 Intel Corporation. All rights reserved.
Wot now? ifort -check all -g -traceback s.f90
Wot now? ./a.out
forrtl: severe (408): fort: (8): Attempt to fetch from allocatable variable A when it is not allocated
Image PC Routine Line Source
a.out 000000000046A3FA Unknown Unknown Unknown
a.out 0000000000468F75 Unknown Unknown Unknown
a.out 0000000000420B56 Unknown Unknown Unknown
a.out 0000000000404C95 Unknown Unknown Unknown
a.out 00000000004050E9 Unknown Unknown Unknown
a.out 0000000000402ED5 module_append_1di 24 s.f90
a.out 000000000040385F MAIN__ 46 s.f90
a.out 0000000000402B2C Unknown Unknown Unknown
libc.so.6 00007FB5F826DEFF Unknown Unknown Unknown
a.out 0000000000402A29 Unknown Unknown Unknown
gfortran est moins clair, mais vous dit toujours que quelque chose ne va pas
Wot now? gfortran --version
GNU Fortran (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
Copyright (C) 2010 Free Software Foundation, Inc.
GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING
Wot now? gfortran -Wall -Wextra -pedantic -fbounds-check -std=f2003 -g -fbacktrace s.f90
Wot now? ./a.out
At line 24 of file s.f90
Fortran runtime error: Array bound mismatch for dimension 1 of array 'temp' (1252015568/139957056323024)
Backtrace for this error:
+ function append_1di (0x400EC7)
at line 24 of file s.f90
+ in the main program
at line 48 of file s.f90
+ /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xff) [0x7f4a4a1deeff]
Et pour choisir un autre compilateur aléatoire, celui de Sun / oracle, encore une fois vous obtenez le même message
Wot now? f90 -V
f90: Sun Fortran 95 8.5 Linux_i386 2010/08/13
usage: f90 [ options ] files. Use 'f90 -flags' for details
Wot now? f90 -C s.f90
Wot now? ./a.out
****** FORTRAN RUN-TIME SYSTEM ******
Attempting to use an unallocated ALLOCATABLE 'A'
Location: line 22 column 16 of 's.f90'
Aborted
Le problème est donc l'utilisation de A avant qu'il ne soit alloué.
Est-ce que vous pensez qu'il s'agit d'un tableau de taille nulle?Eh bien, vous devez sortir cela de votre tête - un tableau alloctable non alloué n'a pas du tout de taille définie, ce qui est très différent d'un tableau alloué de taille nulle.
Ian