3

私は2つの構造を持っています。1つは基本的なposition_3dです。もう一人はレイ。

typedef struct{
float x,y,z;    
} position_3d;

typedef struct{
vector_3d direction;
position_3d startPosition;  
} ray;

position_3d 構造体を返す関数を実装しました

position_3d getIntersectionPosition(ray r, sphere s){
    position_3d pos; 
    //some code

    pos.x = r.startPosition.x + t*r.direction.x; 
    pos.y = r.startPosition.y + t*r.direction.y; 
    pos.z = r.startPosition.z + t*r.direction.z;  
    return pos; 
}

私が電話するとき

position_3d pos = getIntersectionPosition(r, s);

このエラー無効な初期化子が発生しました。私はgccを使用しています。コンパイル コマンドは gcc prog.c -o prog.out -lm -lGL -lGLU -lglut です。

私は今本当に立ち往生しています!誰か助けてくれませんか?

4

3 に答える 3

2

ラインですか

position_3d pos = getIntersectionPosition(r, s);

ファイルスコープ(イニシャライザが定数ではないため、エラーです)またはブロックスコープ(動作するはずです)で?

于 2012-05-12T19:52:55.633 に答える
1

コードがコンパイル可能かどうかを確認する前に、埋めなければならないギャップがたくさんあります。

  • タイプsphere
  • タイプvector_3d
  • 変数t?

sphere.cこのコード (ファイル)のように、これらの型についてもっともらしく見える仮説を思いつくと、次のようになります。

typedef struct
{
    float x,y,z;
} position_3d;

typedef struct
{
    float x, y, z;
} vector_3d;

 typedef struct
{
    vector_3d direction;
    position_3d startPosition;
} ray;

typedef struct
{
    float radius;
    position_3d centre;
} sphere;

position_3d getIntersectionPosition(ray r, sphere s)
{
    position_3d pos;
    float t = s.radius;

    pos.x = r.startPosition.x + t*r.direction.x;
    pos.y = r.startPosition.y + t*r.direction.y;
    pos.z = r.startPosition.z + t*r.direction.z;
    return pos;
}

position_3d func(ray r, sphere s)
{
    position_3d pos = getIntersectionPosition(r, s);
    return pos;
}

次に、次を使用してコンパイルできます。

$ /usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
       -Wold-style-definition -c sphere.c
sphere.c:24: warning: no previous prototype for ‘getIntersectionPosition’
sphere.c:35: warning: no previous prototype for ‘func’
$

これらの警告は正しいです。オプションによってプロンプトが表示され-Wmissing-prototypesます。通常、型と関数を宣言するヘッダーがあります。

したがって、デモンストレーションによって、適切に記述された場合、コードは正しい可能性があります。C では、次のようにコードを変更することはできません。

ray         r;
sphere      s;
position_3d pos = getIntersectionPosition(r, s);

position_3d func(void)
{
    return pos;
}

次に、警告が表示されます。

sphere.c:43: error: initializer element is not constant

g++ただし、代わりに, を使用してコンパイルした場合gcc(および C 固有のオプションを削除して、そのままにしておきます):

$ g++ -O3 -g -Wall -Wextra -c sphere.c
$

その後、問題なくコンパイルされます — これは、C と C++ が同じ言語ではないことの証明であり、あなたが主張していたことではありません。

私が得たエラーは、あなたが主張しているエラーではありません。つまり、コードで何をしているのかを正確に推測できていないということです。だからお願い:

  • 発生しているエラーが再現されるまで、このサンプル コードを変更します。コンパイルにはヘッダーもライブラリも必要ないことに注意してください(オブジェクトファイルにアクセスするだけでよいため、ライブラリは重要ではありません。標準ヘッダー以外は何も使用していないようです(せいぜい)ようですが、関連するすべてのヘッダーを切り取りますGLへ)。C 標準または POSIX 標準のヘッダーは許可されていますが、必須ではありません。
  • このコードの変更を質問の最後に追加します(既存の資料は変更しません)。
  • この厳格な C コンパイル オプションのセットで表示される正確なコンパイラ警告を表示します。(つまり、少なくとも 2 つの警告が表示される必要があります — 以前のプロトタイプがないためです。ただし、エラーもあるはずです。主張しているエラーによってコードが機能しなくなります。)エラーの行番号を関連付けることができるはずです。表示するコードに簡単にメッセージを送信します。
于 2012-05-13T02:08:19.780 に答える
0

この問題は、関数の順序が不適切であったことが原因でした。つまり、関数を呼び出す前に、すべての関数のシグネチャを定義する必要があります。

于 2012-05-14T20:44:00.050 に答える