2012-08-02 21 views

उत्तर

15

फोरट्रान 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) 
+0

यह वास्तव में अच्छा है, लेकिन मेरे लिए काम नहीं करता है, आपका जीडीबी/गफ्रंटन संस्करण क्या है? (बीटीडब्ल्यू, आपके सबराउटिन फू में उदाहरण में एक तर्क गुम है) – steabert

+0

'gfortran 4.4.6' (' 4.7.0' के साथ भी परीक्षण किया गया) और वैज्ञानिक लिनक्स 6.2 (आरएचईएल 6.2) पर 'gdb 7.2-50.e16'। क्या आपने डिबगिंग जानकारी संकलित की थी? (लापता तर्क को ठीक किया गया - 10x इसे इंगित करने के लिए) –

+1

धन्यवाद, शायद यह एक प्रकार की बग है, मुझे नहीं पता। मैं gfortran 4.7.1 और जीडीबी 7.4.1 का उपयोग करें। अगर मैं सरणी मुद्रित करता हूं तो मुझे आउटपुट के रूप में '(0)' मिलता है। – steabert

9

मैं एक ऐसी ही समस्या में आए और पाया 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 देखने के लिए भी कर सकते हैं।

+0

'* ((डेटाटाइप *) सूचक) 'नोटेशन थोड़ा उलझन में है। यदि dereferencing '(dtype *) ptrname' के साथ एक बार किया जाता है - एक बार घोंसले कैसे हो सकता है * * ((dtype *) ptrname)' ?? –

2

यह gdb 7.7.1 में मेरे लिए काम करता है:

print A(1)@N 

जहां एक सरणी है और एन तत्वों की संख्या मुद्रित करने के लिए है। एक दो आयामी सरणी के लिए:

print A(1,1)@N 

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन गूगल क्वेरी "gdb प्रिंट fortran सरणी" यहाँ जाता है।

संबंधित मुद्दे