यह थोड़ा जटिल है; प्रश्न की स्पष्टता में सुधार करने के तरीके पर मैं किसी भी टिप्पणी का स्वागत करता हूं।परस्पर निर्भर आयामों के साथ गतिशील सरणी आवंटित करें
ठीक है, मैं एक सरणी है कहते हैं:
real, allocatable :: A(:,:,:)
और मैं इसे आवंटित करने के लिए इससे पहले कि मैं इसका इस्तेमाल करना चाहते हैं। क्या दूसरे आयाम के आकार पर निर्भर करने के लिए तीसरे आयाम के आकार के लिए यह संभव है?
उदा।
do i=1,n
allocate(A(3,i,i**2))
end do
स्पष्ट रूप से उपर्युक्त काम नहीं करता है। मैं एक सरणी (या सरणियों का एक सेट) आकार (रों)
(3,1,1), (3,2,4), (3,3,9), ... (3, n, n^2)
जहां तीसरे आयाम का आकार दूसरे आयाम के आकार का वर्ग है साथ साथ खत्म करना चाहते हैं।
आश्रित आयाम के आकार के लिए मेरा नियम थोड़ा अधिक जटिल है, लेकिन अगर स्क्वायरिंग संभव है तो मैं बाकी कर सकता हूं।
क्या यह संभव है? यदि हां, तो मैं इसे फोरट्रान में कैसे कार्यान्वित कर सकता हूं?
shape(A)
वापसी क्या होगी? यह दिलचस्प होगा।
मेरे अन्य वैकल्पिक, अधिकतम आकार के लिए आवश्यक करने के लिए आवंटित है, और केवल इस समय
allocate(A(3,n,n**2))
गणना में कुछ तत्वों का उपयोग करें, यानी भले ही मैं कठिन स्मृति पर नहीं कर रहा हूँ करने के लिए सावधान रहना है मैं अच्छा प्रोग्रामिंग प्रथाओं की तरह होना पसंद है। वैसे भी यह एक दिलचस्प समस्या है।
धन्यवाद।
संपादित करें:
क्या एक आयाम के आकार होने के बारे में मूल्य एक और आयाम में एक तत्व की पर निर्भर करते हैं?
दोनों आयामों में सरणी के आकार के नीचे जवाब में बी मैं के सूचकांक पर निर्भर
type myarray
real :: coord(3)
integer,allocatable :: lev(:)
integer, allocatable :: cell(:)
endtype myarray
type(myarray), allocatable :: data
allocate(data(m))
allocate(data%lev(n))
forall (j=1:n) !simple now, for argument's sake
lev(j)=j
endforall
! I was thinking of using a FORALL loop here, but the errors returned
! suggested that the compiler (gfortran) didn't expect IF blocks and ALLOCATE
! statements in a FORALL block
do i=1,m
do j=1,n
allocate(data(i)%cell(lev(j)**2))
enddo
enddo
आप प्राप्त की तर्ज पर कुछ करना चाहते हैं कि मैं क्या मतलब है? लेकिन कार्यक्रम खत्म हो गया है क्योंकि यह पहले से आवंटित चर आवंटित करने का प्रयास करता है, उदा। जब i=1
यह data(1)%cell(1)
आवंटित करता है, और फिर data(1)%cell(2)
आवंटित करने का प्रयास करता है ... ओह ओह।
प्रत्येक data(i)
1 से n करने के लिए चल रहे मूल्यों की एक सरणी lev(j)
, j
साथ हैं, और प्रत्येक lev(j)
मूल्य के लिए हम आकार lev
^2 के एक cell
है: क्या मैं चाहता हूँ की तरह कुछ है। ध्यान दें कि ये cell
प्रत्येक data(i)
और प्रत्येक lev
के लिए अद्वितीय हैं, और उस विशेष cell
का आकार इसी lev
मान पर निर्भर करता है, और संभवतः संबंधित data(i)
पर भी निर्भर करता है।
क्या मुझे व्युत्पन्न प्रकार के भीतर व्युत्पन्न प्रकार का उपयोग करना होगा?
जैसा कि आप जानते, जिस सरणी को आप ढूंढ रहे हैं उसे "jagged" सरणी कहा जाता है, बनाम "आयताकार" सरणी के रूप में। आईआरओ-बॉट के नीचे सही जवाब है; खुद द्वारा फोरट्रान सरणी में आयताकार होते हैं लेकिन आप अपनी खुद की संरचना बनाने के लिए परिभाषित प्रकारों का उपयोग कर सकते हैं। –
"जग्ड" ... अरे, यह समझ में आता है, चित्रमय। "... आप अपनी खुद की संरचना बनाने के लिए परिभाषित प्रकारों का उपयोग कर सकते हैं।" वास्तव में? तो अगर मैं एक सरणी चाहता हूं जिसका आकार आधा रास्ते तक बढ़ता है तो घटता है, या फाइबोनैकी अनुक्रम का पालन करता है, या पूरी तरह से यादृच्छिक है - यह बहुत अधिक प्रयास के लिए संभव नहीं है ... शांत! –
@ सैमुएलटान मैंने अपनी नई समस्या को हल करने के लिए अद्यतन कोड के साथ अपना उत्तर संपादित किया। यह देखने के लिए कि आप क्या गलत कर रहे थे, दो कोडों की तुलना करें। – milancurcic