tableaux char langage de programmation D
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.
La solution
Je cherchais autour de la section des tableaux du guide, cela peut aider:
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
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.