我正在将一些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#中的错误。
答案 0 :(得分:2)
C代码未传递单个整数。它使用&
前缀运算符传递地址一个整数。
似乎确实存在某种拼写错误,因为C代码引用了windowN
中struct
成员似乎不存在的成员。
假设它意味着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数组的一部分。所以你可以看到他们传递的是“阵列的价值”,即使这不是你期望的。