태그 보관물: struct

struct

C에서 구조체 배열을 어떻게 만드나요? 변수 목록이 있으며 그중

각 구조체가 천체를 나타내는 구조체 배열을 만들려고합니다.

나는 구조체에 대한 경험이 많지 않기 때문에 전체 배열 대신에 구조체를 사용하기로 결정했습니다. 그러나 나는 계속해서 수많은 다른 오류가 발생합니다. 다양한 스레드와 StackOverflow (예 : CC의 구조체 배열-구조체 배열 초기화) 에서 본 기술을 구현하려고 시도했지만 모두 적용 할 수있는 것은 아닙니다.

이 글을 읽어보신 분들을위한 추가 정보 : 저는이 중 어떤 것도 동적 일 필요는 없습니다. 모든 것의 크기를 미리 알고 / 정의합니다. 또한 인수를 정의한 여러 다른 메서드 (예 : GLUT 메서드)에서이 항목에 액세스하므로 전역 배열이되어야합니다.

이것은 헤더에서 구조체를 정의하는 방법입니다.

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

구조체의 내부를 정의하기 전에 정의하고있는 다른 전역 변수 목록이 있으며 그중 하나는이 구조체의 배열입니다 위의 항목 위에 있음) :

struct body bodies[n];

아시다시피, n제가 합법적으로 정의한 것입니다 (예 🙂 #define n 1.

이 배열을 여러 가지 다른 방법으로 사용하지만 가장 쉽고 공간을 적게 차지하는 배열은 메인의 단순화 된 형태입니다. 여기에서는 각 구조체의 모든 변수를 초기화하여 어떤 식 으로든 수정하기 전에 변수를 확실하게 설정합니다.

  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;
 }

내가 직면 한 현재 오류는 nbody.c:32:13: error: array type has incomplete element type32 행이 구조체 배열을 만드는 곳입니다.

마지막 설명은, 헤더 나는 위의 공간을 의미 int main(void)하지만 같은에서 *.c파일을.



답변

#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;
}

이것은 잘 작동합니다. 당신의 질문은 그다지 명확하지 않았으므로 소스 코드의 레이아웃을 위와 일치 시키십시오.


답변

나는 당신도 그렇게 쓸 수 있다고 생각합니다. 나는 또한 학생이기 때문에 당신의 어려움을 이해합니다. 조금 늦은 응답이지만 괜찮습니다.

#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];


답변

따라서 다음을 사용하여 모두 정리하십시오 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);
}


답변

움직임

struct body bodies[n];

이후에

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

나머지는 모두 괜찮아 보입니다.


답변

구조체 배열을 초기화하는 또 다른 방법은 배열 멤버를 명시 적으로 초기화하는 것입니다. 이 접근 방식은 구조체 및 배열 멤버가 너무 많지 않은 경우 유용하고 간단합니다.

typedef지정자를 사용하여 struct구조체 변수를 선언 할 때마다 문을 다시 사용하지 않도록 합니다.

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

그런 다음 구조체 배열을 선언하십시오. 각 요소의 초기화는 선언과 함께 진행됩니다.

Body bodies[n] = {{{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0},
                  {{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0},
                  {{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0}};

반복해서 말하면, 배열 요소와 큰 구조체 멤버가 너무 많지 않고 언급했듯이 더 동적 인 접근 방식에 관심이없는 경우 다소 간단하고 직접적인 솔루션입니다. 이 접근 방식은 구조체 멤버가 명명 된 열거 형 변수 (위의 예와 같은 숫자뿐만 아니라)로 초기화 된 경우에도 유용 할 수 있습니다. 이렇게하면 코드 판독기에서 구조체와 해당 멤버의 목적과 기능에 대한 더 나은 개요를 제공합니다. 응용 프로그램.


답변

컴파일러는 당신이 헤더 파일에 구조체의 정의를 가지고 말을하고 있기 때문에, 구조체의 배열의 선언 전에 구조체의 유형의 정의를 찾을 수 없습니다 및 오류에 있는지 그 오류 수단 nbody.c다음 헤더 파일을 올바르게 포함하고 있는지 확인해야합니다. 을 확인 #include하고 해당 유형의 변수를 선언하기 전에 구조체의 정의가 완료되었는지 확인하십시오.


답변

포인터를 사용한 솔루션 :

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


int main()
{
    struct body *bodies = (struct body*)malloc(n*sizeof(struct body));
    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;
}