我必须从类中获得三维数组c[] w[] h[],并将其转换为unsigned char[]的一维数组。我试过这种方法。但这行不通!!当我通过命令行输入时,执行停止并中断…
实现:#include <iostream>
#include<fstream>
#include<stdlib.h>
#include<vector>
//#include "E:Marvin_To_UnsignedCharMetisImg.hpp"
//#include "C:UserspadmanabDocumentsVisual Studio 2013ProjectsMarvin_To_UnsignedCharMetisImg.hpp"
extern "C"
{
#include "C:UserspadmanabDesktopMarvin_To_UnsignedCharmultiplyImagemultiplyImage.h"
//#include "C:UserspadmanabDocumentsVisual Studio 2013ProjectsMarvin_To_UnsignedCharmultiplyImagemultiplyImage.h"
}
using namespace std;
class Marvin_To_UnsignedChar
{
public:
int Color;
int Width;
int Height;
std::vector<unsigned char> values;
Marvin_To_UnsignedChar(int c, int w, int h) : Color(c), Width(w), Height(h), values(c*w*h){}
unsigned char operator()(int color, int width, int height) const
{
return values[Height*Width*color + Height*width + height];
}
unsigned char& operator()(int color, int width, int height)
{
return values[Height*Width*color + Height*width + height];
}
};
在Main ():
int color; int width; int height;
std::cout << "Please enter the color value";
std::cin >> color;
std::cout << "Please enter the width value";
std::cin >> width;
std::cout << "Please enter the height value";
std::cin >> height;
Marvin_To_UnsignedChar M_To_V(color,width,height);
unsigned char test = M_To_V(color, width, height);
std::cout << test << 'n';
如果有一些关于这个问题的指导,或者可能是一个更好的方法来实现它,那就太好了!
类代码是好的。问题是在
中unsigned char test = M_To_V(color, width, height);
您正在以维度作为参数调用operator()
(请记住,您在color
, width
, height
之前使用Marvin_To_UnsignedChar
对象),因此它将有效地输出values[Color*Width*Height]
,这是超过向量末尾的一个元素。否则代码没问题,您可能想使用
unsigned char test = M_To_V(x, y, z);
,其中x, y, z
是这样的x<color, y<width, z<height
。例如,下面的代码可以工作(我用'x'
在构造函数中初始化数组,因此您可以看到输出了一些内容)
#include <iostream>
#include <vector>
using namespace std;
class Marvin_To_UnsignedChar
{
public:
int Color;
int Width;
int Height;
std::vector<unsigned char> values;
Marvin_To_UnsignedChar(int c, int w, int h) :
Color(c), Width(w), Height(h), values(c*w*h,'x'){}
unsigned char operator()(int color, int width, int height) const
{
return values.at(Height*Width*color + Height*width + height);
}
unsigned char& operator()(int color, int width, int height)
{
return values.at(Height*Width*color + Height*width + height);
}
};
int main()
{
int color = 3, width = 777, height = 600;
Marvin_To_UnsignedChar M_To_V(color,width,height);
M_To_V(2, 776, 599)='a'; // set the last element to `a`
std::cout << M_To_V(2, 776, 599) << 'n';
unsigned char test = M_To_V(1, 200, 300); // this element is pre-initialized with 'x'
std::cout << test << 'n';
}
PS:你可以使用values.at(position)
代替values[position]
的std::vector
,前者将检查越界,即抛出一个异常,如果你得到一个越界,所以你可以弄清楚发生了什么。values[position]
形式更快,但我建议至少在调试模式下使用at
,如果你不是100%确定你可能会溢出。