1
program x
   character(len=1024) :: foo 
   integer:: ret 

   foo = 'ls'
   call system(foo, ret)
end program

このプログラムは、ifort の SIGSEGV でクラッシュします。

forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image              PC                Routine            Line        Source             
a.out              0000000100000F0B  Unknown               Unknown  Unknown
a.out              0000000100000EAA  Unknown               Unknown  Unknown
a.out              0000000100000E8B  Unknown               Unknown  Unknown
a.out              0000000100000E0C  Unknown               Unknown  Unknown
a.out              0000000100000DA4  Unknown               Unknown  Unknown

gdb:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: 13 at address: 0x0000000000000000
0x0000000100000f0a in allocCstr ()
(gdb) bt
#0  0x0000000100000f0a in allocCstr ()
#1  0x0000000100000eaa in system_ ()
#2  0x0000000100000e0c in main ()

ifort --バージョン

ifort (IFORT) 11.1 20100806
Copyright (C) 1985-2010 Intel Corporation.  All rights reserved.

これはバグですか、それとも機能ですか?

4

2 に答える 2

3

コードをコピーすると、表示されているエラーを再現できます (Linux、ifort 11.0 20090131)。ただし、Intel fortran コンパイラのマニュアルを確認すると、サブルーチンではなく関数であることが示唆されています。コードを次のように変更した場合:

program x
    character(len=1024) :: foo
    integer             :: ret

    foo = 'ls'
    ret = system(foo)
end program x

その後、正常に動作します。

于 2011-03-04T17:40:22.647 に答える
2

まあ、これは私のマシン(ifort、XP SP3)で動作します

  CHARACTER(LEN=1024) :: FOO
  INTEGER :: RET

  FOO = 'dir'
  CALL SYSTEM(FOO, RET)
  READ(*,*)

  END

また、

  RET = SYSTEM(FOO)

使用しているのと同じifort、xp sp2でも動作します。

于 2011-03-04T17:28:24.443 に答える