Estoy tratando de hacer una serie de estructuras donde cada estructura representa un cuerpo celeste.
No tengo tanta experiencia con estructuras, por lo que decidí intentar usarlas en lugar de un montón de matrices. Sin embargo, sigo encontrándome con numerosos errores diferentes. Intenté implementar las técnicas que he visto en varios subprocesos y en StackOverflow (como Matriz de estructuras en C y C - inicializar matriz de estructuras ), sin embargo, no todas eran aplicables.
Más información para los que han leído hasta aquí: No necesito nada de esto para ser dinámico, sé / defino el tamaño de todo de antemano. También necesito que esto sea una matriz global ya que estoy accediendo a esto en varios métodos diferentes que tienen argumentos definidos (es decir, métodos GLUT).
Así es como estoy definiendo la estructura en mi encabezado:
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
Tengo una lista de otras variables globales que estoy definiendo antes de definir el interior de la estructura, y una de ellas es la matriz de esta estructura (básicamente, si no estoy muy claro en mi discurso empañado, la línea de abajo está por encima de lo anterior):
struct body bodies[n];
Para que lo sepas, n
es algo que he definido legítimamente (es decir #define n 1
).
Utilizo esta matriz en varios métodos diferentes, pero el más fácil y que consume menos espacio es una forma simplificada de mi archivo main. Aquí inicializo todas las variables en cada una de las estructuras, solo para establecer las variables con certeza antes de modificarlas de alguna manera:
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;
}
El error actual al que me enfrento es nbody.c:32:13: error: array type has incomplete element type
donde la línea 32 es donde estoy haciendo la matriz de estructuras.
Una última aclaración, por cabecera me refiero al espacio de arriba int main(void)
pero en el mismo *.c
archivo.
struct body bodies[n];
antes de lastruct body {}
declaración?Respuestas:
esto funciona bien. Por cierto, su pregunta no fue muy clara, así que haga coincidir el diseño de su código fuente con el anterior.
fuente
Creo que también podrías escribirlo de esa manera. También soy estudiante, así que entiendo tu lucha. Respuesta un poco tardía pero bien.
fuente
Entonces, para ponerlo todo junto usando
malloc()
:fuente
sizeof *students
es lo mismo y no estará mal si el ESTUDIANTE cambia alguna vez.sizeof *students
es el tamaño de lo que se apunta , es decirsizeof(STUDENT)
, nosizeof(STUDENT*)
. Estás cometiendo el error exacto del queptr = malloc(num * sizeof *ptr)
se supone que debe protegerse el idioma. Compruébelo aquí (tenga en cuenta que el servidor, como la mayoría de las PC modernas, tiene punteros de 8 bytes, por lo que los tamaños son 8 y 32 en lugar de 4 y 20).moverse
Después
Descansar todo se ve bien.
fuente
Otra forma de inicializar una matriz de estructuras es inicializar los miembros de la matriz explícitamente. Este enfoque es útil y simple si no hay demasiados miembros de estructura y matriz.
Utilice el
typedef
especificador para evitar volver a utilizar lastruct
declaración cada vez que declare una variable de estructura:Luego declare su matriz de estructuras. La inicialización de cada elemento va junto con la declaración:
Para repetir, esta es una solución bastante simple y directa si no tiene demasiados elementos de matriz y miembros de estructura grandes y si, como dijo, no está interesado en un enfoque más dinámico. Este enfoque también puede ser útil si los miembros de la estructura se inicializan con variables enum nombradas (y no solo números como el ejemplo anterior) por lo que le da al lector de código una mejor descripción general del propósito y función de una estructura y sus miembros en ciertos aplicaciones.
fuente
Ese error significa que el compilador no puede encontrar la definición del tipo de su estructura antes de la declaración de la matriz de estructuras, ya que está diciendo que tiene la definición de la estructura en un archivo de encabezado y el error está en
nbody.c
ese momento. debe verificar si está incluyendo correctamente el archivo de encabezado. Verifique sus#include
y asegúrese de que la definición de la estructura esté hecha antes de declarar cualquier variable de ese tipo.fuente
main
declaración.Solución usando punteros:
fuente