Erreur de segmentation lors de l'appel du sous-programme pour la deuxième fois sur le compilateur pgf90 sous Linux

StackOverflow https://stackoverflow.com/questions/8417413

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
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top