2011-12-10 7 views
5

(para el lenguaje de programación "D")inicializar un array asociativo de los valores y de cadena struct teclas

He estado luchando tratando de inicializar una matriz asociativa que tiene elementos struct y debe ser indexable por una cuerda . Lo importaría como un módulo de un archivo separado.

Esto es lo que quiero lograr (y no funciona --- No sé si esto es posible):

mnemonic_info[string] mnemonic_table = [ 
     /* name,   format,   opcode */ 
     "ADD": {mnemonic_format.Format3M, 0x18}, 
     ... 

     /* NOTE: mnemonic_format is an enum type. */ 
     /* mnemonic_info is a struct with a mnemonic_format and an ubyte */ 
]; 

Tenga en cuenta que esto funciona bien para las matrices indexables por los números enteros .

De manera óptima, me gustaría que este ser evaluados en tiempo de compilación, ya que no voy a cambiarlo. Sin embargo, si no es posible, me alegraría si me dijera la mejor manera de construir dicha matriz en/antes del tiempo de ejecución inmediato.

Lo necesito porque estoy escribiendo un ensamblador.

He buscado SO y los Internet para una respuesta, pero sólo pude encontrar ejemplos con números enteros, y otras cosas que no entendía o no podía hacer trabajar.

me gusta mucho D hasta ahora, pero parece difícil de aprender debido a que hay muchos tutoriales no estar en línea.

Gracias!

En una nota: es posible usar tuplas para los elementos de matriz asociativa en lugar de una estructura personalizada?

Editar

Hay una manera que he encontrado hasta ahora, pero es bastante feo:

mnemonic_info[string] mnemonic_table; 
static this() { // Not idea what this does. 
     mnemonic_info entry; 

     entry.format = mnemonic_format.Format3M; 
     entry.opcode = 0x18; 
     mnemonic_table["ADD"] = entry; 

     /* ... for all entries. */ 
} 
+0

¿Qué error el compilador le da? No veo ningún error en su código, de acuerdo con: http://www.d-programming-language.org/hash-map.html – CedX

+0

Me dan diferentes errores dependiendo de dónde pongo esto. Actualmente, al ponerlo en el nivel superior del archivo .d, aparece "Error: no es un inicializador de matriz asociativa". Supongo que esto significa que la sintaxis está desactivada. Cuando busco el error en Google, no hay hits. El sitio d tampoco enumera la sintaxis especial para los inicializadores de matriz asociativa. Estoy confundido. – Matej

+0

¿Has intentado inicializarlo en varias declaraciones? mnemonic_info [string] mnemonic_table; mnemonic_table ["ADD"] = {mnemonic_format.Format3M, 0x18}; – CedX

Respuesta

6

En D, integrado en los literales de matriz asociativa siempre se crean en tiempo de ejecución, por lo que la inicialización de una la matriz asociativa global al asignarle algún valor en el lugar de declaración es actualmente imposible.

Como usted se encontró, se puede solucionar de que mediante la asignación de un valor de matriz asociativa en module constructor.

El otro problema en el código de inicialización es literales struct. Debería preferir los inicializadores de estructura D-style a los de estilo C.

Ejemplo:

struct Foo { 
    int a; 
    string b; 
} 

Foo[string] global; 

static this() { 
    global = [ 
     "foo" : Foo(1, "hurr"), 
     "bar" : Foo(2, "durr") 
    ]; 
} 

void main() { 
    assert(global["foo"].a == 1); 
} 
+0

¡Gracias! Justo lo que estaba buscando. No estaba al tanto de los inicializadores de estructura D-style. He leído muchas páginas sobre esto hoy y no lo he visto en ninguna parte. Además, ¿qué pasa con la sintaxis 'Foo (a: 1, b:" hurr ")'? No parece funcionar, pero se menciona en todas partes. :/ – Matej

+0

especificando qué miembro de la estructura que está inicializando está restringido a los inicializadores de estructuras estilo C. Es posible que desee presentar una solicitud de mejora para permitirlos en los inicializadores de estilo D – Nekuromento

+0

Cuando intento utilizar los inicializadores de estilo C, ni siquiera funcionan. :/ Solo tengo 2 miembros, así que no es tan importante, pero aún así. – Matej

Cuestiones relacionadas