In C/C++ per stampare un puntatore come array di solito faccio [email protected]
. Qual è l'equivalente di Fortran?Come stampare gli array Fortran in GDB?
risposta
Fortran 90 utilizza descrittori per rappresentare le dimensioni (la forma) dei suoi array e per passare argomenti di matrice di forma presunta. Anche i puntatori in Fortran sono speciali: possono solo indicare obiettivi qualificati. Ciò consente un'introspezione del debugger molto migliore in Fortran rispetto a C/C++. Basta usare print arr(index)
o uno dei comandi info
- non c'è bisogno di cose fantasiose.
codice di esempio:
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
Compilare con le informazioni di debug e gestito con 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, ...
Non può mostrare il contenuto di assumed-size gli argomenti di matrice per ovvie ragioni, ma è possibile stampare ogni elemento singolarmente:
(gdb) print qux(1)
$5 = 1
(gdb) print qux(2)
$6 = 2
(gdb) print qux(15)
$7 = 15
Nota che matrice di stampa sezioni non funziona su assunto dimensioni argomenti di matrice in quanto non sono passati per descrittore e gdb
corse nei guai:
(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)
mi sono imbattuto in un problema simile e ha trovato this e this link utile.
si riduce a: se non si hanno le versioni corrette di gdb e gfortran, è necessario fare per esempio
(gdb) print *((real *)my_array + 2)
o (nel mio caso)
(gdb) print *((real *)my_array + 2)
a stampa il 2 ° elemento dell'array. Puoi anche fare
(gdb) print *((real_8 *)my_array + 2)@5
per vedere gli elementi dell'array 2, ..., 2 + 5.
the' * ((datatype *) pointername) 'la notazione è leggermente confusa. se il dereferenziazione viene eseguito una volta con '(dtype *) ptrname' - come può nidificare una volta portare a' * ((dtype *) ptrname) '?? –
Questo funziona per me in gdb 7.7.1:
print A(1)@N
dove A è la matrice e N è il numero di elementi da stampare. Per un array bidimensionale:
print A(1,1)@N
So che questa è una vecchia questione, ma di query Google "gdb stampa di matrice FORTRAN" porta qui.
- 1. Come stampare l'ultimo segnale ricevuto in GDB?
- 2. Array of Strings in Fortran 77
- 3. Copia deep array in Fortran
- 4. come inizializzare array bidimensionali in Fortran
- 5. Come stampare una struttura C in modo ricorsivo in gdb
- 6. Dimensioni array C tramite gdb
- 7. Funzione Restituzione di un array in Fortran
- 8. Come si stampa un array Java in gdb?
- 9. Come stampare piuttosto i contenitori STL in GDB?
- 10. array di oggetti estesi in Fortran
- 11. come stampare array 3x3 in python?
- 12. Come stampare l'intero array NumPy?
- 13. Come stampare jquery object/array
- 14. gdb - come stampare il risultato della valutazione per C++
- 15. Come stampare gli array Numpy senza alcuna notazione aggiuntiva (parentesi quadre [] e spazi tra gli elementi)?
- 16. Come compilare gli script Python per l'uso in FORTRAN?
- 17. C'è un modo per stampare una matrice Armadillo in gdb?
- 18. Avviso di runtime Fortran: array temporaneo
- 19. Come stampare rapidamente gli hash Ruby in un formato tabella?
- 20. Fortran: array dinamici e array automatico Evitare allocazione di memoria
- 21. Come stampare un array Numpy senza parentesi?
- 22. Come stampare array all'interno dell'array Laravel blade?
- 23. Come stampare/registrare array di stringhe in java?
- 24. Come stampare un array in un file .txt in Matlab?
- 25. Domanda GDB: Pretty-Printing un array 2D?
- 26. Come stampare un array nell'ordine definito in AWK 3.1.3
- 27. Come stampare il seguente array multidimensionale in Java Script?
- 28. fortran, passando gli array allocabili a una subroutine con limiti a destra
- 29. Lunghezza array automatica nel debug Fortran e Visual Studio
- 30. Come posso stampare gli elementi di un array ripetuti due volte ogni side-by-side?
Questo è davvero bello, ma non funziona per me, qual è la versione di gdb/gfortran? (btw, la subroutine foo manca un argomento nell'esempio) – steabert
'gfortran 4.4.6' (anche testato con' 4.7.0') e 'gdb 7.2-50.e16' su Scientific Linux 6.2 (RHEL 6.2). Hai compilato con le informazioni di debug? (corretto l'argomento mancante - 10x per indicarlo) –
grazie, forse è un insetto di sorta, non lo so. Uso gfortran 4.7.1 e gdb 7.4.1. Ho appena ottenuto '(0)' come output se stampo gli array. – steabert