在下面的代码片段中我希望函数接受一个双指针(2D数组),它可以是任何数据类型(在本例中为整数),并使用memcpy将一个元素一次复制到另一个变量。它通过了编译器,但仍显示访问冲突。
我在论坛周围到处寻找,但仍然无法做到这一点。
任何提示都表示赞赏。我几乎被C的复杂性所摧毁。
void ShowImg(void **ptr, IplImage *sample, char window_name[])
{
int value;
IplImage *sml_img= cvCreateImage(cvSize(sample->width,sample->height),IPL_DEPTH_8U, 1);
for(int j=0; j<sample->height; j++)
for(int i=0; i<sample->width; i++){
memcpy(&value, ptr+i*sizeof(int)+j*sample->width*sizeof(int), sizeof(int));
((uchar *)(sml_img->imageData + sml_img->widthStep*j))[i] = value;
printf("%d,%d\n", i, j);
}
cvNamedWindow(window_name);
cvShowImage(window_name, sml_img);
cvWaitKey(0);
cvDestroyWindow(window_name);
cvReleaseImage(&sml_img);
}
答案 0 :(得分:3)
我认为这里有一个错误:ptr+i*sizeof(int)
因为ptr
类型为void**
ptr + 1是下一个元素,意思是ptr+sizeof(void*)
,为什么要将它乘以的sizeof(int)的
例如:
ptr = 0x00000000,
sizeof(void*) = 4,
sizeof(int) = 4
||
\/
ptr+1 = 0x00000004.
ptr+1*sizeof(int) = 0x00000010.
我认为这不是你想要的。 (关于j*sample->width*sizeof(int)
)
答案 1 :(得分:1)
memcpy(3)
实际上用于复制大于基元类型的对象。你可以替换这一行:
memcpy(&value, ptr+i*sizeof(int)+j*sample->width*sizeof(int), sizeof(int));
这一行:
value = ptr+i*sizeof(int)+j*sample->width*sizeof(int);
sizeof(int)
缩放让我失望;如果编译时编译器知道您的数据类型,则不需要这样做。为什么你的数组是void **
而不是更具体的东西,编译器可以使用它? (int **
将是一个良好的第一次开始,但我不擅长C中的多维数组,所以我不肯定这将是一个更好的替代。但我不喜欢你现在拥有的。:)