Подтвердить что ты не робот

Как печатать массивы Fortran в GDB?

В C/C++ для печати указателя в качестве массива я обычно называю [email protected]. Что эквивалентно Fortran?

4b9b3361

Ответ 1

Fortran 90 использует дескрипторы для представления размеров (формы) своих массивов и для передачи аргументов массива предполагаемой формы. Также указатели в Фортране являются особенными - они могут указывать только на квалифицированные цели. Это позволяет гораздо лучше отлаживать интроспекцию в Fortran, чем в C/C++. Просто используйте 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)

Ответ 2

Я наткнулся на подобную проблему и нашел это и эту ссылку полезную.

Это сводится к: если у вас нет правильных версий gdb и gfortran, вам нужно сделать, например

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

или (в моем случае)

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

для печати второго элемента массива. Вы также можете сделать

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

для просмотра элементов массива 2,..., 2 + 5.

Ответ 3

Это работает для меня в gdb 7.7.1:

print A(1)@N

где A - массив, а N - количество элементов для печати. Для двумерного массива:

print A(1,1)@N

Я знаю, что это старый вопрос, но вот запрос Google "gdb print fortran array".