0

我正在将一些 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# 中的错误。

4

3 回答 3

2

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

不过,似乎确实存在某种错字,因为 C 代码引用了其中似乎不存在的windowN成员 。struct

假设它的意思是windowF,这段代码:

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

告诉被调用函数将给定地址视为 8 个整数的数组。我认为这将溢出到windowF[1][]. 这是非常可怕的代码,但如果它像您所说的那样错误,它将无法编译。在 C 中,通常不能将整数传递给需要指针的函数。

于 2012-09-14T15:19:59.683 回答
1

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

blockSwitchingControl->windowN

不存在于 BLOCK_SWITCHING_CONTROL 结构中。所以我会回答这个假设你ment类似windowF

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

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

正在传递 windowF 的 [0][7]'th 元素的地址。多维数组是线性(连续)内存,因此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] 元素的地址,我实际上是传递了数组的一部分:

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 数组的一部分。所以你可以看到他们正在传递一个“数组的值”,即使它不是你所期望的。

于 2012-09-14T15:44:05.083 回答
1

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

Soin[i+1]将等价于blockSwitchingControl->windowN[0][8],大概是数组中的一个有效项。

于 2012-09-14T15:21:06.327 回答