Estou tentando fazer uma série de estruturas onde cada estrutura representa um corpo celeste.
Não tenho muita experiência com structs, por isso decidi tentar usá-los em vez de um monte de arrays. No entanto, continuo encontrando vários erros diferentes. Tentei implementar as técnicas que vi em vários threads e no StackOverflow (como Array de structs em C e C - inicializar array de structs ), mas nem todos eram aplicáveis.
Mais informações para quem leu até aqui: Não preciso que nada disso seja dinâmico, sei / defino o tamanho de tudo de antemão. Eu também preciso que isso seja uma matriz global, pois estou acessando isso em vários métodos diferentes que têm argumentos definidos (ou seja, métodos GLUT).
É assim que estou definindo a estrutura em meu cabeçalho:
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
Eu tenho uma lista de outras variáveis globais que estou definindo antes de definir o interior da estrutura, e uma delas é a matriz dessa estrutura (basicamente, se estou sendo muito confuso em minha fala nebulosa, a linha abaixo está acima do material acima):
struct body bodies[n];
Só para você saber, n
é algo que eu defini legitimamente (isto é #define n 1
).
Eu uso esse array em vários métodos diferentes, mas o mais fácil e que menos ocupa espaço é uma forma simplificada do meu principal. Aqui eu inicializo todas as variáveis em cada uma das estruturas, apenas para definir as variáveis com certeza antes de modificá-las de alguma forma:
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;
}
O erro atual que estou enfrentando é nbody.c:32:13: error: array type has incomplete element type
onde a linha 32 é onde estou criando a matriz das estruturas.
Um último esclarecimento, por cabeçalho quero dizer o espaço acima, int main(void)
mas no mesmo *.c
arquivo.
struct body bodies[n];
antes dastruct body {}
declaração?Respostas:
isso funciona bem. a propósito, sua pergunta não foi muito clara, portanto, combine o layout de seu código-fonte com o acima.
fonte
Acho que você também poderia escrever assim. Eu também sou um estudante, então entendo sua luta. Resposta um pouco atrasada, mas ok.
fonte
Então, para juntar tudo usando
malloc()
:fonte
sizeof *students
é a mesma coisa e não será errado se ALUNO algum dia mudar.sizeof *students
é o tamanho do que está apontado , ou sejasizeof(STUDENT)
, nãosizeof(STUDENT*)
. Você está cometendo exatamente o erro contra o qual optr = malloc(num * sizeof *ptr)
idioma deve se proteger. Verifique aqui (observe que o servidor, como a maioria dos PCs modernos, tem ponteiros de 8 bytes, então os tamanhos são 8 e 32 em vez de 4 e 20).mover
para depois
Descansar tudo parece bem.
fonte
Outra maneira de inicializar uma matriz de estruturas é inicializar os membros da matriz explicitamente. Essa abordagem é útil e simples se não houver muitos membros de estrutura e matriz.
Use o
typedef
especificador para evitar reutilizar astruct
instrução sempre que declarar uma variável de estrutura:Em seguida, declare sua matriz de estruturas. A inicialização de cada elemento acompanha a declaração:
Para repetir, esta é uma solução bastante simples e direta se você não tiver muitos elementos de matriz e grandes membros de estrutura e se, como você afirmou, não estiver interessado em uma abordagem mais dinâmica. Essa abordagem também pode ser útil se os membros de struct forem inicializados com variáveis enum nomeadas (e não apenas números como o exemplo acima), por meio do qual dá ao leitor de código uma visão geral melhor do propósito e função de uma estrutura e seus membros em certos formulários.
fonte
Esse erro significa que o compilador não é capaz de encontrar a definição do tipo de sua estrutura antes da declaração da matriz de estruturas, já que você está dizendo que tem a definição da estrutura em um arquivo de cabeçalho e o erro está em
nbody.c
então você deve verificar se está incluindo corretamente o arquivo de cabeçalho. Verifique o seu#include
e certifique-se de que a definição da estrutura foi feita antes de declarar qualquer variável desse tipo.fonte
main
declaração.Solução usando ponteiros:
fonte