2012-03-16 30 views
6

Một nền chút: Tôi đang trên Mac OSX Lion (64 bit, rõ ràng) và Tôi là một thời gian dài phát triển Java quan tâm đến việc học tập D.D Loại Automatic lỗi (64 bit vấn đề?)

Tôi nhặt một bản sao của Ngôn ngữ lập trình D và tôi đang bối rối về một vài điều. Thứ nhất, nếu tôi cố gắng một cái gì đó như sau (thẳng từ cuốn sách):

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

tôi nhận được lỗi sau:

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

này được cố định bằng cách thay đổi i-int i.

Tôi nghĩ rằng điều này là do loại tự động cho số trên nền tảng 64 bit là ulong và do đó, suy luận loại không thực sự hiệu quả.

Bây giờ tôi có vấn đề sau đây:

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

Đó trả về lỗi biên dịch sau:

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

sửa Đúc này, nhưng tôi không muốn. Tôi cũng nhận được các lỗi ngớ ngẩn khác liên quan đến việc nhận các giá trị long từ các phép tính và sau đó không thể sử dụng chúng để lập chỉ mục thành các mảng. Hỗ trợ 64 bit của D có phải là chưa đến mức không? Tôi có thể làm gì để tránh rắc rối trong tương lai khi học D? Phải sử dụng rõ ràng các loại phôi và loại ở mọi nơi dường như ngược lại với thứ thu hút tôi đến ngôn ngữ ngay từ đầu ...

+5

Lưu ý: Đây chỉ là "ngớ ngẩn" bởi vì bạn đã không sử dụng C, và trong Java, kiến ​​trúc độc lập mã không thực sự tồn tại. Vì vậy, bạn buộc phải sử dụng số nguyên 32 bit hoặc số nguyên 64 bit trong Java để lập chỉ mục một mảng, trong khi trong C (và D), bạn nên sử dụng 'size_t' khi lập chỉ mục một mảng. Điều này làm cho mã của bạn chính xác hơn nhiều (và nền tảng độc lập), mặc dù tất nhiên, D xử lý việc đánh máy này cho bạn. (Trong cả C và D, 'size_t' hầu như luôn được tự động đặt biệt với một số nguyên 32 bit không dấu hoặc một bit không dấu 64 bit, đó là lý do tại sao bạn nhìn thấy một trong những tên đó thay vì' size_t'.) – Mehrdad

Trả lời

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.

Đúng. Nếu đây là lỗi trong TDPL, có lẽ bạn nên gửi errata. Biến chỉ mục của các câu lệnh foreach thường luôn là loại size_t.

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

Thay đổi mã của bạn để:

size_t i = input.length/2; 

Hoặc thậm chí tốt hơn, do đó bạn không cần phải suy nghĩ về điều này:

auto i = input.length/2; 

Những gì bạn đang nhìn thấy là, trên thực tế , hỗ trợ mảng 64 bit hoàn toàn. size_t phân giải thành loại số nguyên gốc và là thứ được sử dụng để lập chỉ mục mảng và độ dài mảng.

0

về tương lai

với ai đó

int[] months = new int[12]; 
foreach (int i, ref month; months) { 
    month = i + 1; 
} 
Các vấn đề liên quan