2012-03-16 10 views
6

Un po' di storia: Sono su Mac OSX Lion (64 bit, ovviamente) e sono un lungo periodo di tempo sviluppatore Java interessati a saperne di D.D tipo automatico degli errori (64 emissione po '?)

ho preso un copia di The D Programming Language e sono confuso su alcune cose. In primo luogo, se provo qualcosa di simile a quanto segue (direttamente dal libro):

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

ottengo il seguente errore:

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

Questa è fissato cambiando i-int i.

Penso che questo sia perché il tipo automatico per i numeri su una piattaforma a 64 bit è ulong e quindi l'inferenza di tipo non funziona.

ora ho il seguente problema:

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

che restituisce il seguente errore di compilazione:

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

Casting consente la correzione, ma io non preferisco. Ottengo anche altri errori stupidi relativi all'ottenimento di valori long dai calcoli e quindi non essere in grado di usarli per l'indicizzazione negli array. Il supporto a 64 bit di D'è ancora in sospeso? Cosa posso fare per evitare problemi in futuro durante l'apprendimento di D? Avendo utilizzare in modo esplicito calchi e tipi in tutto il mondo sembra essere il contrario di quello che mi ha attratto la lingua in primo luogo ...

+5

Nota: Questo è solo "sciocco", perché non è stato utilizzato C, e in Java, il codice architettura indipendente in realtà non esiste. Quindi sei obbligato a usare numeri interi a 32 bit o interi a 64 bit in Java per indicizzare un array, mentre in C (e D), dovresti usare 'size_t' quando indicizzi un array. Ciò rende il tuo codice molto più corretto (e indipendente dalla piattaforma), anche se, naturalmente, D gestisce questa digitazione per te. (Sia in C che in D, 'size_t' è quasi sempre automaticamente alias sia per un intero a 32 bit senza segno che per un 64-bit senza segno, motivo per cui vedi uno di quei nomi invece di' size_t'.) – Mehrdad

risposta

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.

corretta. Se questo è un errore in TDPL, probabilmente dovresti inviare errata. La variabile di indice delle istruzioni foreach è in genere sempre di tipo size_t.

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

modificare il codice per:

size_t i = input.length/2; 

O ancora meglio, in modo da non dovete pensare a questo:

auto i = input.length/2; 

Quello che stai vedendo è, di fatto supporto completo di array a 64 bit. size_t risolve il tipo intero nativo ed è ciò che viene utilizzato per l'indicizzazione degli array e le lunghezze degli array.

0

sul futuro

a qualcuno

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