J'essaie de créer un tableau de structures où chaque structure représente un corps céleste.
Je n'ai pas beaucoup d'expérience avec les structures, c'est pourquoi j'ai décidé d'essayer de les utiliser au lieu de tout un tas de tableaux. Cependant, je continue à rencontrer de nombreuses erreurs différentes. J'ai essayé d'implémenter les techniques que j'ai vues sur divers threads et sur StackOverflow (comme Array of structs en C et C - initialize array of structs ), mais elles n'étaient pas toutes applicables.
Plus d'informations pour ceux qui ont lu jusqu'ici: Je n'ai besoin de rien de tout cela pour être dynamique, je connais / définit la taille de tout à l'avance. J'ai également besoin que ce soit un tableau global car j'y accède dans plusieurs méthodes différentes qui ont défini des arguments (c'est-à-dire les méthodes GLUT).
Voici comment je définis la structure dans mon en-tête:
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
J'ai une liste d'autres variables globales que je définis avant de définir l'intérieur de la structure, et l'une d'elles est le tableau de cette structure (en gros, si je ne suis pas trop clair dans mon discours brumeux, la ligne ci-dessous est au-dessus des éléments ci-dessus):
struct body bodies[n];
Juste pour que vous le sachiez, n
c'est quelque chose que j'ai légitimement défini (ie #define n 1
).
J'utilise ce tableau dans plusieurs méthodes différentes, mais la plus simple et la moins encombrante est une forme simplifiée de mon main. Ici, j'initialise toutes les variables dans chacune des structures, juste pour définir les variables avec certitude avant de les modifier d'une manière ou d'une autre:
int a, b;
for(a = 0; a < n; a++)
{
for(b = 0; b < 3; b++)
{
bodies[a].p[b] = 0;
bodies[a].v[b] = 0;
bodies[a].a[b] = 0;
}
bodies[a].mass = 0;
bodies[a].radius = 1.0;
}
L'erreur actuelle à laquelle je suis confronté est celle nbody.c:32:13: error: array type has incomplete element type
où la ligne 32 est l'endroit où je crée le tableau des structures.
Une dernière précision, par en-tête j'entends l'espace ci-dessus int main(void)
mais dans le même *.c
fichier.
struct body bodies[n];
avant lastruct body {}
déclaration?Réponses:
cela fonctionne très bien. votre question n'était pas très claire d'ailleurs, alors faites correspondre la mise en page de votre code source avec ce qui précède.
la source
Je pense que vous pourriez aussi l'écrire de cette façon. Je suis également étudiant, donc je comprends votre combat. Réponse un peu tardive mais ok.
la source
Donc, pour tout mettre ensemble en utilisant
malloc()
:la source
sizeof *students
c'est la même chose et ce ne sera pas mal si l'ÉTUDIANT change un jour.sizeof *students
est la taille de ce qui est pointé , c'est- à -diresizeof(STUDENT)
nonsizeof(STUDENT*)
. Vous faites exactement l'erreur contre laquelle l'ptr = malloc(num * sizeof *ptr)
idiome est censé se prémunir. Vérifiez-le ici (notez que le serveur, comme la plupart des PC modernes, a des pointeurs de 8 octets donc les tailles sont 8 et 32 au lieu de 4 et 20).bouge toi
à après
Reste tout va bien.
la source
Une autre façon d'initialiser un tableau de structures consiste à initialiser explicitement les membres du tableau. Cette approche est utile et simple s'il n'y a pas trop de membres de structure et de tableau.
Utilisez le
typedef
spécificateur pour éviter de réutiliser l'struct
instruction à chaque fois que vous déclarez une variable struct:Déclarez ensuite votre tableau de structures. L'initialisation de chaque élément va de pair avec la déclaration:
Pour répéter, c'est une solution plutôt simple et directe si vous n'avez pas trop d'éléments de tableau et de grands membres de structure et si, comme vous l'avez dit, vous n'êtes pas intéressé par une approche plus dynamique. Cette approche peut également être utile si les membres de la structure sont initialisés avec des variables enum nommées (et pas seulement des nombres comme l'exemple ci-dessus), ce qui donne au lecteur de code un meilleur aperçu de l'objectif et de la fonction d'une structure et de ses membres dans certains applications.
la source
Cette erreur signifie que le compilateur n'est pas en mesure de trouver la définition du type de votre struct avant la déclaration du tableau de structs, puisque vous dites que vous avez la définition de la structure dans un fichier d'en-tête et que l'erreur est
nbody.c
là vous devriez vérifier si vous incluez correctement le fichier d'en-tête. Vérifiez les vôtres#include
et assurez-vous que la définition de la structure est effectuée avant de déclarer une variable de ce type.la source
main
déclaration.Solution utilisant des pointeurs:
la source