获取和设置三维数组

时间:2014-05-27 13:12:55

标签: c++ arrays image multidimensional-array

我必须从类中获取三维数组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';

对这个问题有一些指导会很好,或者可能是一个更好的方法来实现它!

1 个答案:

答案 0 :(得分:0)

班级代码很好。问题在于

unsigned char test = M_To_V(color, width, height); 

您正在使用维度作为参数调用operator()(请记住您在color之前使用widthheight来构建Marvin_To_UnsignedChar对象) ,因此它将有效地输出values[Color*Width*Height],这是向量末尾之后的一个元素。否则代码很好,你可能想要使用像

这样的东西
unsigned char test = M_To_V(x, y, z);

其中x, y, zx<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