在函数内初始化浮点矩阵

时间:2012-10-06 18:02:10

标签: c++ arrays visual-studio-2010

尝试在函数内初始化全局c ++矩阵(2D数组)时出现此问题:

这就是我正在做的事情

#include <iostream>
#include <math.h>
#include <Windows.h>

using namespace std;

float matrix[5][5];

void setIR(){
    matrix[5][5]= {
        { 17.2, 22.75, 2.5, -9.15, 0.2},
        { 22.75, 145.5, 9.25, 20.75, 5.25 },
        { 2.5, 9.25, 76.5, -15.5, -6.0 },
        { -9.15, 20.75, -15.5, 37.3, -25.65 },
        { 0.2, 5.25, -6.0, -25.65, 41.2 }
        };

int main(){
//rest of the code
......
}

我只得到一堆

1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(46): error C2059: syntax error : '{'
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(46): error C2143: syntax error : missing ';' before '{'
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(47): error C2143: syntax error : missing ';' before '}'
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(47): error C2143: syntax error : missing ';' before ','
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(48): error C2143: syntax error : missing ';' before '{'
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(48): error C2143: syntax error : missing ';' before '}'
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(48): error C2143: syntax error : missing ';' before ','
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(49): error C2143: syntax error : missing ';' before '{'
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(49): error C2143: syntax error : missing ';' before '}'
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(49): error C2143: syntax error : missing ';' before ','
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(50): error C2143: syntax error : missing ';' before '{'
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(50): error C2143: syntax error : missing ';' before '}'
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(50): error C2143: syntax error : missing ';' before ','
1>c:\users\apple\documents\visual studio 2010\projects\jcb\jcb\jcbPIO.cpp(51): error C2143: syntax error : missing ';' before '{'
1>c:\users\apple\documents\visual studio2010\projects\jcb\jcb\jcbPIO.cpp(51): error C2143: syntax error : missing ';' before '}'

我做错了或C ++限制?

2 个答案:

答案 0 :(得分:2)

您只能在初始化时使用{}初始化语法,并且只能在其定义中初始化全局变量。

对于这种情况,您可以初始化不同的矩阵,然后只复制内容:

void setIR(){
    static const float init[5][5]= {
        { 17.2, 22.75, 2.5, -9.15, 0.2},
        { 22.75, 145.5, 9.25, 20.75, 5.25 },
        { 2.5, 9.25, 76.5, -15.5, -6.0 },
        { -9.15, 20.75, -15.5, 37.3, -25.65 },
        { 0.2, 5.25, -6.0, -25.65, 41.2 }
    };
    memcpy(matrix, init, sizeof(matrix));
}

如果您不喜欢memcpy之类的东西,那么您可以通过循环手动复制,或尝试使用STL,但在我看来,这是这种情况下最简单,最简短的解决方案。

答案 1 :(得分:0)

此“列表分配”语法仅适用于初始化(即,在您定义变量的位置),而不适用于赋值。您的赋值语句尝试执行的操作是将单个元素matrix[5][5](实际上不存在)分配给花括号列表给出的值,该值不是值的有效语法。

您可以按如下方式分配矩阵:

float matrix[5][5];

void setIR()
{
  static float const values[5][5]= {
        { 17.2, 22.75, 2.5, -9.15, 0.2},
        { 22.75, 145.5, 9.25, 20.75, 5.25 },
        { 2.5, 9.25, 76.5, -15.5, -6.0 },
        { -9.15, 20.75, -15.5, 37.3, -25.65 },
        { 0.2, 5.25, -6.0, -25.65, 41.2 }
        };
  for (int i = 0; i < 5; ++i)
    for (int j = 0; j < 5; ++j)
      matrix[i][j] = values[i][j];
}

当然,鉴于您的值无论如何都是常量,最好的解决方案是在matrix本身的定义中给出它们。这也节省了复制所有数据的时间。