2010-07-03 20 views
41

मैं फोरट्रान सीखने की कोशिश कर रहा हूं और मैं कई अलग-अलग परिभाषाओं को पारित कर रहा हूं और मुझे आश्चर्य है कि वे कोशिश कर रहे हैं या नहीं एक ही चीज़ को पूरा करने के लिए। निम्नलिखित के बीच क्या अंतर है?फोरट्रान: पूर्णांक * 4 बनाम पूर्णांक (4) बनाम पूर्णांक (प्रकार = 4)

  • integer*4
  • integer(4)
  • integer(kind=4)

उत्तर

42

फोरट्रान में> = 90, सबसे अच्छा तरीका सटीक आप की जरूरत निर्दिष्ट करने के लिए आंतरिक कार्यों का उपयोग है - यह दोनों पोर्टेबिलिटी की गारंटी देता है और है कि आप मिल सटीक जो आपको चाहिए। उदाहरण के लिए, पूर्णांकों प्राप्त करने के लिए मैं और my_int कि कम से कम 8 दशमलव अंक का समर्थन करेंगे, आप इस्तेमाल कर सकते हैं:

integer, parameter :: RegInt_K = selected_int_kind (8) 
integer (kind=RegInt_K) :: i, my_int 

परिभाषित करने के बाद "RegInt_K" (या जो भी नाम आप चुनें) एक पैरामीटर के रूप, आप इसे भर में उपयोग कर सकते हैं प्रतीक के रूप में आपका कोड। यह परिशुद्धता को बदलने में भी आसान बनाता है।

8 या 9 दशमलव अंकों का अनुरोध आमतौर पर 4-बाइट पूर्णांक प्राप्त करेगा।

पूर्णांक * 4 एक सामान्य एक्सटेंशन है जो 4-बाइट पूर्णांक निर्दिष्ट करने के लिए पुराने फोरट्रान पर वापस जा रहा है।

पूर्णांक (4) या पूर्णांक (RegInt_K) पूर्णांक (प्रकार = 4) या पूर्णांक (kind = RegInt_K) के लिए कम हैं। पूर्णांक (4) पूर्णांक * 4 के समान नहीं है और गैर पोर्टेबल है - भाषा मानक प्रकार के संख्यात्मक मान निर्दिष्ट नहीं करता है। अधिकांश कंपाइलर 4-बाइट पूर्णांक के लिए प्रकार = 4 का उपयोग करते हैं - इन कंपाइलर्स पूर्णांक * 4 और पूर्णांक (4) के लिए एक ही पूर्णांक प्रकार प्रदान करेगा - लेकिन अपवाद हैं, इसलिए पूर्णांक (4) गैर-पोर्टेबल और सर्वोत्तम से बचा है ।

वास्तविकताओं के लिए दृष्टिकोण समान है।

अद्यतन: यदि आप आवश्यक परिशुद्धता से संख्यात्मक प्रकार निर्दिष्ट नहीं करना चाहते हैं, लेकिन इसके बजाय वे जिस स्टोरेज का उपयोग करेंगे, फोर्ट्रान 2008 एक विधि प्रदान करता है। reals और पूर्णांकों भंडारण के टुकड़े की संख्या से, उदाहरण के लिए, useISO_FORTRAN_ENV मॉड्यूल ing के बाद निर्दिष्ट किया जा सकता एक 4-बाइट (32-बिट) पूर्णांक के लिए:

use ISO_FORTRAN_ENV 
integer (int32) :: MyInt 

gfortran पुस्तिका "आंतरिक तहत प्रलेखन है मॉड्यूल "।

+0

जो एक शानदार स्पष्टीकरण था! चौका देने वाला! अति उत्कृष्ट! यह अब मुझे क्रिस्टल स्पष्ट है ..: डी बहुत बहुत धन्यवाद! – Sam

19

बस एक और स्पष्ट स्पष्टीकरण कि किस तरह का है। कंपाइलर में विभिन्न संख्यात्मक प्रकार की एक तालिका है। मूल प्रकार के integer के सभी पूर्णांक प्रकार प्रकार अलग हैं। मान लें कि कंपाइलर में 1 बाइट, 2 बाइट, 4 बाइट, 8 बाइट और 16 बाइट integer (या real) प्रकार हैं। तालिका में कंपाइलर के प्रत्येक प्रकार के लिए एक सूचकांक है - यह सूचकांक दयालु संख्या है।

कई compilers इस नंबर चुनें:

kind number number of bytes 
1    1 
2    2 
4    4 
8    8 
16    16 

लेकिन वे किसी अन्य नंबर चुन सकते हैं। स्पष्ट संभावनाओं में से एक

kind number number of bytes 
1    1 
2    2 
3    4 
4    8 
5    16 

है वहाँ वास्तव में (कम से कम जी -77 और एनएजी) compilers जो यह तरीका अपना रहे हैं। इसे बदलने के विकल्प भी हैं।इसलिए kind संख्या पोर्टेबल नहीं हैं integer(kind=4) या integer(4) का अर्थ है 4 बाइट पूर्णांक या 8-बाइट पूर्णांक कंपाइलर के आधार पर।

integer*4 इस अर्थ में पोर्टेबल है कि इसका अर्थ हमेशा 4 बाइट्स है। लेकिन दूसरी ओर यह पोर्टेबल नहीं है क्योंकि यह कभी भी किसी भी मानक का हिस्सा नहीं रहा है। इस नोटेशन का उपयोग करने वाले कार्यक्रम वैध फोरट्रान 77, 9 0 या किसी अन्य फोरट्रान मान्य नहीं हैं।

सही विकल्प देखने के लिए कि कैसे प्रकारों को सेट करना है एमएसबी का जवाब देखें।

एक ही अवधारणा real डेटा प्रकारों के लिए है। Fortran 90 kind parameter (माताप का जवाब) देखें।

+1

यहां दिलचस्प बात यह है कि रूपों का प्रकार (प्रकार) और प्रकार * प्रकार पूरी तरह से अदला-बदली नहीं है और इसे ध्यान देने की आवश्यकता है। उदाहरण के लिए, इंटेल में फोरट्रान पूर्णांक (6) और पूर्णांक * 4 एक ही हैं, लेकिन: परिसर ([प्रकार =] 4) के रूप में परिसर * 8, परिसर में ही है ([प्रकार =] 8) या जटिल * 16 , COMPLEX ([KIND =] 16) या COMPLEX * 32 – syscreat

+0

@syscreat मैंने इस जवाब में वास्तविक और जटिल को संबोधित नहीं किया, क्योंकि उनके बारे में एक अलग सवाल है। मैंने यहां केवल पूर्णांक को संबोधित किया। लिंक के उत्तर में और देखें। तथ्य यह है कि एक ही परिशुद्धता के वास्तविक और जटिल मानक के समान ही संख्या को मजबूर किया जाता है। –

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