15

C/C++ でポインターを配列として出力するには、通常はname@dimension. Fortranに相当するものは何ですか?

4

3 に答える 3

16

Fortran 90 は記述子を使用して、その配列の次元 (形状) を表し、形状引き継ぎ配列引数を渡します。また、Fortran のポインターは特殊です。修飾されたターゲットのみを指すことができます。これにより、C/C++ よりも Fortran の方がはるかに優れたデバッガーのイントロスペクションが可能になります。print arr(index)またはいずれかのinfoコマンドを使用するだけです。凝ったものは必要ありません。

サンプルコード:

program arr
  real, dimension(40) :: stack_array
  real, allocatable, dimension(:), target :: heap_array
  real, dimension(:), pointer :: ptr_array
  integer :: i
  ! Interface required because of the assumed-shape array argument
  interface
    subroutine foo(bar, baz, qux, ptr)
      real, dimension(:) :: bar
      real, dimension(40) :: baz
      real, dimension(*) :: qux
      real, dimension(:), pointer :: ptr
    end subroutine foo
  end interface

  allocate(heap_array(40))

  forall(i = 1:40) stack_array(i) = i
  heap_array = stack_array + 2
  ptr_array => heap_array

  print *, stack_array(1)

  call foo(stack_array, stack_array, stack_array, ptr_array)

  deallocate(heap_array)
end program arr

subroutine foo(bar, baz, qux, ptr)
  real, dimension(:) :: bar
  real, dimension(40) :: baz
  real, dimension(*) :: qux
  real, dimension(:), pointer :: ptr

  print *, bar(1), baz(1), qux(1), ptr(1)
end subroutine foo

デバッグ情報を使用してコンパイルし、次のように実行しgdbます。

$ gfortran -g -o arr.x arr.f90 && gdb ./arr.x
...
(gdb) info locals
heap_array = (3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...
ptr_array = (3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...
stack_array = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...
(gdb) print heap_array
$1 = (3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
(gdb) print ptr_array(3:7)
$2 = (5, 6, 7, 8, 9)
...
(gdb) info args
bar = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...
baz = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...
qux = ()
ptr = (3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...

明らかな理由から、想定サイズの配列引数の内容を表示することはできませんが、各要素を個別に出力できます。

(gdb) print qux(1)
$5 = 1
(gdb) print qux(2)
$6 = 2
(gdb) print qux(15)
$7 = 15

配列セクションの印刷は、想定サイズの配列引数では機能しないことに注意してください。それらは記述子によって渡されず、gdb問題が発生するためです。

(gdb) print qux(1:8)
$8 = (0, 0, 0, 0, 0, 0, 2.25609053e-43, 0)
(gdb) print qux(2:9)
$9 = (0, 0, 0, 0, 0, 0, 2.25609053e-43, 0)
于 2012-08-03T11:24:57.170 に答える
10

同様の問題に遭遇し、これこのリンクが役立つことがわかりました。

要約すると、gdb と gfortran の適切なバージョンがない場合は、たとえば次のようにする必要があります。

(gdb) print *((real *)my_array + 2)

または(私の場合)

(gdb) print *((real *)my_array + 2)   

配列の 2 番目の要素を出力します。あなたもできる

(gdb) print *((real_8 *)my_array + 2)@5

配列要素 2、...、2+5 を表示します。

于 2013-06-14T10:39:27.200 に答える
7

これはgdb 7.7.1で機能します:

print A(1)@N

ここで、A は配列、N は出力する要素の数です。2 次元配列の場合:

print A(1,1)@N

これは古い質問ですが、Googleクエリ「gdb print fortran array」がここにつながります。

于 2016-06-30T15:22:20.567 に答える