我必须做一个返回两个向量的点积的函数。 这是他的代码:
float res;
float v1[3];
float v2[3];
v1[0] = 3;
v1[1] = 2;
v1[2] = 0;
v2[0] = 2;
v2[1] = 5;
v2[2] = 0;
float dotProd(float *vec1, float *vec2) {
return vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2];
}
res = dotProd(v1, v2)
我认为函数是正确的,问题是当我定义向量的值时,我得到无效的初始化器错误。
我错过了什么?
答案 0 :(得分:7)
您尝试执行的操作不是初始化,而是分配。前者在定义变量时完成,而后者在稍后作为可执行语句完成。您收到错误,因为在函数外部不允许使用可执行语句。
您需要在定义数组时使用初始化程序:
float v1[3] = {3, 2, 0};
float v2[3] = {2, 5, 0};
答案 1 :(得分:3)
float v1[3];
// ...
v1[0] = 3;
v1[1] = 2;
v1[2] = 0;
这:float v1[3];
是一个声明(和一个定义)。它定义了一个名为v1
的数组对象。它可以合法地出现在文件范围(在任何函数之外)或在块范围内(在函数定义内)。
这:v1[0] = 3;
是声明。仅在函数定义中允许语句。
如果您希望这些语句只执行一次,您可以将它们放在main
函数中。
执行您的程序首先是对main
函数的隐式调用。几乎所有在程序运行时发生的事情都会由此产生,因为其他函数直接或间接地从main
调用。如果你可以在任何函数之外使用语句,那么就无法执行它们。允许使用文件范围声明,但它们仅限于不执行任何代码的声明。例如,声明如下:
int n = 42;
允许在文件范围或块范围内;如果它在文件范围内,则在程序启动时将值42
加载到n
。但是如果初始化器不是常量表达式,例如:
int r = rand();
那么它只能出现在块范围内;在main
开始之前无法调用函数。
至于为什么你得到那个特定的消息,编译器的解析器不希望在该上下文中看到一个语句,所以它尝试(并且失败)来解释{{1}作为宣言。当编译器看到语法无效的东西时,尝试以一种允许它给出有意义的错误消息的方式解释它,但它并不总是成功。
答案 2 :(得分:0)
你的代码很好;你可能只是遇到结构问题。 尝试类似:
IDisposable