2012-12-13 23 views
6

काम नहीं कर रहा है मैं वर्तमान में डी सीख रहा हूं और बच्चे के कदम उठा रहा हूं, इसलिए कृपया मेरे साथ भालू।पुस्तक से कोड

मैं किताब बस शीर्षक "डी प्रोग्रामिंग भाषा" पढ़ रहा हूँ। मैं अपने कोड के लिए डी-आईडीई का उपयोग कर रहा हूं। मैं वर्तमान में एक प्रोग्राम लिख रहा हूं, जो कि शब्द की शब्दावली (शब्दकोश) में शब्दों को जोड़ना है यदि पुस्तक में पहले से ही शब्द नहीं है।

समस्या यह है, कि कोड पुस्तक प्रदान करता है अमान्य है, और बदले में सिर्फ पर चलती और पढ़ने क्या परिणाम होना चाहिए आदि मैं कोशिश करते हैं और इसे हल करना चाहता था की। बेशक एक समस्या यह है कि मैं बहुत डी

कोड के लिए नया हूँ लग रहा है जैसे:

import std.stdio, std.string; 

void main() { 
    uint[string] dictionary; 
    foreach(line; stdin.byLine()) { 
    // Break sentence into words 
    // Add each word in the sentence to the vocabulary 
     foreach(word; splitter(strip(line))) { 
      if(word in dictionary) continue; // Nothing to do 
      auto newID = dictionary.length; 
      dictionary[word] = newID; 
      writeln(newID, '\t', word); 
     } 
    } 
} 

आईडीई Error: undefined identifier splitter कहते हैं और जब से मैं बहुत जावा के साथ अनुभव कर रहा हूँ, मुझे लगता है कि त्रुटि का अर्थ है कि विधि अस्तित्व में नहीं है और यह एक चर के रूप में इसे संभालने की कोशिश करने के लिए है, लेकिन यह भी मौजूद नहीं है। तो मैंने इसे बदले में "विभाजित" करने की कोशिश की। Error: associative arrays can only be assigned values with immutable keys, not char[]

इसलिए मैं वास्तव में इस का समाधान है और यह काम करने के लिए क्या करना है पता नहीं है: यह कह शब्दकोश में एक और त्रुटि का उत्पादन। तो किताबों से कोड जब आपको सिखाने के लिए माना जाता है तो निराशाजनक, काम नहीं करते हैं। मैं dmd2 का उपयोग कर रहा हूँ।

+1

तुम्हें यकीन पुस्तक प्रतिसाद नहीं 'डी प्रोग्रामिंग भाषा' नहीं कहा जाता है? वह नमूना और हालिया उपकरणों के साथ इसे संकलित करने वाली समस्याएं [शक्तिशाली परिचित] (http://erdani.com/tdpl/errata/) ... – shambulator

+0

हां यह वह पुस्तक है। जब मुझे पुस्तक मिली तो मुझे उसमें से कोई भी नहीं मिला .. <। < – OmniOwl

+0

दुर्भाग्य से प्रकाशित होने के बाद से कुछ चीजें बदल गई हैं, लेकिन यह पुस्तक अभी भी उपलब्ध है और डी पर उपलब्ध सर्वोत्तम संसाधनों में से एक है, साथ ही बस आम तौर पर एक बहुत अच्छी तकनीकी किताब। – shambulator

उत्तर

10

जो स्प्लिटर आप चाहते हैं वह std.algorithm.iteration मॉड्यूल (पहले std.array) में स्थित है, लेकिन यह 2016 में स्थानांतरित हो गया है)। इसे अपने आयात में जोड़ें और इसे दूर जाना चाहिए।

दूसरी बात यह शब्दकोश [शब्द] है। इसके बजाय शब्दकोश [word.idup] होना होगा।

कि के लिए कारण (स्मृति आवंटन से बचने के अधिकतम प्रदर्शन के लिए) एक अस्थायी बफर में है लाइन stdin.byLine द्वारा लाया है। जब आपको अगली पंक्ति मिलती है, तो यह पिछले एक को ओवरराइट कर देगी।

आप एक ए.ए. में है कि नहीं चाहते हैं: कुंजी सभी उलझन में मिल जाएगा। .idup एक प्रतिलिपि बनाता है जो कभी नहीं बदलता है।

(कारण पुस्तक idup नहीं है शायद कि कोड वहाँ संकलित करने के लिए प्रयोग किया जाता है क्योंकि, लेकिन यह वास्तव में काम नहीं किया सही तो यह है कि एक बग माना जाता था है।)

+0

इसे ठीक करने के लिए माना जाता है। यद्यपि मूर्खतापूर्ण तरह। आईडीई यह भी नहीं दिखाता है कि मैं डॉट कनेक्टर x.x के साथ शब्द पर कुछ डाल सकता हूं धन्यवाद! – OmniOwl

+0

हालांकि त्वरित प्रश्न। मैंने एक कथन दिया है कि यदि शब्द बाहर निकला है और शब्दकोष शब्दकोश में पहले से मौजूद है, तो प्रोग्राम से बाहर निकलें। हालांकि मैं इसे प्रोग्राम से बाहर कैसे निकालूं? ब्रेक का उपयोग करने से कुछ भी नहीं हुआ। – OmniOwl

+2

दो तरीके हैं जो आप कर सकते हैं: सबसे आसान तरीका सिर्फ वापस लौटना है; तोड़ने के बजाय। या आप बाहरी पाश को तोड़ सकते हैं, जिसका मतलब है कि उस पर एक लेबल डालना: outer_loop: foreach (line; stdin.byLine) ऊपर ऊपर और फिर outer_loop तोड़ें; जब आप बाहर निकलना चाहते हैं (यह जावा सुविधा के समान है)। –