【问题标题】:Shifting by 1 an array of C structures将 C 结构数组移位 1
【发布时间】:2011-10-31 08:42:59
【问题描述】:

我有一个结构数组,我试图将其左移 1 个数组节点。数组的总大小很大(大约 3 GB),所以即使我知道我需要的数组的确切大小,它也太大而无法在堆栈上声明(即使我有 16 gig 的内存并且正在编写一个 64 位程序),从而通过强迫我进行动态内存分配使事情复杂化:

struct s_ptx
{
    short       streamIndex;
    double      raw;
    char        rawDx;

}  *Ptx[100];

void allocateMemory(void)
{
    ptxTotal = 300;

    for (int i = 0; i < 100; ++i)   
        Ptx[i] = (struct s_ptx*) calloc( ptxTotal, sizeof(struct s_ptx));
}

void shiftDataStructures(void)
{
    for (int j = 100 - 1; j > 0; --j) 
        Ptx[j] = Ptx[j - 1];
}

但是我得到了错误的结果,因为 shiftDataStructures 函数不起作用。关于我需要如何重写它的任何想法。

【问题讨论】:

  • 你想用 Ptx[0] 做什么? free() 还是旋转到 Ptx[99] ?如果是前者,你想用 Ptx[99] 做什么?
  • 请提供有关您的计划的更多详细信息。
  • 目标是移动数组,让节点 [99] 中的最后一个脱落。然后我用新值填充 [0]。
  • Antti:你写道:“你没有移动结构,只有指针。”你是说我需要做的就是把它改成: *Ptx[j] = *Ptx[j - 1] ?
  • 然后它会在每个位置复制您的 300 个结构中的第一个。我想知道,为什么你一定要一直复制3G的数据?你的设计一定有一个严重的错误;)

标签: c data-structures struct shift


【解决方案1】:

你没有移动结构,只有指针。我想知道你真的认为你在这里取得了什么成就?

另外,为什么你需要移动数组索引,为什么不使用链表或环形缓冲区。至于错误本身是什么,我不知道,因为您提供的数据不足;您的循环以正确的方向运行,不会覆盖指针。

【讨论】:

    【解决方案2】:

    尝试交换结构内部的数据,而不是移动指针。结果将产生一个循环数组,其中 Ptx[99] 将循环到 Ptx[0]。

    示例代码:

     // Change codes in the following line
     for (int j = 100 - 1; j > 0; --j)
          //Ptx[j] = Ptx[j - 1];
            swap(Ptx[j], Ptx[j - 1]); 
    

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 2015-11-18
      • 2022-12-22
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多