2009-02-17 34 views
7

Esto puede sonar realmente estúpido. pero tengo un problema extraño con el lenguaje de programación D. Cuando intento crear una nueva matriz de esta manera:D lenguaje de programación char arrays

import std.stdio; 

void main() 
{ 
    char[] variable = "value"; 
    writefln(variable); 
} 

El compilador DMD siempre me da este error:

test.d(5): Error: cannot implicitly convert expression ("value") of type invariant(char[5u]) to char[]

Cualquier idea de por qué? Estoy usando el 2.014 alpha (disponible here) para Ubuntu.

+0

Esa página está desactualizada. Consulte ftp.digitalmars.com para obtener la última versión real de DMD. – dsimcha

+0

Tienes razón, gracias. – user32756

+1

La palabra invariante ha sido reemplazada por inmutable y no existirá en la versión estable de D2.x –

Respuesta

10

que estaba buscando alrededor de la sección de la guía de matrices, esto puede ayudar:

A string is an array of characters. String literals are just an easy way to write character arrays. String literals are immutable (read only).

char[] str1 = "abc";    // error, "abc" is not mutable 
char[] str2 = "abc".dup;   // ok, make mutable copy 
invariant(char)[] str3 = "abc";  // ok 
invariant(char)[] str4 = str1;  // error, str4 is not mutable 
invariant(char)[] str5 = str1.idup; // ok, make invariant copy 

De here.

+0

Muchas gracias, debería haber echado un vistazo a mí mismo. No entiendo todo acerca de lo mutable e inmutable en realidad no. ¿Por qué no puedo simplemente asignar una secuencia de caracteres inmutable a una matriz de caracteres? – user32756

+0

porque su variable es un puntero de array _mutable_ char, es decir, un puntero a la matriz de caracteres variable, y está tratando de hacer que apunte a una matriz de caracteres _inmutable_. – Javier

+0

http://bartoszmilewski.wordpress.com/2009/02/05/immutable-things-where-do-they-all-come-from/ podría valer la pena leer –

9

Básicamente, lo que se reduce a esto es que los literales de cadena se almacenan en una parte de solo lectura de la memoria. char[] es "una matriz mutable de caracteres mutables", que generaría, si se escribe en, un bloqueo en tiempo de ejecución.

Así que el compilador realmente está tratando de protegerlo aquí.

invariant(char)[]significa "una matriz mutable de caracteres invariantes", que es exactamente lo que es.

PS: Cuando no lo hace necesidad que sea un char[], es posible que desee utilizar auto, como en, auto variable = "value". le libera de pensar acerca de su tipo :)

+0

Gracias por la explicación muy clara y simple, FeppingCreature. – user32756

4

el uso de automóviles y no se preocupe lo que el tipo es:

auto s = "some text"; 

dejar que el compilador de preocuparse por el tipo.

4

Hay dos versiones principales del lenguaje D. Son, en general, mutuamente incompatibles entre sí, aunque se puede escribir el código para compilar en ambos.

D1 es lo que el código que ha proporcionado parece estar escrito. No tiene un concepto de matrices inmutables, por lo tanto, esto funciona.

D2 es lo que está tratando de compilar como, por lo tanto, el 2 comienza el número de versión del compilador. Una de las principales características específicas de D2 es este concepto de referencias de datos constantes e inmutables/invariables.

char[] text;    // mutable data 
const(char)[] ctext;  // data may be mutable or immutable - but either way, 
          // it will not be changed through this reference 
invariant(char)[] itext; // immutable data 

literales de cadena en D2 se clasifican como datos inmutables, y por lo tanto no se pueden asignar a un char [], pero sólo un const(char)[] o invariant(char)[] (o wchar o equivalentes Dchar).

string es un alias de invariant(char)[], que es posible que desee utilizar ya sea por comodidad o por compatibilidad D1.

+3

La palabra invariante ha sido reemplazada por inmutable y no existirá en la versión estable de D2.x –

+0

Me referí a la especificación, excepto que digitalmars.com/d/2.0/const3.html parece que finalmente se ha corregido. De acuerdo con la mayoría de las otras páginas, la palabra todavía es invariable. (También creo que encontrarás que invariante siempre será la palabra para invariantes de clase, pero eso es un lado). – Stewart

Cuestiones relacionadas