我使用memcpy错误吗?

发布于 2024-10-30 12:19:27 字数 855 浏览 0 评论 0原文

在下面的代码片段中,我希望函数接受一个双指针(二维数组),它可以是任何数据类型(在本例中为整数),并使用 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);

}

in the following snippet I wish the function accept a double pointer(2D array) which can be in any data type(in this case, integer), and use memcpy to copy one element at a time of the array to another variable. It passed the compiler but still shows an access violation.

I looked everywhere around the forum but still can't get this right.

Any tips are appreciated. I am nearly devastated by the complexity of 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);

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

生生不灭 2024-11-06 12:19:27

我认为这里有一个错误: ptr+i*sizeof(int) 因为 ptr 的类型是 void** ptr+1 是下一个element,意思是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)相同)

I think there's a mistake here: ptr+i*sizeof(int) since ptr is of type void** ptr+1 is the next element, meaning ptr+sizeof(void*), why would you multiply it by sizeof(int)?

for example:

ptr = 0x00000000, 
sizeof(void*) = 4, 
sizeof(int) = 4
||
\/
ptr+1 = 0x00000004. 
ptr+1*sizeof(int) = 0x00000010.

and I don't think that's what you want. (the same about j*sample->width*sizeof(int))

演出会有结束 2024-11-06 12:19:27

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);

The sizeof(int)scaling is throwing me;如果编译器在编译时知道您的数据类型,那么您不需要这个。为什么你的数组是一个 void ** 而不是编译器可以使用的更具体的数组? (int ** 将是一个很好的开始,但我不太擅长 C 中的多维数组,所以我不确定这会是一个更好的替代品。但我确实不喜欢你的现在有。

memcpy(3) is really for copying objects that are larger than the primitive types. You could replace this line:

memcpy(&value, ptr+i*sizeof(int)+j*sample->width*sizeof(int), sizeof(int));

with this line:

value = ptr+i*sizeof(int)+j*sample->width*sizeof(int);

The sizeof(int) scaling is throwing me; you shouldn't need this if your datatypes are known to the compiler at compile time. Why is your array a void ** rather than something more specific, which the compiler could work with? (int ** would be a good first start, but I'm not very good at multidimensional arrays in C, so I'm not positive this would be a better replacement. But I do dislike what you have now. :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文