2012-03-16 19 views
6

un poco de historia: Estoy en Mac OS X Lion (64 bits, obviamente) y yo soy un largo tiempo de desarrollo de Java interesado en aprender D.errores D Automatica (Número 64 bits?)

Me recogió una copia de El lenguaje de programación D y estoy confundido en algunas cosas. En primer lugar, si intento algo como lo siguiente (directamente desde el libro):

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

me sale el siguiente error:

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

Esto se corrige cambiando i-int i.

Creo que esto se debe a que el tipo automático para números en una plataforma de 64 bits es ulong y la inferencia de tipo no funciona.

ahora tengo el siguiente problema:

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

que devuelve el siguiente error de compilación:

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

correcciones de lanzar este, pero yo preferiría no hacerlo. También recibo otros errores tontos relacionados con la obtención de valores long de los cálculos y luego no poder usarlos para indexarlos en matrices. ¿El soporte de D de 64 bits aún no está a la altura? ¿Qué puedo hacer para evitar problemas en el futuro mientras estoy aprendiendo D? Tener que utilizar explícitamente moldes y tipos de todo el mundo parece ser lo contrario de lo que me atrajo de la lengua en el primer lugar ...

+5

Nota: Esto sólo es "tonta" porque no ha utilizado C y en Java, código independiente de la arquitectura en realidad no existe. Entonces, o bien se ve obligado a usar enteros de 32 bits o enteros de 64 bits en Java para indexar una matriz, mientras que en C (y D), debe usar 'size_t' al indexar una matriz. Esto hace que su código sea mucho más correcto (e independiente de la plataforma), aunque, por supuesto, D maneja este tipeo para usted. (Tanto en C como en D, 'size_t' casi siempre tiene un alias automático para un entero de 32 bits sin signo o uno de 64 bits sin signo, razón por la cual está viendo uno de esos nombres en lugar de' size_t'). – Mehrdad

Respuesta

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.

correcta. Si esto es un error en TDPL, probablemente deba enviar errata. La variable de índice de las declaraciones foreach suele ser siempre del tipo size_t.

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

cambiar el código para:

size_t i = input.length/2; 

O mejor aún, por lo que no tiene que pensar en esto:

auto i = input.length/2; 

Lo que están viendo es, de hecho, , compatibilidad con arreglos de 64 bits en toda regla. size_t se resuelve con el tipo de entero nativo, y es lo que se usa para indexar matrices y longitudes de matriz.

0

sobre el futuro

a alguien

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