Используйте c ++ uint8_t * из c #, используя SWIG - PullRequest
0 голосов
/ 04 июня 2018

У меня есть функция g, которая выглядит примерно так:

virtual int64_t Read(uint8_t* buffer, int64_t bufferLength) = 0

, которую мы хотим переопределить (поскольку это абстрактный класс) и имплементация из кода C # (с использованием Director).используя

%include "arrays_csharp.i"
%apply uint8_t INPUT[] {uint8_t* buffer}

Я смог получить перевод AC # с подписью

public virtual long Read(byte[] buffer, long bufferLength)

, что я и хотел.но при попытке скомпилировать код SWIG мы получаем следующие ошибки:

 error C2440: '=': cannot convert from 'void *' to 'unsigned char *'
 note: Conversion from 'void*' to pointer to non-'void' requires an explicit cast

из-за этих строк в сгенерированном файле swig cc:

 int64_t c_result = SwigValueInit< int64_t >() ;
 long long jresult = 0 ;
 unsigned char* jbuffer = 0 ;
 long long jbufferLength  ;
 long long jbufferOffset  ;

 if (!swig_callbackRead__SWIG_0) {
    throw Swig::DirectorPureVirtualException("mip::Stream::Read");
  } else {
    jbuffer = (void *) buffer; <========= FAIL LINE
    jbufferLength = bufferLength;
    jresult = (long long) swig_callbackRead__SWIG_0(jbuffer, jbufferLength);
    c_result = (int64_t)jresult; 
  }

Как я могу сказать SWIG небросить в (void *)?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Похоже, что директория typemap не совсем здесь.Я думаю, что этого должно быть достаточно, чтобы исправить это в строке после вашей директивы %apply:

%typemap(directorin) uint8_t *buffer "$input = $1;"

Приведенная выше таблица типов соответствует только неконстантным uint8_t* параметрам с именем buffer.Мы можем сделать это гораздо более универсальным, если захотим, например:

%typemap(directorin) SWIGTYPE * "$input = $1;"

Будет соответствовать любому, у которого нет лучшего соответствия, как константного, так и неконстантного.Я не могу понять, почему это не так, по умолчанию, так что здесь есть риск, что это может сломать что-то в другом месте, о чем я не думал, так что вы можете продолжить выборочно в тех случаях, когда это применяется ..

Вы также можете сделать что-то вроде:

%typemap(directorin) SWIGTYPE * "$input = ($1_ltype)$1;"

Или добавить другой вариант:

%typemap(directorin) const SWIGTYPE * "$input = const_cast<$1_ltype>($1);"
0 голосов
/ 04 июня 2018

Сообщение об ошибке от компилятора довольно простое.Вы должны явно конвертировать void * в unsigned char *.

Попробуйте:

jresult = (long long) swig_callbackRead__SWIG_0(static_cast<unsigned char *>(jbuffer), jbufferLength);
...