【问题标题】:(double) for-loop with variable indexing in C(双)在C中具有变量索引的for循环
【发布时间】:2016-03-15 06:06:15
【问题描述】:

我有一个 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
}

【问题讨论】:

  • 请添加更多代码,我们可以帮助您。尤其是你在第二段中描述的那一点。
  • @user3374479,目前还不清楚。也许您可以用实际数据和相关代码编写一个清晰的示例。
  • @user3374479 当你不知道你的索引应该如何流入你的算法时,你应该通过声明它们来开始你的评论,并更好地使用数学教科书中的名称,例如:1&lt;i&lt;m,@ 987654325@,其中 m 是 InBuffer 的大小,n 是 outbuffer 的大小。 (只是一种,因为当你算法开始时,除了 n>2*m 之外,你无法告诉任何关于 n 的信息。
  • 没有变量声明的代码发布是没有意义的。阅读别人的代码时,首先要检查的是所有变量的类型。

标签: c arrays for-loop


【解决方案1】:

我注意到的第一件事是您使用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 中的内容,以及最后一个 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;
}

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

更新:我刚刚注意到每个 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 其中 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 
}

【讨论】:

  • 我比你上一个例子更喜欢 for 循环。通常最好避免在一个语句中增加和索引运算符 (OutBuffer[n++])。至少在你确切知道自己在做什么之前。
  • Caleb 你还在比较 int 和指针:m &lt; InBuffer vs InBuffer[m] - 不会很好结束
  • 谢谢@Caleb,在传输示例代码时,我笨拙地没有比较 InBuffer 的长度。
【解决方案2】:

正如 Caleb 指出的,您应该为每个数组使用一个变量。

如果您说DATA 可以包含多个元素,那么您应该在每次迭代中将outBuffer 的变量增加SIZE。还可以使用循环将DATAs 字段分配给OutBuffer

int n = XXX; // set n to the first element you need to assign an ID to
for (m = 2; m < ElementsInBuffer; m++)
{
  OutBuffer[n] = InBuffer[m];
  returnPointersToDataAndSizeFunction(InBuffer[m],&SIZE,&DATA);
  OutBuffer[n + 1] = SIZE;
  for (int i = 0; i < SIZE; i++)
  {
    OutBuffer[n + 2 + i] = DATA[i]; // works for array only see Calebs answer to see how it works for structs
  }
  n += SIZE + 1; // +1 to also skip the field for SIZE 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    相关资源
    最近更新 更多