C代码中的数组索引混淆

时间:2012-09-14 15:18:40

标签: c# c porting

我正在将一些C代码移植到C#。我陷入困境,我不太了解作者以不熟悉的方式编写代码的意图。

守则是:

typedef struct{
  Int32 window[2][8];     
  Int32 windowF[2][8];
  short Index; 
}BLOCK_SWITCHING_CONTROL;

maxWindow = SrchMaxWithIndex( &blockSwitchingControl->window[0][8-1],
                                      &blockSwitchingControl->Index, 8);

*****************************************************************************
*
* function name: SrchMaxWithIndex
* description:  search for the biggest value in an array
* returns:      the max value
*
**********************************************************************************/
static Int32 SrchMaxWithIndex(const Int32 in[], Int16 *index, Int16 n)
{
  Int32 max;
  Int32 i, idx;

  /* Search maximum value in array and return index and value */
  max = 0;                                                       
  idx = 0;                                                       

  for (i = 0; i < n; i++) {

    if (in[i+1]  > max) {
      max = in[i+1];                                             
      idx = i;                                                   
    }
  }
  *index = idx;                                                  

  return(max);
}

正如您所看到的,当调用SrchMaxWithIndex时,不是数组而是单个Int32作为其第一个参数传递,这当然是错误的。但是因为我确信C代码没有任何问题,我确信我在这里遗漏了一些东西。 我错过了什么?作者打算传递单个Int32而不是数组?

到目前为止,我已按以下方式将上述内容移植到C#:

static class BLOCK_SWITCHING_CONTROL{
  Int32[][] window = new int[2]{new int[8], new int[8]};     
  Int32[][] windowF = new int[2]{new int[8], new int[8]};
  short Index; 
};


 maxWindow = SrchMaxWithIndex( blockSwitchingControl.window[0]/*[8-1]*/,
                                      out blockSwitchingControl.Index);

*****************************************************************************
*
* function name: SrchMaxWithIndex
* description:  search for the biggest value in an array
* returns:      the max value
*
**********************************************************************************/
static Int32 SrchMaxWithIndex(Int32 _in[], out Int16 index)
{
  Int32 max;
  Int32 i, idx;

  /* Search maximum value in array and return index and value */
  max = 0;                                                       
  idx = 0;                                                       

  for (i = 0; i < _in.Length; i++) {

    if (in[i+1]  > max) {
      max = in[i+1];                                             
      idx = i;                                                   
    }
  }
  index = idx;                                                  

  return(max);
}

但它只是删除C#中的错误。

3 个答案:

答案 0 :(得分:2)

C代码未传递单个整数。它使用&前缀运算符传递地址一个整数。

似乎确实存在某种拼写错误,因为C代码引用了windowNstruct成员似乎不存在的成员。

假设它意味着windowF,这段代码:

maxWindow = SrchMaxWithIndex(&blockSwitchingControl->windowF[0][8-1],
                                  &blockSwitchingControl->Index, 8);

告诉被调用函数将给定地址视为8个整数的数组。我想这会溢出到windowF[1][]。这是非常可怕的代码,但如果它像你说的那样错,那就不会编译。通常,您不能将整数传递给期望指针的函数,在C。

答案 1 :(得分:1)

正在传递数组元素的地址(注意&中的&blockSwitchingControl->windowN[0][8-1])。

因此in[i+1]将等同于blockSwitchingControl->windowN[0][8],这可能是数组中的有效项。

答案 2 :(得分:1)

好的,首先,我必须假设您在代码中有错误:

blockSwitchingControl->windowN

BLOCK_SWITCHING_CONTROL结构中不存在。假设您选择windowF

之类的东西,我会回答这个问题

现在你的问题,作者确实通过了一个数组... ... 推测blockSwitchingControl是BLOCK_SWITCHING_CONTROL类型的结构。我们在这里做的是什么:

&blockSwitchingControl->windowF[0][8-1]

传递windowF的[0] [7]'元素的地址。多维数组是线性(连续)存储器,因此Int32 windowF[2][8]的大小适合16个Int32存储在内存中的“行”中。类似的东西:

windowF[2][8] => [0][1][2][3][4][5][6][7][8][9][A][B][C][D][E][F][10]

因此,如果我要传递windowF的[0] [7]元素的地址,我实际上正在传递数组的 part

windowF[0][7]    [0][1][2][3][4][5][6][7][8][9][A][B][C][D][E][F][10]  //full array
          -----------------------------^

所以现在在SrchMaxWithIndex()里面我有_in [] =一个Int32数组,相当于windowF数组的一部分。所以你可以看到他们传递的是“阵列的价值”,即使这不是你期望的。