コードがコンパイル可能かどうかを確認する前に、埋めなければならないギャップがたくさんあります。
- タイプ
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 つの警告が表示される必要があります — 以前のプロトタイプがないためです。ただし、エラーもあるはずです。主張しているエラーによってコードが機能しなくなります。)エラーの行番号を関連付けることができるはずです。表示するコードに簡単にメッセージを送信します。