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

配列の要素のアドレスが渡されています(inに注意し&てください&blockSwitchingControl->windowN[0][8-1])。

したがって、は、おそらく配列内の有効なアイテムとin[i+1]同等になります。blockSwitchingControl->windowN[0][8]

于 2012-09-14T15:21:06.327 に答える
1

OK、最初に、コードに間違いがあると想定する必要があります。

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]要素のアドレスを渡す場合、実際には配列の一部を渡します。

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

したがって、SrchMaxWithIndex()内には、_in[]=ウィンドウFの配列の一部に相当するInt32の配列があります。したがって、期待した方法ではない場合でも、「配列に相当する値」を渡していることがわかります。

于 2012-09-14T15:44:05.083 に答える