2012-03-16 16 views
6

एक छोटी सी पृष्ठभूमि: मैं मैक OSX शेर पर हूँ (64 बिट, जाहिर है) और मैं एक लंबे समय जावा डेवलपर डीडी स्वत: प्रकार त्रुटियाँ (64 बिट मुद्दा?)

सीखने में दिलचस्पी मैं उठाया हूँ एक की प्रति डी प्रोग्रामिंग भाषा और मैं कुछ चीजों पर उलझन में हूं। सबसे पहले, अगर मैं निम्नलिखित (किताब से सीधे) की तरह कुछ प्रयास करें:

int[] months = new int[12]; 
foreach (i, ref month; months) { 
    month = i + 1; 
} 

मैं निम्नलिखित त्रुटि मिलती है:

Error: cannot implicitly convert expression (i + 1LU) of type ulong to int

यह int i करने के लिए i बदलकर तय हो गई है।

मुझे लगता है कि ऐसा इसलिए है क्योंकि 64 बिट प्लेटफ़ॉर्म पर संख्याओं के लिए स्वचालित प्रकार ulong है और इसलिए टाइप अनुमान वास्तव में काम नहीं करता है।

bool binarySearch(T)(T[] input, T value) { 
    // ... 
    int i = input.length/2; 
    // ... 
} 

निम्नलिखित संकलन त्रुटि देता है कि:

अब मैं निम्नलिखित समस्या है

Error: cannot implicitly convert expression (input.length/2LU) of type ulong to int

कास्टिंग फिक्स यह है, लेकिन मैं नहीं बल्कि नहीं था। मुझे गणना से long मान प्राप्त करने से संबंधित अन्य मूर्ख त्रुटियां भी मिलती हैं और फिर उन्हें सरणी में अनुक्रमणित करने के लिए उपयोग करने में सक्षम नहीं होती है। क्या डी 64 का समर्थन सिर्फ अभी तक नहीं है? डी सीखते समय भविष्य में परेशानी से बचने के लिए मैं क्या कर सकता हूं? स्पष्ट रूप से हर जगह डाले और प्रकार का उपयोग करने के बाद क्या पहली जगह में भाषा के लिए मुझे आकर्षित के विपरीत होने के लिए ...

+5

नोट: यह केवल "मूर्खतापूर्ण" क्योंकि आप सी इस्तेमाल नहीं किया है है, और जावा में, वास्तुकला स्वतंत्र कोड वास्तव में मौजूद नहीं है। इसलिए आपको या तो सरणी को इंडेक्स करने के लिए जावा में 32-बिट पूर्णांक या 64-बिट पूर्णांक का उपयोग करने के लिए मजबूर होना पड़ता है, जबकि सी (और डी) में, आपको सरणी को अनुक्रमणित करते समय 'size_t' का उपयोग करना चाहिए। यह आपके कोड को और अधिक सही (और मंच-स्वतंत्र) बनाता है, बेशक, डी आपके लिए इस टाइपिंग को संभालता है। (सी और डी दोनों में, 'size_t' लगभग हमेशा एक हस्ताक्षरित 32-बिट पूर्णांक या एक हस्ताक्षरित 64-बिट के लिए स्वचालित रूप से अलियाकृत होता है, यही कारण है कि आप' size_t' के बजाय उन नामों में से एक को देख रहे हैं।) – Mehrdad

उत्तर

10

I think this is because the automatic type for numbers on a 64 bit platform is ulong and so type inference doesn't really work out.

सही लगता है। यदि यह टीडीपीएल में एक त्रुटि है, तो आपको शायद इरेटा जमा करना चाहिए। foreach कथन का सूचकांक चर आमतौर पर size_t प्रकार का होता है।

auto i = input.length/2; 

आप जो देख रहे वास्तव में, यह है: तो तुम इस बारे में सोचने की जरूरत नहीं है,

size_t i = input.length/2; 

या और भी बेहतर:

Error: cannot implicitly convert expression (input.length/2LU) of type ulong to int

करने के लिए अपने कोड को बदलें , पूर्ण-उड़ा 64-बिट सरणी समर्थन। size_t देशी पूर्णांक प्रकार का समाधान करता है, और सरणी अनुक्रमण और सरणी लंबाई के लिए उपयोग किया जाता है।

0
भविष्य

पर

किसी को

int[] months = new int[12]; 
foreach (int i, ref month; months) { 
    month = i + 1; 
} 
संबंधित मुद्दे