【问题标题】:C/C++ Binary copy array function doesn't workC/C++ 二进制复制数组函数不起作用
【发布时间】:2012-04-23 03:01:00
【问题描述】:

我编写了一个函数,它可以将一个结构数组二进制复制到另一个结构数组。问题是它不能正常工作,我不知道为什么。对我来说一切都很好。

  • pixel 是一个有 3 个无符号字符的结构体,sizeof(pixel) = 3,
  • pixarr1 是指向二维 DYNAMIC 数组 [8][2] 的指针,
  • pixarr2 是指向二维动态数组 [8][n] 的指针。例如,n = 8,这并不重要。

我需要这样做:

for(int i=0; i<8; i++) {
    for(int y=0; y<2; y++) {
        arr2[i][y] = arr1[i][y];
    }
}

但我想做“二进制”。像这样:

void copyStruct(pixel*** pixarr1, int startline, int height, pixel*** pixarr2) {

    pixel** arr1 = *pixarr1;
    pixel** arr2 = *pixarr2;
    unsigned char buffer[16];

    int sizeofstruct = height*3*8;
    int padding;

    for(int i=0; i<=sizeofstruct; i+=16) {
        if ( i+16 > sizeofstruct) {
            padding = sizeofstruct-i;
            memcpy(buffer, arr1+i, padding);
            memcpy(arr2+(startline*8)+i, buffer, padding);
        } else {
            memcpy(buffer, arr1+i, 16);
            memcpy(arr2+(startline*8)+i, buffer, 16);
        }
    }
}

我犯了什么错误?

PS。抱歉,源代码的问题,这个编辑器是..

PPS。请不要专注于指针的使用。我必须使用它们。如果我在函数内外打印指针,我会看到相同的地址,所以这很好(在我的逻辑中)。

【问题讨论】:

  • 你真的打印出 sizeof(pixel) 是 3 吗?
  • “不能正常工作”是什么意思?
  • 硬编码太多。即使您认为它是 3(不太可能恕我直言),请使用 sizeof。请记住,这是在编译时评估的,因此不会影响性能。它也应该直接或间接地用于各种跨步(* 8 等)。
  • Arghhh 我的眼睛受伤了:pixel*** pixarr1。请传递对 std::vector 的引用。谢谢:-)。
  • 每传一个三分球,上帝就杀了一只小猫。

标签: c arrays pointers binary


【解决方案1】:

您可以使用指针将数组传递给函数,但不能使用指向指针的指针传递多维数组。您可以在此处阅读有关创建指向多维数组的指针的更多信息:

编辑: 我们真的需要更多信息。 “不能正常工作”到底是什么意思?数据被复制但最后一个字节丢失?程序崩溃?机器蓝屏并开始冒烟?请准确告诉我们您看到该程序的作用以及它与您的预期有何不同。

鉴于此处执行的指针操作量,我强烈建议在调试器中单步执行代码,并在每一步仔细检查每个指针。这应该清楚地表明事情开始出错的地方,并就原因给出强有力的提示。

如果更高级别(非memcpy)版本代码有效,我建议检查为该函数发出的程序集,并将其与为基于memcpy 的版本发出的程序集进行比较。一些库使用字节大小的副本循环实现memcpy,这将使您的二进制版本实际上等同于更高级别的版本。如果是这种情况,那么除了增加复杂性之外,使用memcpy 版本可能不会获得太多收益。

【讨论】:

  • 这是一个动态数组,我忘记写了。所以我当然可以。
  • 我已经在我的代码中发现了一些问题,当我最终解决它时,我会在那里发布解决方案。现在我没有太多时间,但很快我会的,我会写下我做过的错误。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2016-02-13
  • 2013-07-04
  • 2013-05-13
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多