Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C代码中的数组索引混淆_C#_C_Porting - Fatal编程技术网

C# C代码中的数组索引混淆

C# C代码中的数组索引混淆,c#,c,porting,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],

我正在将一些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);
}

但这只是为了消除C#中的错误。

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

但是似乎确实存在某种类型的输入错误,因为C代码引用了
struct
中似乎不存在的
windowN
成员

假设它的意思是
windowF
,则此代码:

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

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

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

但是似乎确实存在某种类型的输入错误,因为C代码引用了
struct
中似乎不存在的
windowN
成员

假设它的意思是
windowF
,则此代码:

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

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

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


因此,[i+1]中的
将相当于
blockSwitchingControl->windowN[0][8]
,这大概是数组中的一个有效项。

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


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

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

blockSwitchingControl->windowN
在块交换控制结构中不存在。所以我将回答这个问题,假设您使用类似于
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]元素的地址,我实际上传递的是数组的部分:

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

因此,现在在SrchMaxWithIndex()中,我在[]=中有一个Int32数组,它相当于windowF数组的一部分。因此,您可以看到他们正在传递一个“数组值”,即使这不是您期望的方式。

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

blockSwitchingControl->windowN
在块交换控制结构中不存在。所以我将回答这个问题,假设您使用类似于
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]元素的地址,我实际上传递的是数组的部分:

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

因此,现在在SrchMaxWithIndex()中,我在[]=中有一个Int32数组,它相当于windowF数组的一部分。因此,您可以看到他们正在传递一个“数组的值”,即使这不是您所期望的方式。

更准确地说,它传递的是要搜索的数组的第一个元素前一个元素的地址,以及该数组的大小。非传统。那么,将其移植到C#的有效方法是什么@unwind@SeanVaughn:将
窗口[1]
作为要搜索的数组传递,并将下标从
[i+1]
更改为简单的
[i]
。谢谢@DCoder:)。由于您没有发布答案,我欠您几分,我会尽可能地+1您。更准确地说,它传递要搜索的数组第一个元素前一个元素的地址,以及该数组的大小。非传统。那么,将其移植到C#的有效方法是什么@unwind@SeanVaughn:将
窗口[1]
作为要搜索的数组传递,并将下标从
[i+1]
更改为简单的
[i]
。谢谢@DCoder:)。由于你没有发布答案,我欠你几分,我会尽可能地+1你。