我必须从类中获取三维数组c [] w [] h []并将其转换为unsigned char []的单维数组。我试过这种方式。但它不起作用!!当我通过命令行输入时,执行停止并中断......
实现:
#include <iostream>
#include<fstream>
#include<stdlib.h>
#include<vector>
//#include "E:\Marvin_To_UnsignedChar\MetisImg.hpp"
//#include "C:\Users\padmanab\Documents\Visual Studio 2013\Projects\Marvin_To_UnsignedChar\MetisImg.hpp"
extern "C"
{
#include "C:\Users\padmanab\Desktop\Marvin_To_UnsignedChar\multiplyImage\multiplyImage.h"
//#include "C:\Users\padmanab\Documents\Visual Studio 2013\Projects\Marvin_To_UnsignedChar\multiplyImage\multiplyImage.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';
对这个问题有一些指导会很好,或者可能是一个更好的方法来实现它!
答案 0 :(得分:0)
班级代码很好。问题在于
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]
表单更快,但如果您不是100%确定可能会溢出,我建议至少在调试模式下使用at
。