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)吗???
你对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;
}
}
}
我对两者都是新手(内存分配和 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)吗???
你对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;
}
}
}