C++动态分配(像素图)

c++ dynamic allocation (pixel map)

我对两者都是新手(内存分配和 classes)

我正在尝试制作(每像素 1 位)的像素图,所以我正在尝试制作 动态内存分配中的字符数组..

class pixmap
{
private:
    char _rows;
    int _width, _height;
    char **pix_m;
public:
    pixmap(int , int);
    uint8_t getpixel(int, int);
    void printl(int);

};

所以我想做的是,例如,如果我想要 (100 x 100) 的像素图 .. 我分配 char [100][1+100/8] 的二维数组 .. char 存储 8位

pixmap::pixmap(int width, int height)
{
    _width = width;
    _height = height;
    _rows = width/8+1;

    pix_m = (char**) (calloc(height,_rows));
    for (int x =0 ; x < _rows; x++)
    {
           pix_m[x] = (char*)calloc(_rows,sizeof(char*));
    }

    printf("%d\r\n",_rows);
}

这是我对 class ^^

的构造

这里是我应该打印一行像素的地方:

void pixmap::printl(int y)
{
    int pix;
    for (int i = 0; i < _rows-1; i++)
    {
        for (int x= 0; x<8; x++)
        {
            pix = pix_m[y][i]&(0x01<<(7-x));
            printf("%d",pix!=0);
        }
    }
    int q = _width - (_rows-1)*8;
    for (int x= 0; x<q; x++)
    {
        pix = pix_m[y][_rows-1]&(0x01<<(7-x));
        printf("%d",pix!=0);
    }
}

在主函数中:

int main()
{
    pixmap img(50,100);
    img.printl(1);

    getch();
}

问题是当我尝试打印大于 6 的行时..程序崩溃..我不应该能够打印(0-99)吗???

代码: http://pastebin.com/9X8r9PWe

你对calloc函数的用法是错误的。

pix_m = (char**) (calloc(height,_rows));

此代码无法正常工作。据我所知,您想要 char*_rows 元素向量。它实际上分配了每个大小等于 sizeof(_rows) 的高度元素,因此在您的情况下是 sizeof(char) 。相反,您应该调用

calloc(_rows, sizeof(char*));

你的第二个电话应该是

pix_m[x] = (char*)calloc(height,sizeof(char));

编辑:在分析了其余代码之后,您似乎有点搞砸了,因此应该是:

pix_m = (char**) (calloc(height,sizeof(char*)));
for (int x =0 ; x < height; x++)
{
       pix_m[x] = (char*)calloc(_rows,sizeof(char));
}

这里我更正了代码:

class pixmap
{
private:
    char _cols;
    int _width, _height;
    char **pix_m;
public:
    pixmap(int , int);
    uint8_t getpixel(int, int);
    void printl(int);

};

pixmap::pixmap(int width, int height)
{
    _width = width;
    _height = height;
    _cols = width/8+1;

    pix_m = (char**) (calloc(height,sizeof(char)*_cols));
    for (int x =0 ; x < height; x++)
    {
           pix_m[x] = (char*)calloc(_cols,sizeof(char));
    }

    printf("%d\r\n",_cols);

    for (int i=0; i < 100; i++)
    {
        for (int j=0; j<_cols; j++)
        {
            pix_m[i][j] = i;
        }
    }
}