सी/सी ++ में एक सूचक के रूप में एक सूचक मुद्रित करने के लिए मैं आमतौर पर [email protected]
करता हूं। फोरट्रान के बराबर क्या है?जीडीबी में फोरट्रान सरणी कैसे मुद्रित करें?
उत्तर
फोरट्रान 90 अपने सरणी के आयामों (आकार) का प्रतिनिधित्व करने और अनुमानित आकार सरणी तर्कों को पारित करने के लिए वर्णनकर्ताओं का उपयोग करता है। फोरट्रान में पॉइंटर्स भी विशेष हैं - वे केवल योग्य लक्ष्यों को इंगित कर सकते हैं। यह सी/सी ++ की तुलना में फोरट्रान में बेहतर डीबगर आत्मनिरीक्षण की अनुमति देता है। बस 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)
मैं एक ऐसी ही समस्या में आए और पाया this और this लिंक उपयोगी।
यह करने पर निर्भर करता है: यदि आप 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 देखने के लिए भी कर सकते हैं।
'* ((डेटाटाइप *) सूचक) 'नोटेशन थोड़ा उलझन में है। यदि dereferencing '(dtype *) ptrname' के साथ एक बार किया जाता है - एक बार घोंसले कैसे हो सकता है * * ((dtype *) ptrname)' ?? –
यह gdb 7.7.1 में मेरे लिए काम करता है:
print A(1)@N
जहां एक सरणी है और एन तत्वों की संख्या मुद्रित करने के लिए है। एक दो आयामी सरणी के लिए:
print A(1,1)@N
मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन गूगल क्वेरी "gdb प्रिंट fortran सरणी" यहाँ जाता है।
यह वास्तव में अच्छा है, लेकिन मेरे लिए काम नहीं करता है, आपका जीडीबी/गफ्रंटन संस्करण क्या है? (बीटीडब्ल्यू, आपके सबराउटिन फू में उदाहरण में एक तर्क गुम है) – steabert
'gfortran 4.4.6' (' 4.7.0' के साथ भी परीक्षण किया गया) और वैज्ञानिक लिनक्स 6.2 (आरएचईएल 6.2) पर 'gdb 7.2-50.e16'। क्या आपने डिबगिंग जानकारी संकलित की थी? (लापता तर्क को ठीक किया गया - 10x इसे इंगित करने के लिए) –
धन्यवाद, शायद यह एक प्रकार की बग है, मुझे नहीं पता। मैं gfortran 4.7.1 और जीडीबी 7.4.1 का उपयोग करें। अगर मैं सरणी मुद्रित करता हूं तो मुझे आउटपुट के रूप में '(0)' मिलता है। – steabert