2012-03-08 6 views
2

最近opencvのコードをc#に変換したい。しかし、私はC + +で動的配列を宣言する上でいくつか問題があります。配列を宣言する際にC++コードをC#に変換する

int* memorySteps = 0; 
CV_CALL(memorySteps = new int [ 10*sizeof(memorySteps[0]) ]);  

通常のc#int配列に変換したいと考えています。問題は長さです.C++では、上記の宣言は、コンパイラが40のint要素を持つ配列を作成するようです(memorySteps [0]タイプのサイズは4,4バイト長です)。私の理解は正しいのですか?しかし、実際にはアルゴリズムでは10個のint要素の配列しか必要ないので、意味をなさない。使用し、その後、アルゴリズムは10個のアイテムを必要とする場合

int[] memorySteps =new int [10*sizeof(int)]; 

または

int[] memorySteps =new int [10]; 
+0

他の人のコードでバグを見つける素晴らしい世界へようこそ! – dasblinkenlight

+2

はい、そのC++コードは理にかなっていません。 –

答えて

2

あなたの理解は正しいです。 C++バージョンはsizeof(int)==4と仮定して40個の整数の配列を作成します。作者がCのmallocと混ざっている可能性があります。サイズはバイト単位です。

最初のバージョンでは同じ動作が得られ、2番目の動作では意図した動作が得られる可能性が高くなりますが、余分なバッファが他のバグを隠している可能性があります。サイズ。

+0

動的配列の長さをチェックするループを作成しました。 'for(int n = 0; memorySteps [n]; ++ n){}'。 nの結果は(私の理解では)40でなければならないが、44の結果を返す。それは本当に私を混乱させる。 – fskking

2

:だから誰も私に(C#の場合)以下、または誰かが私を見ることができ、他の例では権利であるヒントを与えることができます

私はC++コードは、このように、プログラマは mallocと呼ばれるCコードから自身を移植されたと思われる
int[] memorySteps =new int [10]; 

memorySteps = malloc(10*sizeof(memorySteps[0])); 

誰かがそのコードをC++に変換した人は、おそらく乗数を取り除くことを忘れているでしょう。これは、機能的には正しいが、ややメモリ非効率なコードとなっている(しかし、最近では30バイトを無駄にすることはほとんどありません)。

0

何が必要です:

int[] steps = new int [10]; 
関連する問題