c - (双)for 循环与 C 中的变量索引

标签 c arrays for-loop

我有一个带有 ID 的缓冲区,如下所示 InBuffer={ID1,ID2,ID3,...}

我需要遍历,每次都在函数中使用 ID,该函数返回指向分配给该 ID 的数据的指针和数据的大小。然后我需要用

形式的结果填充另一个缓冲区
OutBuffer={ID1,SIZE1,DATA1.WORD1,...,DATA1.WORDSIZE1,
    ID2,SIZE2,DATA2.WORD1,...,DATA2.WORDSIZE2,
    ...,
    IDN,SIZEN,DATAN.WORD1,...,DATAN.WORDSIZEN
}

我在为此形成整个 for 循环及其索引时遇到问题,主要是因为每个 SIZE 变量可能不同。它应该很简单,但我似乎无法让它发挥作用。

在此先感谢您的帮助。

// For example
// Iterate through the remaining of the Request Buffer (m=0,1 already set) 
for (m = 2; m < InBuffer; m++)`
{ 
  OutBuffer[m] = InBuffer[m];
  returnPointersToDataAndSizeFunction(InBuffer[m], &SIZE, &DATA);
  OutBuffer[m + 1] = SIZE; // e.g. SIZE = 2, therefore DATA has 2 fields 
  OutBuffer[m + 2] = DATA.1; // first field  
  OutBuffer[m + 3] = DATA.2; // second field
  // and so on
}

最佳答案

我注意到的第一件事是您正在使用 m 来索引两个缓冲区:

for (m = 2; m < InBuffer; m++)
{ 
    OutBuffer[m]=InBuffer[m];

但是您正在使用 m 的偏移量来获取 OutBuffer 中的附加数据:

OutBuffer[m+1]=SIZE;
OutBuffer[m+2]=DATA;

那么,您认为循环的下一次迭代会发生什么?假设你第一次通过循环,所以 m 是 2。下一次,它是 m++,即 3,你再次进行这个分配:

OutBuffer[m]=InBuffer[m];

但是您已经在 m[3] 处分配了一些东西,这就是上一次迭代的 SIZE 值。您还在 m[4] 处分配了 DATA,在此迭代中它将被 SIZE 值覆盖。最终,您将得到 OutBuffer,其中包含 InBuffer 中的内容,以及 SIZEDATA 值最后一个 ID。

您需要使用不同的变量来索引 OutBuffer,例如:

for (m = 2, n = m; m < InBuffer; m++) {
    OutBuffer[n++] = InBuffer[m];
    returnPointersToDataAndSizeFunction(InBuffer[m],&SIZE,&DATA);
    OutBuffer[n++] = SIZE;
    OutBuffer[n++] = DATA;
}

还有一些其他问题。例如,for 循环中的条件不应将 mInBuffer 进行比较,而应将 m 进行比较以及 InBuffer 中的条目数。但是理顺索引应该是向前迈出的一大步。

更新:我刚刚注意到每个 ID 的数据都大于一个字段。然后,您需要在第一个循环中添加另一个循环,这样您就可以得到类似这样的结果:

for (m = 2, n = m; m < InBuffer; m++) {
    OutBuffer[n++] = InBuffer[m];
    returnPointersToDataAndSizeFunction(InBuffer[m],&SIZE,&DATA);
    OutBuffer[n++] = SIZE;
    for (i = 0; i < SIZE; i++) {
        OutBuffer[n++] = DATA[i];
    }
}

如果 DATA 是一个包含字段而不是数组的结构,那么您可能需要一系列 if 语句来检查是否应包含每个字段。您不能使用像 i 这样的变量的值作为字段的名称,即您不能说 DATA.i where i 是一个变量。我不认为 C 结构可以具有数字字段名称——标识符通常必须以字母或下划线开头,因此尝试这样做无论如何都没有多大意义。如果您可以控制 DATA 的类型,则应将其设为数组而不是结构。所以你的循环看起来更像这样:

for (m = 2, n = m; m < InBuffer; m++) {
    OutBuffer[n++] = InBuffer[m];
    returnPointersToDataAndSizeFunction(InBuffer[m],&SIZE,&DATA);
    OutBuffer[n++] = SIZE;
    i = 0;
    if (i++ < SIZE) { OutBuffer[n++] = DATA.field1; }
    if (i++ < SIZE) { OutBuffer[n++] = DATA.field2; }
    // and so on for each field in DATA's type 
}

关于c - (双)for 循环与 C 中的变量索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36003801/

相关文章:

c - 如果h文件包含没有c文件实现的签名,会不会出错?

swift - ForEach 循环遍历不同的变量类型 swift

java - 'for' 循环可替换为 'foreach'

c - Valgrind 可能会在简单程序中丢失内存

c - 将文件中的随机名称分配给结构名称

c++ - 字符数组不符合新的大小

c++ - 动态数组。忽略大小。 C++

javascript - foreach 和 JavaScript

c - `((t*)0)->f)` 在 C 代码中的作用是什么?

c - 如何将数组的值设置为单个变量