我有一个带有 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
中的内容,以及 SIZE
和 DATA
值最后一个 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
循环中的条件不应将 m
与 InBuffer
进行比较,而应将 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/