struct的初始化程序错误无效

时间:2012-05-12 19:35:10

标签: c

我有两个结构,一个是基本的,position_3d。另一个是雷。

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

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

我已经实现了一个返回position_3d struct

的函数
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

我现在真的被困住了!愿任何人帮忙吗?

3 个答案:

答案 0 :(得分:2)

是行

position_3d pos = getIntersectionPosition(r, s);

在文件范围内(然后这是一个错误,因为初始化程序不是常量)或块作用域(然后它应该工作)?

答案 1 :(得分: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 :(得分:0)

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