2012-01-01 32 views
5

मैंने एक शब्द को लागू करने का प्रयास किया जो फर्थ में स्टैक पर एक नंबर दिया गया था जब एक सरणी से एक स्ट्रिंग पैदा करता है।मैं तारों की सरणी कैसे कार्यान्वित करूं?

मेरी पहली अनुभवहीन प्रयास किया गया था:

create myarray s" Alpha", s" Beta", s" Charlie", 

यह स्वीकार कर लिया गया है, लेकिन यह अपेक्षा के अनुरूप काम नहीं किया - myarray @ type असंगत उत्पादन का उत्पादन (मेरी भोली उम्मीद है कि यह "अल्फ़ा" मुद्रित हो सकता है के बजाय)।

वेब पर खोज करते समय, मुझे this tutorial में मिला कि s" के साथ बनाई गई स्ट्रिंग का सीमित जीवनकाल है जिसका अर्थ है कि मेरा ansatz शुरुआत से विफल हो गया है। दूसरी तरफ, नियमित वस्तुओं के सरणी भी this page के अनुसार मानकीकृत नहीं लगते हैं।

< अद्यतन> जाहिर है, यह फर्थ के साथ एक छोटी सी समस्या नहीं है। वेब पर पुस्तकालय हैं जो गायब स्ट्रिंग कार्यक्षमता को लागू करते हैं: here और here। यह एक अच्छा प्रारंभिक बिंदु है, हालांकि इसे अभी भी तारों की एक सरणी में जाने के लिए काम की आवश्यकता है। </अद्यतन>

तो मैं किसी दिए गए सरणी से स्ट्रिंग लौटने वाले शब्द को कैसे कार्यान्वित कर सकता हूं?

उत्तर

2

अपने कोड के हिस्सों को संबोधित करने के लिए, s" स्टैक पर एक पता, एक पता और लंबाई पर addr u छोड़ देता है। , केवल एक मान स्टोर करता है ताकि आपको वांछित परिणाम प्राप्त न हों। 2, ऐसा कर सकता है क्योंकि स्ट्रिंग का प्रतिनिधित्व करने वाले दोनों स्टैक आइटम स्टोर करेगा। एक बार ऐसा करने के बाद आपको दोनों मानों को वापस प्राप्त करने की आवश्यकता है ताकि [email protected] वह हो जो आप चाहते हैं।

मेरे पुनर्लेखन इस प्रकार दिखाई देगा:

create myarray s" Alpha" 2, s" Beta" 2, s" Charlie" 2, 

\ Test 
myarray [email protected] type Alpha **ok** 

अपने सरणी के अन्य तत्वों पर हो रही है थोड़ा जटिल काम है। जब आप myarray टाइप करते हैं तो आपको उस शब्दकोश प्रविष्टि में डेटा की शुरुआत का पता मिलता है, और फिर आप उन दो चीजों को प्राप्त करने के लिए 2 @ का उपयोग कर सकते हैं जो पहले दो पते इंगित करते हैं (जो "अल्फा" का पता और लंबाई है) । यदि आप चाहते हैं "इतने पर। इसलिए तक पहुँचने के लिए और" बीटा "आप

में प्रवेश करेंगे" बीटा आप पते की अगली जोड़ी की जरूरत है। तो तुम

myarray 2 cells + \ increment the address by two cells 

उपयोग कर सकते हैं पतों कि बात करने के लिए प्राप्त करने के लिए "बीटा

myarray 2 cells + [email protected] type Beta **ok** 

मैं gforth के साथ इस परीक्षण किया है और यह सब काम करने लगता है, हालांकि मुझे यकीन है कि कड़ाई से दृढ़ता के लिए परीक्षण करने के लिए कैसे नहीं हूँ।

आपका शब्द का पता करने के लिए सक्षम करने की आवश्यकता होगी, उसके आधार पर incrementing शुरू करने के लिए ढेर पर है। आप कुछ औरमें प्रवेश करना चाह सकते हैंसामान। मैं कुछ पॉइंटर्स दे सकता हूं लेकिन मैं खोज के मजे को खराब नहीं करना चाहता हूं।

यदि मैं वास्तव में केवल इसका अर्थ कहता हूं, तो मैं बहुत सारे विवरण छोड़ रहा हूं, और मैं फिर कोशिश करूंगा।


शायद यह बहुत कच्चा है, लेकिन मुझे थोड़ी देर पहले "स्ट्रिंग प्रकार" बनाने में जाना पड़ा।

: string         (addr u "name" --) 
    create 2,        \ add address and length to dict entry "name" 
    does> dup cell+ @ swap @ ;    \ push addr u 

\ Example 
s" Some Words" string words **ok** 
word type Some Words **ok** 

ऐसा नहीं है कि लंबाई धक्का और अपने स्ट्रिंग के पते शुरू कर देंगे (इस मामले "शब्दों" में) अपनी पसंद के नाम के साथ एक शब्द को परिभाषित करता है (इस मामले में "कुछ शब्द") जब यह व्याख्या की है। जहां तक ​​मुझे पता है कि स्ट्रिंग इस तरह की परिभाषा में है, यह लगातार है।

यह आपको पूरी तरह से प्रश्न का उत्तर नहीं देता है, लेकिन इससे मदद मिल सकती है।


मैं एक और एक लगातार स्ट्रिंग में जाना, यह एक निश्चित रूप से एक शब्दकोश प्रविष्टि के भीतर allot स्मृति पड़ा है और लंबे समय तक कि शब्द मौजूद है के रूप में के रूप में सुरक्षित हो जाएगा। स्ट्रिंग "टाइप" से पहले केवल उस पते और लंबाई को संग्रहीत किया गया था जो s" बनाया गया था जो स्मृति के उस क्षेत्र पर कुछ और लिखने तक केवल तब तक अच्छा होता है। यह अब स्ट्रिंग को कॉपी करता है जहां से s" इसे "नाम" नामक एक शब्दकोश आइटम में बनाता है जहां इसे "नाम" के रूप में लंबे समय तक चलने की गारंटी दी जाती है।

: string         (addr u "name" --) 
    create         \ create dict entry called "name" 
    dup >r here >r       \ keep copies of string length and start of "name"'s memory 
    dup 2 cells + allot      \ allot memory for the number of chars/bytes of the string plus 2 
              \ for the new addr u 
    [email protected] 2 cells +       \ Get the address two cells from the start the space for "name" 
    swap cmove        \ copy the string at addr u into the alloted space for "name" 

    \ Now "name" looks like this: "name" -blank1- -blank2- "the text of the string at addr u" 
    \ blank1 should be the address of the start of the the text = addr2 and blank2 should be u 

    [email protected] dup 2 cells + swap !     \ get the address of blank1, copy it, increment by 2 to get addr2 
              \ and then store that in blank1 
    r> cell+ r> swap !      \ get address of blank1, increment to get address of blank2, then get u and 
              \ store it in blank2 

    \ Now "name" looks like this: "name" addr2 u "the text of the string at addr u" 

    does> dup @ swap cell+ @ ;    \ push addr2 u 

मनोरंजन के लिए, मैंने सोचा कि मैं कितना कम समझ में यह सहायक प्रारूपण के बिना बनाता है

: string-no-comments   (addr u "name" --) 
    create dup >r here >r dup 2 cells + allot [email protected] 
    2 cells + swap cmove [email protected] dup 2 cells + swap ! 
    r> cell+ r> swap ! does> dup @ swap cell+ @ ; 
+1

असल में दिखाई दे सकते हैं, मैं बिंदु जहां 'पर" टिप्पणी जब तक पालन कर सकते हैं पैदा करता है> ' सामान "। मुझे बाकी को समझने के लिए गहरी खुदाई करने की आवश्यकता होगी। इसके अलावा मुझे लगता है कि आपने मेरी समस्या हल की है (दृढ़ता के संभावित खुले मुद्दे के साथ जो GForth मैन्युअल में स्पष्ट रूप से बुरी तरह से दस्तावेज है)। धन्यवाद! – user8472

+0

हाँ, जो बेहद अस्पष्ट था, मूल रूप से मुझे यकीन नहीं था कि थोड़ी देर के लिए इसके बारे में सोचने के बिना इसे कैसे किया जाए। ऐसा लगता है कि परिभाषा में कुछ भी लगातार है (यही वह है जो मैंने मैनुअल से लिया था)। – sheepez

+0

@ user8472 मैं बस आपको अपने संपादन में सतर्क करना चाहता था, नया संस्करण निश्चित रूप से लगातार है। – sheepez

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