2009-08-24 9 views
3

À l'aide de ma quête personnelle pour remplir SO avec des questions D (= p), j'ai rencontré un autre problème; initialiser un tableau de structures globalement. Observer:Comment initialiser un tableau global de structures dans D?

struct A 
{ 
    int a; 
    float b; 
} 

A[2] as; 
as[0] = {0, 0.0f}; 
as[1] = {5, 5.2f}; 

void main() {} 

Résultats dans:

$ dmd wtf.d 
wtf.d(8): no identifier for declarator as[0] 
wtf.d(9): no identifier for declarator as[1] 

En regardant à travers la documentation à Digital Mars, je ne vois pas vraiment quoi que ce soit tout à fait évident pour moi, donc je tourner une fois de plus aux habitants courageux de Stack Overflow ! Je suppose que le message d'erreur n'a pas grand chose à voir avec le vrai problème, aussi sûrement que [0] est un identificateur (mais dmd pense que c'est un déclarateur, lequel AFAICT regarde par-dessus le docs, ce n'est pas le cas) ?

Répondre

6

Je ne pense pas que vous pouvez initialiser des éléments par élément comme cela. Cela fonctionnerait-il?

A[2] as = [ 
    {0, 0.0f}, 
    {5, 5.2f} 
]; 

ce qui se passerait si, dans votre exemple, vous avez mentionné as[0] plus d'une fois:

as[0] = {0, 0.0f}; 
as[0] = {1, 1.0f}; 

Qu'est-ce que la valeur de as[0] être à l'initialisation du programme? Cela devient plus comme les déclarations plutôt que initialisers.

Notez que dans D, vous pouvez initialiser les éléments du tableau à indices spécifiques comme celui-ci:

A[2] as = [ 
    0: {0, 0.0f}, 
    1: {5, 5.2f} 
]; 

Ce serait utile si vous avez un tableau plus grand (comme A[10]) et seulement besoin d'initialiser certains des éléments. Voir Arrays dans la documentation de référence D pour plus d'informations.

+1

D'oh. J'ai essayé ceci, mais j'ai oublié que j'utilisais D et que je faisais la syntaxe {{}, {}} de style C. Merci. – Bernard

+0

+1, D attend des déclarations, et non des instructions, au niveau supérieur d'un module. Pour les valeurs initiales qui ne peuvent pas être calculées au moment de la compilation, vous pouvez également utiliser un initialiseur de module. – shambulator

3

Cela fonctionne aussi si vous voulez faire un par un initialisation

struct A 
{ 
    int a; 
    float b; 
} 

A[2] as; 
as[0] = A(0, 0.0f); 
as[1] = A(5, 5.2f); 

void main() {} 

Chaque struct obtient un constructeur par défaut en prenant chacun des args dans l'ordre si vous ne définissez pas explicitement un constructeur (c.-à- opCall statique). Voir StructLiteral

Mais l'inconvénient est que cela va probablement initialiser le tableau à la valeur par défaut, puis modifier les valeurs une par une. Il sera donc probablement plus efficace d'utiliser la syntaxe d'initialisation réelle si vous connaissez toutes les valeurs à l'avance.

+0

void initialisers (A [2] as = void;) assurez-vous que la mémoire n'est pas initialisée. Donc c'est génial. Merci. – Bernard

Questions connexes