2009-04-07 6 views
7

मेरे पास फोरट्रान 77 के बारे में कोई सवाल है और मुझे कोई समाधान नहीं मिला है।फोरट्रान में स्ट्रिंग्स का ऐरे 77

मैं निम्नलिखित के रूप में परिभाषित तार की एक सरणी स्टोर करने के लिए कोशिश कर रहा हूँ:

character matname(255)*255 

कौन सा लंबाई की 255 तार की एक सरणी है 255

बाद में मैं एक से नामों की सूची पढ़ फ़ाइल और मैं इस तरह सरणी की सामग्री के सेट:

matname(matcount) = mname 

संपादित करें: असल mname मूल्य के रूप में harcoded है mname = 'AIR' टाइप character*255, यह एक फंक्शन matadd() का एक पैरामीटर है जो पिछले पंक्ति को निष्पादित करता है। लेकिन यह केवल परीक्षण के लिए है, भविष्य में इसे एक फाइल से पढ़ा जाएगा।

बाद में मैं के साथ यह प्रिंट करना चाहते हैं:

write(*,*) matname(matidx) 

लेकिन यह, सभी 255 वर्ण मुद्रित करने के लिए लगता है यह स्ट्रिंग मैं सौंपा और कचरा का एक बहुत प्रिंट करता है।

  • तो मेरा सवाल है, मैं संग्रहित स्ट्रिंग की लंबाई कैसे जान सकता हूं?
  • क्या मेरे पास सभी लंबाई के साथ एक और सरणी होनी चाहिए?
  • और मैं स्ट्रिंग की लंबाई को कैसे पढ़ सकता हूं?

धन्यवाद।

+1

+1 - फोरट्रान? क्या आप गंभीर हैं? –

+1

@ इयान - क्यों नहीं? – Rook

उत्तर

4

फ़ंक्शन टिमोटी पोस्ट किए गए फ़ंक्शन की लंबाई आपको तब तक स्ट्रिंग की लंबाई देगी जब तक आप जिस स्ट्रिंग में दिलचस्पी रखते हैं उसमें केवल रिक्त स्थान होते हैं, जो, यदि, आप प्रोग्राम shou में मान असाइन कर रहे हैं एलडी सच हो क्योंकि फोरट्रान को वैरिएबल को खाली होने और अक्षरों के लिए प्रारंभ करने के लिए प्रारंभ किया जाना चाहिए।

हालांकि, अगर आप एक फ़ाइल से में पढ़ रहे हैं आप अन्य नियंत्रण वर्ण लाइनों (अपने ओएस के आधार पर विशेष रूप से गाड़ी वापसी और/या लाइन फ़ीड अक्षर, \ r और/या \ N) के अंत में शामिल कर सकता है । सही स्ट्रिंग लंबाई प्राप्त करने के लिए आपको फ़ंक्शन में उनको टॉस करना चाहिए। अन्यथा आप कुछ मजाकिया प्रिंट स्टेटमेंट प्राप्त कर सकते हैं क्योंकि उन पात्रों को भी मुद्रित किया जाता है।

यहां फ़ंक्शन का मेरा संस्करण है जो रिक्त स्थान के अलावा अंत में वैकल्पिक सफेद स्पेस वर्णों की जांच करता है।

function strlen(st) 
    integer   i,strlen 
    character   st*(*) 
    i = len(st) 
    do while ((st(i:i).eq.' ').or.(st(i:i).eq.'\r').or. 
+ (st(i:i).eq.'\n').or.(st(i:i).eq.'\t')) 
    i = i - 1 
    enddo 
    strlen = i 
    return 
    end 

यदि "कचरा" खंड में अन्य पात्र हैं तो यह अभी भी पूरी तरह से काम नहीं करेगा।

यह मानते हुए कि यह अपने डेटा के लिए काम करता है, फिर भी, आप तो अपने लिखने का बयान इस तरह देखने के लिए बदल सकते हैं:

write(*,*) matname(matidx)(1:strlen(matname(matidx))) 

और यह सिर्फ वास्तविक स्ट्रिंग बाहर प्रिंट होगा।

स्ट्रिंग की लंबाई को पकड़ने के लिए आपको किसी अन्य सरणी का उपयोग करना चाहिए या नहीं, यह आपके ऊपर है। strlen() फ़ंक्शन ओ (एन) है जबकि तालिका में लंबाई को देखना ओ (1) है। यदि आप स्वयं इन स्थिर तारों की लंबाई को कंप्यूटिंग करते हैं, तो यह लंबाई में गणना करने के बाद प्रदर्शन को बेहतर बना सकता है, उन्हें एक सरणी में संग्रहीत करें और यदि आपको उनकी आवश्यकता हो तो उन्हें देखो। हालांकि, अगर आपको मंदी की सूचना नहीं है, तो मैं इसके बारे में चिंता नहीं करता।

+0

मुझे पैरामीटर के रूप में स्ट्रिंग प्राप्त करने वाले फ़ंक्शन की प्रकार परिभाषा को संशोधित करना था: 'character mname * (*)'। इससे पहले, उस चर का अंत यादृच्छिक कचरा था, अब यह रिक्त स्थान के साथ गद्देदार है। स्पष्टीकरण के लिए धन्यवाद, बहुत स्पष्ट था। इसके अलावा मुझे * नोटेशन के बारे में पता नहीं था। – Siu

5

आप लंबाई यहां से

integer function strlen(st) 
     integer  i 
     character  st*(*) 
     i = len(st) 
     do while (st(i:i) .eq. ' ') 
     i = i - 1 
     enddo 
     strlen = i 
     return 
     end 

गॉट (खाली पूंछ के बिना) प्राप्त करने के लिए इस सुविधा का उपयोग कर सकते हैं: http://www.ibiblio.org/pub/languages/fortran/ch2-13.html

पुनश्च: जब आप कहते हैं: matname (matidx) यह पूरी स्ट्रिंग हो जाता है (256) वर्ण ... तो आपकी स्ट्रिंग प्लस रिक्त स्थान या कचरा

+0

+1 लेकिन इच्छा है कि यह और भी हो सकता है। –

+0

भी धन्यवाद, मैं आपको वोट देना चाहता हूं लेकिन मेरे पास अभी भी पर्याप्त प्रतिष्ठा नहीं है। – Siu

1

संकलक है कि आप प्रयोग कर रहे हैं पर निर्भर करता है, आप सामान्य रूप से,/उसके आगे दूर करने के लिए एक स्ट्रिंग से रिक्त स्थान अनुगामी trim() आंतरिक समारोह का उपयोग करने के तो इसे संसाधित सक्षम हो सकता है, यानी

character(len=25) :: my_string 
my_string = 'AIR' 
write (*,*) ':', trim(my_string), ':' 

:AIR: मुद्रित करना चाहिए।

संपादित करें: बेहतर अभी तक ऐसा लगता है कि len_trim() फ़ंक्शन है जो इसे ट्रिम किए जाने के बाद स्ट्रिंग की लंबाई देता है।

0

इंटेल और कॉम्पैक विजुअल फोरट्रान का आंतरिक कार्य LEN_TRIM (STRING) है जो रिक्त स्थान या रिक्त स्थान के बिना लंबाई देता है।

आप प्रमुख कारतूस या रिक्त स्थान को दबाने के लिए चाहते हैं, का उपयोग यानी ADJUSTF (STRING) के

इन FORTRANs में मैं भी एक उपयोगी सुविधा नोट "वाम समायोजित करें": यदि आप एक समारोह या सबरूटीन के रूप में करने के लिए एक स्ट्रिंग पार कर लेते हैं एक तर्क, और subroutine के अंदर इसे वर्णक * (*) के रूप में घोषित किया जाता है, फिर subroutine में LEN (STRING) फ़ंक्शन का उपयोग करके वास्तविक स्ट्रिंग लंबाई को पीछे छोड़ देता है, और कॉलिंग प्रोग्राम में घोषित स्ट्रिंग की लंबाई नहीं ।

उदाहरण: CHARACTER * 1000 STRING

 . 
     . 

    CALL SUBNAM(STRING(1:72) 

    SUBROUTINE SYBNAM(STRING) 
    CHARACTER*(*) STRING 
    LEN(STRING) will be 72, not 1000 
+0

स्ट्रिंग के लिए संरचना का उपयोग करना, और इसकी लंबाई, कभी-कभी समझ में आता है। – Holmz

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