C# struct to C++ Проблема сортировки

Я вызываю функцию С++ из С#.

Это заголовок функции в C++:

int src_simple (SRC_DATA *data, int converter_type, int channels) ;

И это эквивалентная функция С#:

[DllImport("libsamplerate-0.dll")]
    public static extern int src_simple(ref SRC_DATA sd, int converter_type, int channels);

Это структура SRC_DATA в C++, а затем в C#:

 typedef struct
  {   float  *data_in, *data_out ;

      long   input_frames, output_frames ;
      long   input_frames_used, output_frames_gen ;

      int    end_of_input ;

      double src_ratio ;
  } SRC_DATA ;

Это структура С#, которую я определил:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SRC_DATA
{

    public IntPtr data_in, data_out;

    public long input_frames, output_frames;
    public long input_frames_used, output_frames_gen;

    public int end_of_input;
    public double src_ratio;

}

Большая проблема заключается в том, что последний параметр, src_ratio, не доставляется должным образом функции C++ (она видит его как 0 или что-то недопустимое).

Верны ли мои заявления?

Спасибо


person Roey    schedule 12.07.2010    source источник


Ответы (3)


Вы уверены, что проблема в элементе src_ratio? long в С# 64-битный. В C++ на платформе Win32 long составляет 32 бита, я думаю, вам нужно использовать int в C# для длинных членов структуры C++. Кроме того, Pack = 1 выглядит немного странно, вы используете такое же выравнивание элементов структуры в C++?

person Alex F    schedule 12.07.2010
comment
Вы были правы, пакет = 1 был ошибкой. Я просто позволил ему использовать значение по умолчанию :) - person Roey; 12.07.2010

Вы принудительно упаковываете в С#, но не в С++. Что может произойти, так это то, что компилятор C++ дополняет 7 in32 четырьмя дополнительными байтами, чтобы обеспечить выравнивание двойного числа по 8 байтам.

Проверьте директивы компилятора #pragma pack.

person Community    schedule 12.07.2010

Проверьте размер int в вашем компиляторе C++. C# int всегда 32 бита.

person Rich Tebb    schedule 12.07.2010