Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWIG:如何传递C++;对象从C#到C++;? 我有一个C++数据类,它存储指向堆分配内存的指针;我可以使用SWIG生成的包装器从C#实例化和使用它。 当我试图调用包装库中的一个函数,该函数需要这些数据类的数组时,我的问题就出现了;我每次都会碰到分段错误。 我尝试了以下两种方法_C#_C++_Swig - Fatal编程技术网

SWIG:如何传递C++;对象从C#到C++;? 我有一个C++数据类,它存储指向堆分配内存的指针;我可以使用SWIG生成的包装器从C#实例化和使用它。 当我试图调用包装库中的一个函数,该函数需要这些数据类的数组时,我的问题就出现了;我每次都会碰到分段错误。 我尝试了以下两种方法

SWIG:如何传递C++;对象从C#到C++;? 我有一个C++数据类,它存储指向堆分配内存的指针;我可以使用SWIG生成的包装器从C#实例化和使用它。 当我试图调用包装库中的一个函数,该函数需要这些数据类的数组时,我的问题就出现了;我每次都会碰到分段错误。 我尝试了以下两种方法,c#,c++,swig,C#,C++,Swig,简而言之,我的情况是 class DataClass { char* _data; ... } void printDataClassArray(DataClass *toPrint, std::size_t size) { ... } 函数printDataClassArray默认包装为void printDataClassArray(DataClass-toPrint,int-size),我尝试了两种不同的方法来解决这个问题。我把下面的完整代码贴在下面,以帮助好的灵魂,帮助我:

简而言之,我的情况是

class DataClass
{
   char* _data;
   ...
}
void printDataClassArray(DataClass *toPrint, std::size_t size)
{ ... }
函数
printDataClassArray
默认包装为
void printDataClassArray(DataClass-toPrint,int-size)
,我尝试了两种不同的方法来解决这个问题。我把下面的完整代码贴在下面,以帮助好的灵魂,帮助我:<代码>示例。h < /C>包含我正在尝试包装的C++库,<代码>示例。i < />代码包含SWIG接口代码和<代码>消费。Cs<代码>是一个消耗导出函数和类的C函数。 我尝试过研究这个问题,特别是我遵循了这个思路:但我没有找到答案。我不知道我是否遗漏了一些明显的东西,但我认为这应该是SWIG示例的一部分,因为这是一种相当常见的情况

我尝试过两种方法,即使用
CSHARP\u数组
和使用
array\u类
,但都不起作用。请参阅下面的SWIG代码和下面的完整列表

使用_CSHARP_数组_

 CSHARP_ARRAYS(DataClass, DataClass);
 %apply DataClass INPUT[]{ DataClass *toprint }
 %inline %{
 static void PrintAllDataArray(DataClass *toprint, std::size_t size)
 {
     PrintAllData(toprint, size);
 }
 %}
使用_数组_类_

 // Methodology 2
 %array_class(DataClass, DataClassArray);
 %inline %{
   static void PrintAllVariants(DataClassArray va, std::size_t size)
   {
     PrintAllData(DataClassArray_cast(&va), size);
   }
 %}
例h
经过大量调查,为了避免使用
std::vector
,采取了极端的做法,一位朋友建议了一个非常简单的解决方案:在方法2中更改helper函数的签名,以通过引用传递
DataClassArray
,因此:

static void PrintAllVariants(DataClassArray va, std::size_t size)

希望能有帮助

%module example
%include "std_string.i"
%include "arrays_csharp.i"
%include "carrays.i"

#ifdef _WIN32
%include <windows.i>
#endif

%inline %{
  namespace std {
    typedef unsigned int size_t;
  }
%}
%ignore DataEncapsulator;
%ignore copyString;
%ignore copyData;
%ignore deleteString;

%{
#include "example.h"
%}
%rename(copy) *::operator=;
%include "example.h"


// Methodology 1
CSHARP_ARRAYS(DataClass, DataClass);
%apply DataClass INPUT[]{ DataClass *toprint }
%inline %{
static void PrintAllDataArray(DataClass *toprint, std::size_t size)
{
  PrintAllData(toprint, size);
}
%}

// Methodology 2
%array_class(DataClass, DataClassArray);
%inline %{
  static void PrintAllVariants(DataClassArray va, std::size_t size)
  {
    PrintAllData(DataClassArray_cast(&va), size);
  }
%}
var a = new DataClass("first");
var b = new DataClass("second");
// Methodology 1
DataClassArray va = new DataClassArray(2);
va.setitem(0, a);
va.setitem(1, b);
example.PrintAllVariants(va, 2);


// Methodology 2
DataClass[] da = new DataClass[2];
da[0] = a;
da[1] = b;
example.PrintAllDataArray(da, 2);
Console.WriteLine();
static void PrintAllVariants(DataClassArray va, std::size_t size)
static void PrintAllVariants(DataClassArray &va, std::size_t size)