programing

어떻게 C에 구조를 배열할 수 있을까요?

prostudy 2022. 9. 3. 09:19
반응형

어떻게 C에 구조를 배열할 수 있을까요?

저는 각각의 구조가 천체를 나타내는 일련의 구조를 만들려고 합니다.

저는 구조물에 대한 경험이 많지 않기 때문에 여러 어레이 대신 구조물을 사용해 보기로 했습니다.하지만, 나는 계속해서 많은 다른 오류들과 마주친다.다양한 스레드 및 StackOverflow(C 및 C구조 배열 초기화 등)에서 본 기술을 구현하려고 시도했지만 모두 해당되지는 않았습니다.

지금까지 읽어보신 분들을 위해 추가 정보: 역동적인 것은 필요 없습니다.모든 것의 크기를 미리 알고 있습니다.또한 인수를 정의한 몇 가지 다른 방식(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

이 어레이는 여러 가지 방법으로 사용하지만 가장 쉽고 공간 소모가 적은 어레이는 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;
 }

제가 한 오류는 '오류'입니다.nbody.c:32:13: error: array type has incomplete element type여기서 32번 라인은 구조물을 배열하는 곳입니다.

으로 설명하겠습니다란 위 .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;
}

이건 잘 작동한다.당신의 질문은 명확하지 않았으므로, 당신의 소스 코드 레이아웃과 위의 레이아웃을 일치시키세요.

다 요.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);
}

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

하다를 사용하세요.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}};

다시 말씀드리지만, 어레이 요소와 큰 구조 구성원을 너무 많이 보유하지 않고 앞에서 설명한 것처럼 보다 동적인 접근 방식에 관심이 없는 경우, 이 솔루션은 비교적 단순하고 간단한 솔루션입니다.이 접근방식은 구조체 멤버가 이름 있는 열거형 변수(위의 예와 같은 숫자뿐만 아니라)로 초기화되어 있는 경우에도 도움이 됩니다.이것에 의해, 코드 리더는, 특정의 애플리케이션에서의 구조체 및 그 멤버의 목적과 기능의 보다 나은 개요를 얻을 수 있습니다.

당신도 그렇게 쓸 수 있을 것 같아요.저도 학생이라서 고생하는 거 이해해요.응답이 조금 늦었지만 OK.

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

움직이다

struct body bodies[n];

뒤따라

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

나머지는 괜찮아 보인다.

포인터를 사용한 솔루션:

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

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

언급URL : https://stackoverflow.com/questions/10468128/how-do-you-make-an-array-of-structs-in-c

반응형