2012-05-06 25 views
72

私は各構造体が私のクラスで作業している問題の天体を表す構造体の配列を作成しようとしています。構造体に関する多くの経験はありません。なぜなら、配列全体の代わりにそれらを使用しようと決心したからです。しかし、技術を実装しようとしたにもかかわらず、さまざまなエラーにぶち当たっています。私は様々なスレッドやstackoverflow(例えば、Array of structs in CC - initialize array of structs)で見たことがありますが、それらのすべてが該当するわけではないので、私はそれを行う方法を完全にコピーすることができませんでした。私が何をしようとしているかを示す前に、ちょうど警告をする前に、あまりにも長い間目が覚めてから寝る必要があるので、コメント/質問/私は本当にこれを残念に思っていますが、忙しい一日を過ごしてこの問題を数時間働いた後、私は本当に疲れました。Cでどのように構造体の配列を作成しますか?

これまで読んでいる人のための詳しい情報:私はこれを動的にする必要はありません。私はすべてのサイズを事前に知っています。グローバルな配列(gaspGLOBAL VARIABLES)が必要です。これは、引数(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; 
} 

現在のエラーは、私は構造体の配列を作っているところのライン32がどこにあるnbody.c:32:13: error: array type has incomplete element typeです。

あなたが与えることを約束してくれてありがとうございました。私は、遅くとも12時間後にお返事することを約束します。

最後の明確化の1つは、ヘッダーによって、int main(void)の上のスペースを意味しますが、同じ* .cファイル内です。残り

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

+0

まあ、それは私のためにうまくいきます。 'struct body {}'宣言の前に 'struct body bodies [n];'を宣言していませんか? – Jack

答えて

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

これは問題なく動作します。あなたの質問は途中ではっきりしていなかったので、あなたのソースコードのレイアウトを上記と一致させてください。

+0

また、struct型の宣言とそのインスタンスを実際に作成する間の配置に関する質問があります。別の構造体を持っています。最初は_below_の内容を定義しています。今度は配列ではない)、なぜこれで膨大な数のエラーが発生しなかったのでしょうか?それはうまくいきました。それによって、配列を作る試みがうまくいったはずだと思うようになりましたが、今回はうまくいかなかったと思います。また、あなたの答えをありがとう、それは働いた。 – Amndeep7

+0

ありがとう!!!、これは本当に私を助ける! – FlokiTheFisherman

+0

こんにちは、... 59好きですか?私は構造体の配列を見ませんでした。私は変数の配列だけを打つから参照してください... – delive

7

移動

struct body bodies[n]; 

すべてが正常に見えます。

1

このエラーは、構造体の配列の宣言の前に、構造体の型の定義を見つけることができないことを意味します。これは、ヘッダファイルに構造体の定義があり、エラーがnbody.cにある場合は、ヘッダーファイルが正しく含まれているかどうかを確認する必要があります。 #includeをチェックし、そのタイプの変数を宣言する前に構造体の定義が完了していることを確認してください。だから、malloc()を使用して一緒にすべてを置くために

+0

彼が書いたように、私はOPの意味ヘッダーファイルを意味するのか? 構造体配列宣言の前に "彼のnbody.cファイルにあります。 彼が起きて疑いを解消するのを待ちます。 – nims

+0

@nimsが正しいです。ヘッダーでは、私は 'main'ステートメントの上の領域を意味していました。 – Amndeep7

4

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); 
} 
+6

mallocの行にnumStudents * sizeof(STUDENT)を設定する必要がありますか? – Todd

+0

@Toddそうでない方が良いです。 'sizeof * students'は同じことですが、STUDENTが変わると間違っていることはありません。 – trentcl

8

私はあなたもそのように書くことができると思います。私も学生ですので、あなたの苦労を理解しています。ちょっと遅れていますが、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]; 
関連する問題