如何将动态2D数组从C ++传递给C作为void *

时间:2011-09-01 19:22:08

标签: c++

用C编写的函数,例如

extern "C" void cityManipulator( void * data, int size);

采用与此类似的数组,

中国上海,17
德里,印度,16
开罗,埃及,7

然后将城市名称资本化,并将人口数量乘以100万。 该函数使用我传递的值而不是副本。
该函数需要知道数组的维度:给定列中每个元素(即每个城市名称)的行数和列数以及字节数
我对C函数的工作原理不感兴趣,但是我想用C ++来实现它 数组必须是动态的,即列和行不是静态的。

我需要传递给这个函数的数据结构应该是什么样的?

这是我的尝试。使用boost :: variant

的嵌套向量
typedef boost::variant<std::string, int> Var;
typedef std::vector<Var> OneRow;
std::vector<OneRow> theArray;

但我无法弄清楚如何将theArray传递给cityManipulator( void *d ).
&theArray[0]
无效。

2 个答案:

答案 0 :(得分:1)

我甚至不会尝试将类的实例传递给C.我的方法是:

  1. 将我的数据从我的C ++类导出到适合要调用的函数的内存中
  2. 调用函数
  3. 将修改后的数据导回我的C ++类。
  4. 要么,或者如果函数是微不足道的,请在C ++中重新实现它。


    编辑:在C中实现结构中可变数量的元素。

    如果您拥有的只是访问单个参数,则无法在explcitly中传递数组中的元素数。在这种情况下,您可以使用两种方法。

    第一种方法是以某种方式标记最后一个条目。这样做的明确方法是在结构中添加字段isLastEntry,并在除最后一个条目之外的所有条目中将其设置为false。这样做的隐含方法是分配一个特殊元素,并使其成为数组中的最后一个条目。零终止字符串属于此类别。对于复杂结构,例如npclaudiu's answer中提供的结构,您可以添加最终的虚拟字段,其中所有指针都设置为NULL作为终止符。

    替代方法的结构包含长度作为第一个元素,数组作为最后一个元素。由于C不支持可变长度数组,因此您可以使用诸如in this question之类的技巧。只需用您的结构替换BYTE类型即可处理复杂类型而不是字符串。

答案 1 :(得分:0)

你也可以试试这个:

// C++

struct Row {
    char* City;
    char* Country;
    int Population;
};

std::vector<Row> rows;

// Then call your C function like this:
cityManipulator(&rows[0]);