我有两个结构,一个是基本的,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
我现在真的被困住了!愿任何人帮忙吗?
答案 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 ++不是同一种语言,而不是你声称的那种。
我得到的错误不是您声称的错误。这意味着我无法准确猜出你在代码中做了什么。所以,请:
答案 2 :(得分:0)
问题是由于功能的顺序不正确。我的意思是我需要在调用它们之前定义所有函数的签名。