어떻게 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
'programing' 카테고리의 다른 글
임베디드 개발에 C++가 아닌 C를 사용해야 하는 이유가 있습니까? (0) | 2022.09.03 |
---|---|
VueJS 프로펠을 변환하는 방법 (0) | 2022.09.03 |
메서드 이름을 문자열로 지정했을 때 Java 메서드를 호출하려면 어떻게 해야 합니까? (0) | 2022.09.03 |
람다 식에 사용되는 변수는 최종 변수이거나 사실상 최종 변수여야 합니다. (0) | 2022.09.03 |
vue에서 이미지 크기를 조정하는 방법 (0) | 2022.09.03 |