2015-12-12 2 views
-1

У меня есть следующая функция C Я пытаюсь позвонить:сортировочного массив беззнаковых целых чисел в VB.NET

void fann_get_layer_array(struct fann * ann, unsigned int * layers) 

В этом случае я не знаю длину layers заранее, поэтому я использую следующий PInvoke получить IntPtr обратно:

<DllImport(fanndir, CallingConvention:=CallingConvention.StdCall, EntryPoint:="_fann_get_layer_ar[email protected]")> 
Public Sub fann_get_layer_array(ByVal ann As IntPtr, ByRef layers As IntPtr) 
End Sub 

и я пытаюсь восстановить массив с помощью Marshal.Copy:

Dim LayerArrayb(_NoLayers - 1) As Byte 
Call fann_get_layer_array(pNN, pLayerArray) 
Marshal.Copy(pLayerArray, LayerArrayb, 0, _NoLayers) 

Однако, когда я выполняю строку Marshal.Copy, я получаю исключение AccessViolationException. Первоначально я думал, что это связано с тем, что layers в коде C не является знаком, но попытка восстановить массив байтов не решит ситуацию. С тех пор я заметил, что pLayerArray принимает подозрительно низкие значения, заставляя меня думать, что это может быть мой оператор PInvoke, вызывающий мои проблемы, но я не уверен, что с ним может быть ошибкой.

+0

Очень необычно для C-программы, которая работает с массивами по указателю, чтобы также не иметь параметр, содержащий размер массива (или использовать нулевой элемент в качестве часового). Мне также интересно узнать, что вы делаете с 'struct fann', также как вы вычисляете' _NoLayers'? – Dai

+0

'struct fann' создается отдельной функцией в библиотеке. Затем он передается почти в каждую другую функцию в библиотеке. Я реализовал кучу этих других функций в .NET - все они принимают 'struct fann' одинаково, и все они работают, поэтому я подозреваю, что моя проблема не исходит оттуда. – RPM

+0

'_NoLayers' возвращается одной из функций, действующих на' struct fann * ann'. В моем опыте сценария я знаю, что это три, и он возвращает три, так что это, вероятно, тоже не является источником моей проблемы. – RPM

ответ

0

Благодаря @David Хефферман для сдачи меня на верном пути, указывая на то, что нативный код ждет предопределенного массива (и что мне нужно byval в моей PInvoke и не byref. Следующий работали для меня. ..

Мои PInvoke заявление должно было быть в следующей форме:

<DllImport(fanndir, CallingConvention:=CallingConvention.StdCall, EntryPoint:="[email protected]")> 
Public Sub fann_get_layer_array(ByVal ann As IntPtr, byvallayers As IntPtr) 
End Sub 

И следующие работы, чтобы восстановить мой массив:

Dim pLayerArray As IntPtr 
Dim LayerArray(_NoLayers - 1) As Integer 
pLayerArray = Marshal.AllocHGlobal(NoLayers * 32) 
Call fann_get_layer_array(pNN, pLayerArray) 
Marshal.Copy(pLayerArray, LayerArray, 0, _NoLayers) 
Смежные вопросы