C# C代码中的数组索引混淆
我正在将一些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],
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你。