C:为什么我的初始化程序无效?

时间:2017-04-26 16:53:42

标签: c vector

我必须做一个返回两个向量的点积的函数。 这是他的代码:

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)

我认为函数是正确的,问题是当我定义向量的值时,我得到无效的初始化器错误。

我错过了什么?

3 个答案:

答案 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
相关问题