मैं एक जवाब के रूप में इस पोस्टिंग कर रहा हूँ क्योंकि टिप्पणियों थोड़ा भी वाक्यांश यह करने के लिए सीमित हैं।
इस उत्तर सरणियों और FORTRAN और डेल्फी में रिकॉर्ड की स्मृति लेआउट में अन्तर को स्पष्ट करने की कोशिश करता है और Todd Grigsby द्वारा answer और Remy Lebeau द्वारा answer (मैं दोनों upvoted) हरजाना।
फ़ोरट्रान और कुछ अन्य गणना केंद्रित भाषाओं column major order में नेस्टेड सरणी संग्रहीत करती हैं। डेल्फी और कई अन्य भाषाएं row major order का उपयोग करती हैं।
- एक नाम और नहीं एक सूचकांक है
- विभिन्न प्रकार
गणना गहन के लिए हो सकता है:
एक स्मृति दृष्टिकोण से, एक रिकार्ड फ़ील्ड की एक सरणी की तुलना में और कुछ भी नहीं है संचालन, जब आपके एल्गोरिदम स्तंभों का पक्ष लेते हैं तो यह नेस्टेड सरणी कॉलम प्रमुख आदेश को स्टोर करने के लिए समझ में आता है। पंक्ति प्रमुख आदेश के लिए वही। तो लूप में, आपको match the order of your indexes with the order of your storage की आवश्यकता है।
इस रिकॉर्ड और सरणी FORTRAN में परिभाषा को देखते हुए:
TYPE WallInfo
CHARACTER(len=40) :: Name
REAL :: Azimuth
REAL :: Tilt
REAL :: Area
REAL :: Height
END TYPE WallInfo
TYPE(WallInfo), ALLOCATABLE, DIMENSION(:) :: Wall
और डेल्फी में कार्यात्मक समकक्ष परिभाषा:
type
WallInfo = record
Name: array[0..39] of Char;
Azimuth: Real;
Tilt: Real;
Area: Real;
Height: Real;
end;
var
Wall: array of WallInfo;
और 3 WallInfo तत्वों की एक सरणी, यह कैसे स्मृति लेआउट है देखेंगे (वे सभी निरंतर मेमोरी एरिया होंगे, मैंने उन्हें पठनीय रखने के लिए लाइनों में विभाजित किया होगा):
फोरट्रान में:
Name[0,0]...Name[0,39], Name[1,0]...Name[1,39], Name[2,0]...Name[2,39],
Azimuth[0], Azimuth[1], Azimuth[2],
Tilt[0], Tilt[1], Tilt[2],
Area[0], Area[1], Area[2],
Height[0], Height[1], Height[2],
डेल्फी में
:
Name[0,0]...Name[0,39], Azimuth[0], Tilt[0], Area[0], Height[0],
Name[1,0]...Name[1,39], Azimuth[1], Tilt[1], Area[1], Height[1],
Name[2,0]...Name[2,39], Azimuth[2], Tilt[2], Area[2], Height[2],
तो यह FORTRAN कॉल:
कॉल HeatFlow (वॉल% क्षेत्र, वॉल% दिगंश)
सिर्फ संकेत दिए गए क्षेत्र के पास चला जाएगा [ 0] और अजीमुथ [0] स्मृति स्थानों और समारोह में उन स्मृति क्षेत्रों की लंबाई।
डेल्फी में, यह संभव नहीं है, तो आप
करने के लिए है
- का निर्माण नए क्षेत्र और दिगंश arays
- दीवार
- बुलाया WallInfo रिकॉर्ड उदाहरण के सरणी में जानकारी से उन्हें कॉपी उन्हें भेज समारोह
- यदि करने के लिए इन वर मानकों हैं: दो सरणियों से परिवर्तन दीवार
को
वापस कॉपी Todd Grigsby और Remy Lebeau सीधे डेल्फी कोड, या डेल्फी रिकॉर्ड आरटीटीआई का उपयोग करके अपने उत्तर में पहले तीन चरणों को दिखाया।
चरण 4 इसी तरह से काम करता है।
दोनों समाधान जेनरिक कि डेल्फी 2009
Until Delphi 2010, RTTI on records was very minimal) में पेश किए गए का उपयोग करें, ताकि आप दोनों जवाब के लिए सही डेल्फी संस्करण मिला है।
नोट (दोबारा): फोरट्रान से डेल्फी तक अपने एल्गोरिदम का अनुवाद करते समय, सुनिश्चित करें कि आप कॉलम/पंक्ति प्रमुख परिवर्तन की वजह से सरणी में लूप और अन्य अनुक्रमण के लिए देखते हैं।
क्या आपने वॉलइन्फो के अपने केस सरणी में सरणी या रिकॉर्ड के साथ प्रयास किया था? डेल्फी समर्थन डाइनैमिक सरणी। नए मान दर्ज करने से पहले पहले सरणी के साथ सेटलेथ के आकार को सेट करें। –
रेमी के आरटीटीआई उत्तर के रूप में ठंडा है, मैं उपरोक्त रिकॉर्ड प्रकार को अलग रैखिक सरणी में अनुवाद करने का लुत्फ उठाऊंगा: 'नाम: स्ट्रिंग का ऐरे; अजीमुथ: डबल का ऐरे; ... 'और फिर मुझे इस सुंदर आरटीटीआई हैक का उपयोग करके डेटा एकत्र नहीं करना पड़ेगा क्योंकि यह पहले ही इकट्ठा होगा। –