2012-05-06 19 views
72

Estoy tratando de hacer una serie de estructuras donde cada estructura representa un cuerpo celeste para el problema en el que estoy trabajando en mi clase. No tengo mucha experiencia con las estructuras, por lo que decidí tratar de usarlas en lugar de un conjunto completo de matrices, sin embargo, sigo encontrando numerosos errores diferentes, a pesar de que he intentado implementar las técnicas que he visto en varios subprocesos y en stackoverflow (como en Array of structs in C y C - initialize array of structs), sin embargo, no todos ellos eran aplicables, por lo que no pude copiar completamente la manera de hacerlo. Solo una advertencia antes de mostrarle lo que estoy tratando de hacer, no podré responder a los comentarios/preguntas/respuestas durante varias horas porque necesito acostarme porque he estado despierto durante demasiado tiempo, Realmente lo siento por esto, pero estoy realmente cansado después de haber tenido un día ocupado y haber trabajado en este problema durante varias horas.¿Cómo se hace una serie de estructuras en C?

Más información para quienes han leído esto: no necesito que esto sea dinámico, conozco/defino el tamaño de todo de antemano. También necesito que sea una matriz global (gaspVARIABLES GLOBALES) 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 cabecera:

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 que yo defino el interior de la estructura, y una de ellas es la matriz de esta estructura (básicamente, si estoy siendo demasiado claro en mi hablar empañado, la línea de abajo está por encima de las cosas de arriba):

struct body bodies[n]; 

Para que lo sepas, n es algo que no tengo legítimamente definido (es decir, #define n 1).

Utilizo esta matriz en varios métodos diferentes, pero la más fácil y la que consume menos espacio es una forma simplificada de mi main donde inicializo todas las variables en cada una de las estructuras, solo para establecer las variables con certeza antes de modificarlos 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 que estoy enfrentando es nbody.c:32:13: error: array type has incomplete element type, donde la línea 32 es donde estoy haciendo el conjunto de las estructuras.

Gracias por toda la ayuda que se digna dar, le prometo que me pondré en contacto con usted a más tardar dentro de 12 horas.

Una última aclaración, por encabezado me refiero al espacio sobre int main(void) pero en el mismo archivo * c.

+0

Bueno, funciona bien para mí. ¿No estás declarando 'struct body bodies [n];' before 'struct body {}' declaration? – Jack

Respuesta

78
#include<stdio.h> 
#define n 3 
struct body 
{ 
    double p[3];//position 
    double v[3];//velocity 
    double a[3];//acceleration 
    double radius; 
    double mass; 
}; 

struct body bodies[n]; 

int main() 
{ 
    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; 
    } 

    return 0; 
} 

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 de arriba.

+0

Además, tengo una pregunta sobre la ubicación entre la declaración del tipo de estructura y luego hacer una instancia de ella - Tengo una estructura diferente, una que definí el contenido de _below_ donde primero hago una instancia de la misma (solo uno esta vez, no una matriz), entonces ¿por qué esto no hizo que la serie masiva de errores? Funcionó muy bien, lo que me llevó a pensar que mi intento de hacer una matriz debería haber funcionado también, pero esta vez no funcionó. Además, gracias por tu respuesta, funcionó. – Amndeep7

+0

¡Gracias! ¡Esto realmente me ayuda! – FlokiTheFisherman

+0

Hola, ... ¿59 Me gusta? No vi matrices de struct, solo veo arrays de variables desde ... – delive

7

movimiento

struct body bodies[n]; 

para después

struct body 
{ 
    double p[3];//position 
    double v[3];//velocity 
    double a[3];//acceleration 
    double radius; 
    double mass; 
}; 

Resto todo se ve bien.

1

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 cabecera y el error está en nbody.c, entonces debería verificar si está incluyendo correctamente el archivo de encabezado. Compruebe su #include y asegúrese de que la definición de la estructura se hace antes de declarar cualquier variable de ese tipo.

+0

dudo que OP signifique encabezado como archivo de encabezado, ya que escribió, "la línea siguiente está por encima de las cosas anteriores" antes de la declaración struct array que está en su archivo nbody.c Esperemos a que se despierte y despeje la duda. – nims

+0

@nims es correcto, por encabezado quiero decir el área sobre la declaración 'principal'. – Amndeep7

4

Así que para poner todo junto usando malloc():

int main(int argc, char** argv) { 
    typedef struct{ 
     char* firstName; 
     char* lastName; 
     int day; 
     int month; 
     int year; 

    }STUDENT; 

    int numStudents=3; 
    int x; 
    STUDENT* students = malloc(numStudents * sizeof *students); 
    for (x = 0; x < numStudents; x++){ 
     students[x].firstName=(char*)malloc(sizeof(char*)); 
     scanf("%s",students[x].firstName); 
     students[x].lastName=(char*)malloc(sizeof(char*)); 
     scanf("%s",students[x].lastName); 
     scanf("%d",&students[x].day); 
     scanf("%d",&students[x].month); 
     scanf("%d",&students[x].year); 
    } 

    for (x = 0; x < numStudents; x++) 
     printf("first name: %s, surname: %s, day: %d, month: %d, year: %d\n",students[x].firstName,students[x].lastName,students[x].day,students[x].month,students[x].year); 

    return (EXIT_SUCCESS); 
} 
+6

¿Debe su línea malloc tener numStudents * sizeof (STUDENT)? – Todd

+0

@Todd Es mejor no hacerlo. 'sizeof * students' es lo mismo y no será incorrecto si STUDENT alguna vez cambia. – trentcl

8

Creo que se podría escribir de esa manera también. También soy estudiante, así que entiendo tu lucha. Un poco tarde de respuesta, pero está bien.

#include<stdio.h> 
#define n 3 

struct { 
    double p[3];//position 
    double v[3];//velocity 
    double a[3];//acceleration 
    double radius; 
    double mass; 
}bodies[n]; 
Cuestiones relacionadas