我有一个带有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
}
Run Code Online (Sandbox Code Playgroud)
我遇到了为此形成整个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
}
Run Code Online (Sandbox Code Playgroud)
我注意到的第一件事是你m用来索引两个缓冲区:
for (m = 2; m < InBuffer; m++)
{
OutBuffer[m]=InBuffer[m];
Run Code Online (Sandbox Code Playgroud)
但是你在下面m的附加数据中使用偏移OutBuffer:
OutBuffer[m+1]=SIZE;
OutBuffer[m+2]=DATA;
Run Code Online (Sandbox Code Playgroud)
那么,你认为在循环的下一次迭代中会发生什么?假设你第一次经历循环,那么m就是2.下一次,它m++就是3,然后再次进行此分配:
OutBuffer[m]=InBuffer[m];
Run Code Online (Sandbox Code Playgroud)
但是你已经分配了一些东西m[3],这就是SIZE前一次迭代的价值.您也分配DATA了m[4],并且将被SIZE此迭代中的值覆盖.最终,您最终将OutBuffer包含确切内容InBuffer,以及最后一个ID的值SIZE和DATA值.
您需要使用不同的变量来索引OutBuffer,例如:
for (m = 2, n = m; m < InBuffer; m++) {
OutBuffer[n++] = InBuffer[m];
returnPointersToDataAndSizeFunction(InBuffer[m],&SIZE,&DATA);
OutBuffer[n++] = SIZE;
OutBuffer[n++] = DATA;
}
Run Code Online (Sandbox Code Playgroud)
还有一些其他问题.例如,在条件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];
}
}
Run Code Online (Sandbox Code Playgroud)
如果DATA是具有字段而不是数组的结构,那么您可能需要一系列if语句来检查是否应包含每个字段.您不能使用变量的值,如i字段的名称,即您不能说变量DATA.i在哪里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
}
Run Code Online (Sandbox Code Playgroud)