2012-08-03 21 views
7

में दीप सरणी प्रति मैं फोरट्रान (90) में एक (वास्तविक) सरणी की गहरी प्रति की जरूरत है, लेकिन यकीन है कि एक प्राप्त करने के लिए वास्तव में कैसे, जब से मैं पूरी तरह से समझ में नहीं आता कि कैसे संदर्भ से काम नहीं कर रहा हूँ। Intuitively, मैं यह मेरे प्राप्त करने के लिए जो मैं चाहता उम्मीद करेंगे:फोरट्रान

do i=1,n 
    b(i) = a(i) 
end do 

हालांकि, यह था हाल ही में बाहर मुझे की ओर इशारा किया है कि b(1:n) = a(1:n) ऊपर कोड के बराबर है। सहजता से, मुझे उम्मीद है कि b(1:n) = a(1:n) स्मृति में a(1:n) के स्थान पर इंगित करने के लिए केवल b(1:n) का संदर्भ देता है।

b(1:n) = a(1:n) एक गहरी प्रतिलिपि है? क्यूं कर? b = a के विपरीत अंतर्निहित संदर्भों के साथ क्या चल रहा है?

उत्तर

13

तीन तरीकों से आप को कॉपी सरणियों के लिए उल्लेख, do पाश, b(1:n) = a(1:n) और b = a देखें, सभी बराबर हैं; वे सरणी a सरणी b में सामग्री की प्रतिलिपि बनाते हैं। a और b केवल सरणी हैं, फैंसी पॉइंटर्स या कुछ भी नहीं हैं और इसलिए असाइनमेंट a = b मूल रूप से गणितीय अभिव्यक्ति के समान है। संदर्भों के साथ कोई जादू नहीं है (जिसे उपयोगकर्ता को पता होना चाहिए), यही कारण है कि फोरट्रान सीखने के लिए एक बहुत सीधी आगे की भाषा है। आप फोरट्रान में पॉइंटर सरणी कर सकते हैं, लेकिन यह एक अन्य मुद्दा है।

एम मेटकाफ और जम्मू रीड के फोरट्रान 90/95 समझाया हमेशा फोरट्रान भाषा सुविधाओं पर विचार-विमर्श के लिए एक अच्छा संदर्भ है। पेज 48 से:

3,11 सरणी काम

आंतरिक काम करके, एक सरणी अभिव्यक्ति एक ही आकार की एक सरणी चर, जो के रूप में अगर अभिव्यक्ति के प्रत्येक तत्व सौंपा गया व्याख्या की है करने के लिए सौंपा जा सकता है चर के इसी तत्व के लिए। उदाहरण के लिए, घोषणाओं

real, dimension(10, 20) :: a 

काम

a = a + 1.0 

i=1,2..,10 और j=1,2,..,20 के लिए a(i,j) + 1.0 से बदल देता है a(i,j) साथ।

भी ध्यान रखें कि एक अदिश अभिव्यक्ति एक सरणी, जिस स्थिति में saclar मूल्य सभी सरणी तत्वों को प्रसारित किया जाता है को सौंपा जा सकता है।

यह वास्तव में कैसे लागू किया जाता है, इस मामले में, मुझे लगता है कि आप अपने प्रश्न के साथ गाड़ी चला रहे हैं, यह फोर्ट्रान मानक द्वारा पूरी तरह से निर्दिष्ट नहीं है। इस तरह की चीज को कंपाइलर लेखकों को जो कुछ भी पसंद है उसे करने की इजाजत देने के लिए अनिर्दिष्ट छोड़ दिया जाता है। उदाहरण के लिए, a = b असाइनमेंट में, जिस क्रम में b के तत्वों को a में कॉपी किया गया है मानक द्वारा निर्दिष्ट नहीं है, इसलिए अलग-अलग कंपेलर इसे विभिन्न तरीकों से कर सकते हैं। आपको यह जानने की जरूरत है कि इस प्रश्न के लिए, a और b पॉइंटर्स नहीं हैं, तो a और b अलग-अलग सरणी हैं और एक के तत्व को बदलने से दूसरे के संबंधित तत्व को नहीं बदला जाता है। तो यह एक समझ है, a=b एक "गहरी प्रतिलिपि" है और आप b में a की स्मृति स्थान पर सभी वस्तुओं की प्रतिलिपि बनाने के बारे में सोच सकते हैं।

+0

@IanH यह ऐसा कुछ नहीं है जिसे मैं जानता हूं, इसलिए मैंने अपने जवाब में सरणी पर ध्यान केंद्रित किया। यदि आप उत्तर पोस्ट करना चाहते हैं तो ऊपर दिए गए उदाहरणों के लिए उपरोक्त का उदाहरण देखना दिलचस्प होगा। – Chris

+0

उस बेबेल के लिए माफ़ी, यह एक अधूरा विचार बुलबुला था जिसे मैंने तय किया था कि प्रश्न के लिए अप्रासंगिक था (पोस्टर विशेष रूप से वास्तविक चर का उल्लेख करता है)। मुझे यह भी पता नहीं था कि इसे पोस्ट किया गया था। – IanH

+1

'बी (1: एन) = ए (1: एन)' और 'बी = ए 'बराबर नहीं हैं। उदाहरण के लिए पूर्व आवश्यक पुनर्वितरण की जांच नहीं करेगा। –

6

ए = बी पूरे सरणी बी को प्रतिलिपि बनाता है। यदि आप केवल उस सरणी का हिस्सा चाहते हैं जो n से बड़ा आयाम है, तो आप subscript नोटेशन का उपयोग कर सकते हैं (1: n) = b (1: n)। यह फोरट्रान 9 0 है - यह फोरट्रान 77 की तुलना में एक उच्च स्तर की भाषा है। हम बता सकते हैं कि "ए = बी" एक प्रति है और पॉइंटर को लक्षित बी के साथ संबद्ध नहीं करता है क्योंकि उस कथन ने ऑपरेटर "=" का उपयोग किया था। सूचक संघ => का उपयोग करता है।

संपादित करें: नकल के द्वारा, यह एक नकली अपने करते लूप के रूप में शायद एक ही मशीन कोड के साथ बनाता है। पॉइंटर एसोसिएशन सभी सरणी तत्वों को डुप्लिकेट करने के लिए डू लूप किए बिना संदर्भ बनाता है।

http://en.wikipedia.org/wiki/Fortran_95_language_features

+1

यह इसकी प्रतिलिपि कैसे बनाता है? स्मृति में 'बी' के स्थान पर 'ए' के संदर्भ को दोबारा दर्ज करके, या 'बी' में सभी वस्तुओं की प्रतिलिपि स्मृति में' ए 'के स्थान पर ले जाकर? – astay13

+2

@ astay13, फोरट्रान जावा या सी # नहीं है। इसमें संदर्भ नहीं हैं। इसमें पॉइंटर्स हैं लेकिन एमएस बी बी के रूप में सहयोग करने के लिए विशेष वाक्यविन्यास का उपयोग किया गया है ('=' '' '' '' के बजाय। उदाहरण के लिए 'gfortran' संदर्भ के आधार पर' memcpy' (bitwise स्मृति प्रतिलिपि, बहुत तेज़) या छुपा 'डीओ' loops का उपयोग कर सरणी प्रतिलिपि लागू करता है। –

+0

@HristoIliev, हाँ, सवाल आता है क्योंकि जावा मेरी पहली भाषा है इसलिए मुझे संदर्भ असाइनमेंट के लिए इस्तेमाल होने वाले '=' के संदर्भ में सोचने के लिए उपयोग किया जाता है। – astay13

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

  • कोई संबंधित समस्या नहीं^_^