У меня есть следующая функция 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, вызывающий мои проблемы, но я не уверен, что с ним может быть ошибкой.
Очень необычно для C-программы, которая работает с массивами по указателю, чтобы также не иметь параметр, содержащий размер массива (или использовать нулевой элемент в качестве часового). Мне также интересно узнать, что вы делаете с 'struct fann', также как вы вычисляете' _NoLayers'? – Dai
'struct fann' создается отдельной функцией в библиотеке. Затем он передается почти в каждую другую функцию в библиотеке. Я реализовал кучу этих других функций в .NET - все они принимают 'struct fann' одинаково, и все они работают, поэтому я подозреваю, что моя проблема не исходит оттуда. – RPM
'_NoLayers' возвращается одной из функций, действующих на' struct fann * ann'. В моем опыте сценария я знаю, что это три, и он возвращает три, так что это, вероятно, тоже не является источником моей проблемы. – RPM