2014-12-02 5 views
0

У меня есть C++ DLL, которая имеет функции для отправки данных с устройства. Из моего управляемого кода на C# я вызываю функцию C++ functionCallback. Здесь обратите внимание на поз. pos по определению - это массив из трех указателей, указывающий на массивы позиций.IntPtr адрес increment (not value)

public void positionCallback(uint devNo,uint count,uint index,ref System.IntPtr pos,ref System.IntPtr mrk) 

Теперь мой вопрос я хочу, чтобы извлечь данные каждого из этих 3-х массивов, но я могу только получить данные для массива 1 и для отдыха 2 я получаю значение мусора. Ниже приведен код, я пытаюсь

// Copy the unmanaged array to managed memory for Axis 2 
IntPtr ptr2 = IntPtr.Add(pos,2*sizeof(Int64)); 
Marshal.Copy(pos,managedArrayAxis1,0,(int)count); 
// Copy the unmanaged array to managed memory for Axis 2 
Marshal.Copy(ptr2, managedArrayAxis2, 0, (int)count); 

Приведенный выше код дает правильные данные только для managedArrayAxis1 но managedArrayAxis2, мусор данных сбора. Я ошибочно увеличиваю адрес IntPtr для pos?

Пожалуйста, помогите!

+0

вы уверены, что Int64 правильно? Если он должен быть int, и вы используете Int64, это вызовет проблемы. – pquest

+0

Int32 также дает значения мусора для managedArrayAxis2. Так что попробовали оба. Любое другое предложение поможет! – Maverick

+0

Что касается того факта, что вы передаете эти указатели по ссылке. Я бы предположил, что это будет выглядеть как int ** в библиотеке C++. вы уверены, что это то, что ищет метод C++? – pquest

ответ

2

Этот параметр pos на самом деле является указателем на массив указателей на двойные массивы, поэтому вам нужно разыменовать его дважды. Что происходит с вашим кодом, так это то, что ref автоматически разыскивает указатель на массив указателей, но то, что вы получаете в pos, - это всего лишь первый указатель из 3-х указателей второго уровня и не имеет возможности добраться до двух других.

Чтобы получить исходный указатель, вам необходимо удалить ключевое слово ref на номер pos. Затем скопируйте данные указывает pos в массив IntPtr с и вам не потребуется каких-либо указателей арифметика:

public void positionCallback(uint devNo,uint count,uint index,System.IntPtr pos,ref System.IntPtr mrk) 

// copy the array of pointers 
IntPtr[] arrays = new IntPtr[3]; 
Marshal.Copy(pos, arrays, 0, 3); 

// Copy the unmanaged array to managed memory for Axis 2 
Marshal.Copy(arrays[0],managedArrayAxis1,0,(int)count); 

// Copy the unmanaged array to managed memory for Axis 2 
Marshal.Copy(arrays[1], managedArrayAxis2, 0, (int)count); 
+0

@ Бен, почему «Нет»? Вы совершенно правы, есть только два слоя: верхний - это массив 'double *', который я копирую в 'массивы' с первым« Marshal.Copy ». Это позволяет мне получить доступ к массивам 3-го уровня, которые я делаю с двумя другими вызовами «Marshal.Copy()», которые я только что скопировал из вопроса. В чем твоя проблема? –

+0

Извините, я неверно истолковал ваше первое предложение как тройной указатель. –