获取和设置一个三维数组



我必须从类中获得三维数组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%确定你可能会溢出。

相关内容

  • 没有找到相关文章