3

我有两种结构,一种是基本的,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 编译选项下得到的确切编译器警告。(这意味着应该至少有两个警告——因为缺少以前的原型。但也应该有一个错误,你声称的那个会阻止你的代码工作。)我们应该能够关联你的错误中的行号对您显示的代码微不足道的消息。
于 2012-05-13T02:08:19.780 回答
0

问题是由于功能顺序不正确。我的意思是我需要在调用它们之前定义所有函数的签名。

于 2012-05-14T20:44:00.050 回答