(双)for循环,在C中具有变量索引

use*_*479 0 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
}
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)

Cal*_*leb 6

我注意到的第一件事是你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前一次迭代的价值.您也分配DATAm[4],并且将被SIZE此迭代中的值覆盖.最终,您最终将OutBuffer包含确切内容InBuffer,以及最后一个ID的值SIZEDATA值.

您需要使用不同的变量来索引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循环不应该比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];
    }
}
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)