C # взаимодействие: обработка массива указателей в неуправляемой структуре - PullRequest
0 голосов
/ 10 августа 2010

Я завершаю несколько звонков в неуправляемую библиотеку Aubio DLL (Aubio.org), и мне интересно, какой хороший способ иметь дело с сэмплебуфером Aubio.

Это определено так:

// Buffer for real values
struct _fvec_t {
  uint length;    // length of buffer
  uint channels;  // number of channels
  float **data;   // data array of size [length] * [channels]
};

Aubio создает структуру для меня с правильно настроенными камерами данных, поэтому я получаю IntPtr. Мне нужно читать / записывать указатель (и) данных из моего кода C #.

for (int chan_idx = 0; chan_idx < my_fvec.channels; ++chan_idx)
    for (int i=0; i<something; i++)
       my_fvec.data[chan_idx][i] = SomeRandomValue();

Как правильно сопоставить структуру C # с типом fvec_t, чтобы я мог правильно обращаться к элементу данных для чтения / записи в него?

(Или я должен использовать Marshal.Copy, и как мне сделать это с массивом указателей?)

1 Ответ

0 голосов
/ 10 августа 2010

Я думаю, вы могли бы определить управляемую структуру и PtrToStructure, что у вас есть, изменить, затем StructureToPtr (обратно в то же место), но это может быть так же просто, так как память уже распределена и все, просто прочитайте intptr для массивов, а затем запишите в них массивы с плавающей запятой с помощью Copy:

http://msdn.microsoft.com/en-us/library/ez2e4559.aspx

...