конвертировать код c ++ в c # при объявлении массива - PullRequest
2 голосов
/ 08 марта 2012

В последнее время я хочу конвертировать некоторые коды из OpenCV в 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.Так может кто-нибудь дать мне подсказку, которая правильна в следующем (в c #), или может кто-нибудь показать мне другие примеры:

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

или

int[] memorySteps =new int [10];

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Ваше понимание верно;версия C ++ создаст массив из 40 целых чисел, предполагая sizeof(int)==4.Может случиться так, что автор смешался с C malloc, который принимает размер в байтах.

Таким образом, ваша первая версия будет вести себя так же, а вторая с большей вероятностью даст ожидаемое поведение- но есть опасность, что слишком большой буфер скрывал другие ошибки, которые могут внезапно появиться, если вы уменьшите размер.

2 голосов
/ 08 марта 2012

Если алгоритму нужно десять элементов, используйте

int[] memorySteps =new int [10];

Я подозреваю, что код C ++ был сам портирован из кода C, где программист назвал malloc, например:

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

Кто бы ни преобразовал этот код в C ++, он, вероятно, забыл убрать множитель. Это привело к функционально правильному, но в то же время неэффективному коду кода (хотя потеря 30 байт в наши дни вряд ли даже считается неэффективной).

0 голосов
/ 08 марта 2012

Что вам нужно, это:

int[] steps = new int [10];
...