各構造体が天体を表す構造体の配列を作成しようとしています。
私は構造体についてあまり経験がないので、たくさんの配列の代わりにそれらを使用することにしました。しかし、私は数多くの異なるエラーに遭遇し続けます。さまざまなスレッドやStackOverflowで見た手法( Cの構造体の配列 および C - 構造体の配列の初期化 )を実装しようとしました。しかし、それらすべてが該当するわけではありません。
これまで読んだことのある人のためのさらなる情報:私はこれを動的にする必要はありません。私はすべてのサイズをあらかじめ知っています/定義します。引数を定義したいくつかの異なるメソッド(つまりGLUTメソッド)でアクセスしているので、これもグローバル配列である必要があります。
これが私のヘッダで構造体を定義する方法です:
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
構造体の内部を定義する前に定義している他のグローバル変数のリストがあります。そのうちの1つがこの構造体の配列です(基本的に、私の霧があまりにも不明瞭な場合は以下の行)。上記のものの上にあります:
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];
動く
struct body bodies[n];
後へ
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
休息はすべてうまくいきます。
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);
}
構造体の配列を初期化するもう1つの方法は、配列メンバを明示的に初期化することです。構造体と配列のメンバがそれほど多くない場合、この方法は便利で簡単です。
構造体変数を宣言するたびに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}};
繰り返しますが、これは、配列要素や大規模な構造体メンバが多すぎず、前述したように、より動的なアプローチに興味がない場合は、どちらかというと単純で直接的な解決策です。このアプローチは、structメンバが名前付きのenum変数(そして上の例のような数字ではない)で初期化され、それによってコードリーダが構造とそのメンバの目的と機能のより良い概観を与える場合アプリケーション.
このエラーは、構造体の配列の宣言の前にコンパイラが構造体の型の定義を見つけることができないことを意味します。これは、構造体の定義がヘッダーファイルにあり、エラーが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;
}