2010-10-12 5 views
0

Ok les gars, nous savons tous qu'il y a beaucoup de questions typedef/struct là-bas, mais je pense que celui-ci est un peu un esprit bender. Je simule les interactions voisines d'un réseau cristallin en utilisant strictement C. J'ai une structure appelée "ball_struct" que j'ai typé comme "ball". La structure contient un pointeur vers une liste de ball_structs (puisque je ne pouvais pas utiliser le nom typedef avant sa propre déclaration) que la balle considère ses voisins.Référencer un typedef comme struct homologue

Donc, voici la capture: Je veux ajouter des balles à cette liste de la liste des voisins ball_struct. Quand je compile (dans Visual Studio 2009, pas de support CLR) je reçois:

error C2440: '=' : cannot convert from 'ball *' to 'ball_struct'

Je ne suis pas surpris, mais je suis perplexe. Existe-t-il un moyen de redéfinir le typedef à sa structure respective? Sinon, est-ce que je peux ajouter une "boule" à une liste "ball_struct" donc je ne dois pas enlever le typedef et coller les mots-clés "struct" partout dans mon code? Voici le code en question:

Le struct/typedef:

typedef struct ball_struct 
{ 
    double mass; 
    vector pos, vel, acc; 

    /* keep list of neighbors and its size */ 
    struct ball_struct *neighbors; 
    int numNeighbors; 
} ball; 

Et la fonction erronée:

/* adds ball reference to the neighbor list of the target */ 
void addNeighbor(ball *target, ball *neighbor) 
{ 
    int n = target->numNeighbors; 
    target->neighbors[n] = neighbor;  // error C2440 
    target->numNeighbors = n+1; 
} 

Merci, toute aide est appréciée. Rappelez-vous, seulement des solutions pour C s'il vous plaît.

+1

Vous pourriez écrire: 'typedef struct ball_struct ball; 'et ensuite' struct ball_struct {...; balle * voisins; ...}; ' –

Répondre

3

Sur la ligne où vous obtenez l'erreur:

target->neighbors[n] = neighbor; 

vous assigner un pointeur (neighbor) à une structure réelle (pas un pointeur vers une structure). Notez que si vous regardez attentivement le message d'erreur, vous verrez que c'est ce qu'il dit. Notez l'astérisque dans le 'de' type, il parle de:

cannot convert from 'ball *' to 'ball_struct' 

En supposant que target->neighbors des points à un tableau de ball_struct structures, je pense que ce que vous voulez faire est:

target->neighbors[n] = *neighbor; 

PS: vous pouvez envisager d'utiliser le même nom pour votre structure et le typedef de la structure:

typedef struct ball 
{ 
    /* etc... */ 
} ball; 

Bien que le compilateur pré-ANSI n'ait peut-être pas supporté cela (Why are structure names different from their typedef names?), il est certainement bien supporté aujourd'hui. Et je pense que cela rend les choses un peu moins confuses.

+0

Ou vous pourriez simplement avoir 'typedef struct {...} ball;' - mais alors vous ne pouvez pas vous référer 'struct ball', seulement' ball'. – detly

+0

Eh bien, je suppose que cela s'est avéré être une diatribe excessive à propos de l'évidence et de trop penser à mes problèmes. Ça l'a réparé, merci! – BradV

+1

@Brad: Je devrais probablement aussi vous demander si vous avez alloué de l'espace (en utilisant 'malloc()' ou 'calloc()', par exemple) pour le tableau de 'struct ball_struct' que' neighbors' pointe vers? –