Question

Cela peut paraître vraiment stupide. mais j'ai un problème étrange avec le langage de programmation D. Lorsque je tente de créer un nouveau tableau comme ceci:

import std.stdio;

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

Le compilateur DMD me donne toujours cette erreur:

  

test.d (5): Erreur: pas implicitement   convertir l'expression ( "valeur") de type   invariant (char [5u]) pour char []

Une idée pourquoi? J'utilise le 2,014 alpha (disponible ) pour Ubuntu.

Était-ce utile?

La solution

Je cherchais autour de la section des tableaux du guide, cela peut aider:

Une chaîne est un tableau de caractères. Les chaînes littérales sont juste un moyen facile d'écrire des tableaux de caractères. Les chaînes littérales sont immuables (lecture seule).

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 .

Autres conseils

En fait, ce qu'il revient à dire que la chaîne littéraux sont stockés dans une partie en lecture seule de la mémoire. char[] est "un tableau mutable de caractères mutables" , qui, si elle était écrite, générer un accident d'exécution.

Alors que le compilateur essaie vraiment de vous protéger ici.

moyens de invariant(char)[] "un tableau mutable de caractères invariants" , ce qui est exactement ce qu'il est.

PS : Quand vous faites pas besoin pour être un char[], vous voudrez peut-être utiliser auto, comme dans auto variable = "value". vous Libère de penser à son type:)

utiliser auto et ne vous inquiétez pas ce que le type est:

auto s = "some text";

laisser le souci du compilateur sur le type.

Il existe deux versions principales de la langue D. Ils sont, en général, mutuellement incompatibles les uns avec les autres, même si le code peut écrire à compiler dans les deux.

D1 est ce que le code fourni semble être écrit. Il ne dispose pas d'un concept de tableaux immuables, donc cela fonctionne.

D2 est ce que vous essayez de le compiler comme, d'où le 2 commençant le numéro de version du compilateur. L'une des principales caractéristiques spécifiques-D2 est ce concept de références de données const et immuables / invariantes.

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

string littéraux dans D2 sont considérés comme des données immuables, et ne peut donc être affecté à un char [], mais seulement un ou const(char)[] invariant(char)[] (ou wchar ou équivalents Dchar).

string est un alias de invariant(char)[], que vous pouvez utiliser soit pour des raisons pratiques ou pour la compatibilité D1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top