2017-01-17 63 views
0

我需要将C#代码转换为C++,尽管没有一次没有移动C++,只从不同的部分组合,看起来如何,然后以某种方式工作。我现在主要有一个数组给我一个错误作为主题的问题。数组“表达式必须有一个常量”

public: 
    int arrimg(Bitmap^ image) 
    { 
     const int w = image->Width; 
     const int h = image->Height; 
     const int z = 3; 
     int dtab[w][h][z]; 
     for (int x = 0; x < image->Width; x++) 
     { 
      for (int y = 0; y < image->Height; y++) 
      { 
       dtab[x][ y][ 0] = image->GetPixel(x, y).R; 
       dtab[x][ y][ 1] = image->GetPixel(x, y).G; 
       dtab[x][ y][ 2] = image->GetPixel(x, y).B; 
      } 
     } 
     return dtab; 
    } 

错误仍然“在”和“h”弹出了我不知道如何解决它。第二个问题,如果我给严格的“一”和“h”也是数字“DTAB”崩溃的错误,“Rerturn类型不匹配的功能类型。

+5

'int arrimg(Bitmap^image)'not C++。也许C++ - cli。 – drescherjm

+0

1.数组大小应当编译时间常数 2.你返回一个int [] [] []不是int – UKMonkey

+0

@drescherjm JUP,这是C++/CLI – Rakete1111

回答

0

你需要改变两行使用多维cli::array

cli::array<int, 3>^ arrimg(System::Drawing::Bitmap^ image) 
... 
auto dtab = gcnew cli::array<int, 3>(w, h, z); 

注意cli::array<int, 3>^语法,而不是在C#int[,,];并利用gcnew代替new。为完整性,完整的代码是:

cli::array<int, 3>^ arrimg(System::Drawing::Bitmap^ image) 
{ 
    const int w = image->Width; 
    const int h = image->Height; 
    const int z = 3; 
    auto dtab = gcnew cli::array<int, 3>(w, h, z); 
    for (int x = 0; x<image->Width; x++) 
    { 
     for (int y = 0; y<image->Height; y++) 
     { 
      dtab[x, y, 0] = image->GetPixel(x, y).R; 
      dtab[x, y, 1] = image->GetPixel(x, y).G; 
      dtab[x, y, 2] = image->GetPixel(x, y).B; 
     } 
    } 
    return dtab; 
} 
0

使用std::vector而不是变长数组(VLA)。

例如:

std::vector< std::vector< std::vector<int> > > dtab; 

或者分配动态数组:

int * dtab = new int [w * h * z]; 
1

编译器给你的什么是错的一个明确的信息:你不能有一个可变大小的本地数组。你必须用new来显式地分配dtab,或者使用像std :: vector之类的东西。此外,返回类型是错误的,因为您的代码试图返回一个int数组的3D数组,但返回类型被声明为单个int。

+1

温和烦恼这里“编译器给你一个明确的信息“是不是说当OP已经引述该消息,并表示,他们不明白什么是想告诉他们一个有用的东西。当OP显然不是以英语为母语的人时,这一点尤其重要。我并不想启动一个火焰战争或什么,只是提示你说这样的事情在你的答案之前考虑的情况。 –

0

C++(显然不是C++/CLI(您正在使用))不支持variable-length arrays

虽然wh在你的代码中可能是恒定的,但它们只是不变的意思,它们不能被修改。它们不是编译时间常量,这是数组维度所必需的。

可变z在另一一个编译时间常数,因为其值可以由编译器进行设置,它不依赖于其他运行时变量或值。

如果你想坚持一个纯粹的C++解决方案,它将使用std::vector

0

您使用哪种编译器?

这下面的代码

int dtab[w][h][z]; 

线不会在Visual Studio中工作,但gccclang是大手笔了。例如,代码

int i; 
cin>>i; 
int arr[i] 

生成相同的错误在你的问题你得到的错误,但与其他编译器编译和完美的作品

的原因是,Visual Studio的期望C++数组为constant,如果它们不是常量,则需要使用数组创建内存。

相关问题