각 구조체가 천체를 나타내는 구조체 배열을 만들려고합니다.
나는 구조체에 대한 경험이 많지 않기 때문에 전체 배열 대신에 구조체를 사용하기로 결정했습니다. 그러나 나는 계속해서 수많은 다른 오류가 발생합니다. 다양한 스레드와 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
.
이 배열을 여러 가지 다른 방법으로 사용하지만 가장 쉽고 공간을 적게 차지하는 배열은 메인의 단순화 된 형태입니다. 여기에서는 각 구조체의 모든 변수를 초기화하여 어떤 식 으로든 수정하기 전에 변수를 확실하게 설정합니다.
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;
}
이것은 잘 작동합니다. 당신의 질문은 그다지 명확하지 않았으므로 소스 코드의 레이아웃을 위와 일치 시키십시오.
답변
나는 당신도 그렇게 쓸 수 있다고 생각합니다. 나는 또한 학생이기 때문에 당신의 어려움을 이해합니다. 조금 늦은 응답이지만 괜찮습니다.
#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;
}