126

各構造体が天体を表す構造体の配列を作成しようとしています。

私は構造体の経験があまりないので、配列全体の代わりに構造体を使用することにしました。ただし、さまざまなエラーが発生し続けます。さまざまなスレッドや StackOverflow で見た手法 ( C の Array of structsC - initialize array of structsなど) を実装しようとしましたが、すべてが適用できるわけではありませんでした。

ここまで読んだ方への追加情報: 動的にする必要はありません。事前にすべてのサイズを把握/定義しています。また、引数を定義したいくつかの異なるメソッド (つまり 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ファイル内にあります。

4

7 に答える 7

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

これはうまくいきます。ちなみに、あなたの質問はあまり明確ではなかったので、ソースコードのレイアウトを上記と一致させてください。

于 2012-05-06T04:47:51.113 に答える
18

したがって、次を使用してすべてをまとめるには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);
}
于 2014-07-02T22:20:30.730 に答える
8

動く

struct body bodies[n];

後へ

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

残りはすべて正常に見えます。

于 2012-05-06T04:41:26.697 に答える
1

nbody.cこのエラーは、コンパイラが構造体の配列の宣言の前に構造体の型の定義を見つけることができないことを意味します。これは、ヘッダー ファイルに構造体の定義があり、エラーが次にあると言っているからです。ヘッダー ファイルを正しくインクルードしているかどうかを確認する必要があります。を確認#includeし、その型の変数を宣言する前に、構造体の定義が完了していることを確認してください。

于 2012-05-06T04:50:44.400 に答える