动态的动态数组(struct数组)



我有一个名为person的结构体,如下所示:

struct person {
    int height, weight;
};

我还创建了一个person数组,如下所示:

struct Arrayofperson {
    int len;   //indicates the length of this array(its supposed to be dynamic)
    person *p; //this is supposed to be the dynamic array of person.
};       

对于person数组的数组,我这样做:

struct Array_2d_ofperson{
    int len;   //indicates the length of this array(its supposed to be dynamic)
    Arrayofperson *subarray; //this is supposed to be the dynamic 2d array of person.
};   

这是我的代码:

#include <iostream>
#include "test.h"
using namespace std;
#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT Arrayofperson create_arr_person(int len) {
    Arrayofperson arr_p;
    arr_p.len = len;
    arr_p.p = new person[len];
    //populate the array here:
    for (int a = 0; a < len; a++) {
        arr_p.p[a].height = a; //yes they're the same, but it doesn't matter for now.
        arr_p.p[a].weight = a; 
    };
    return arr_p;
}
DLLEXPORT void print_arr_person(Arrayofperson pp) {
    printf("length: %dn", pp.len);
    for (int b = 0; b < pp.len; b++) {
        printf("height, weight %d, %dn", pp.p[b].height, pp.p[b].weight);
    }; 
}
DLLEXPORT Array_2d_ofperson create_2darr_person(int len, int sublen) {
    Array_2d_ofperson arr_2d_person;
    arr_2d_person.len = len;
    arr_2d_person.subarray = new Arrayofperson[len];
    for (int a = 0; a < len; a++) {
        arr_2d_person.subarray[a].len = sublen;
        arr_2d_person.subarray[a].p = new person[sublen];
        for (int b = 0; b < sublen; b++) {          
            arr_2d_person.subarray[a].p[b].height = b;
            arr_2d_person.subarray[a].p[b].weight = b;
        }
    };
    for (int a = 0; a < len; a++) {
        for (int b = 0; b < sublen; b++) {  
            printf("(a, b): %d, %d", arr_2d_person.subarray[a].p[b].height, arr_2d_person.subarray[a].p[b].weight);
            printf("n");
        }
    };
    return arr_2d_person;
    cin.get();
}
DLLEXPORT void print_2darr_person(Array_2d_ofperson pp) {
    int len = pp.len;
    int sublen = pp.subarray[0].len; //yes I haven't forgotten that it can change between different subarrays.
    for (int a = 0; a < len; a++) {
        for (int b = 0; b < sublen; b++) {  
            printf("(a, b): %d, %d", pp.subarray[a].p[b].height, pp.subarray[a].p[b].weight);
            printf("n");
        }
    }; 
}

我打算从上面的代码制作一个dll(为什么在这里不重要)(以后会有更多的代码),并在python中使用它。下面是我的问题:

1)似乎当我在python端这样做时:

from ctypes import *
test = CDLL('test.dll') //the dll from the code above, yes it works.
arr = test.create_arr_person(6)
test.print_arr_person(arr)
arr2 = test.create_2darr_person(2, 3)
#test.print_2darr_person(arr2)
raw_input('h')

打印person数组得到垃圾,当我尝试打印2d数组时,从windows得到访问冲突错误。

所以这里是我的问题,按重要性排序(我不想在dll中使用python api,因为dll也可以被其他语言使用)

1)我如何使专用于数组/2array的内存留在内存中,这样我就不会得到访问冲突错误。我试过做静态Arrayofperson,但它没有工作。

2)如何在2d数组的子数组中轻松访问person,而不是这样做。pp.subarray[a].p[b]。(我想这样做:pp [a][b],其中pp是2array的人)。我相信这与重载[ ]操作符有关,但我不熟悉制作类(这就是为什么我现在制作了一个结构体)。

3)如何在python中使用相同的方式访问数组/2array(我想在python中这样做:

)
test = CDLL('test.dll')
array_of_person = test.create_arr_person(5)
print (array_of_person[0]) #something like this

这里的问题是python不知道如何处理你的结构。查看ctypes的文档,它有一个支持的python类型列表,你可以传递给C函数,以及如何使其处理更多类型的文档。

从你写的方式来看,python认为你所有的函数都返回int。

你需要阅读http://docs.python.org/library/ctypes.html

编辑:如果你做得对,你可能最终会从C函数返回一个指向你的结构体的不透明指针给python。在struct内部,你可以使用所有c++特性,包括一些好的东西,比如std::vector.

我试着在Linux机器上编译你的代码(gcc 4.4.3),它可以工作。

你考虑过使用STL容器(vector)吗?您可以使用向量的向量来生成多维数组,而不必担心内存泄漏。

可以使用vector保证是一个连续的内存块这一事实,并返回指向第一个元素的指针。

T * p = &v[0]

这个指针可以像普通数组一样被访问,并且跨模块边界是安全的。同样的技术也适用于std::string,它可以通过一个指向存储的原始指针来访问。

const char * p = s.c_str();

你只需要确保持有存储的对象在你完成之前不会意外地超出作用域。

多维数组总是可以投影到一维上。

1 1 1

2

3

可以保存为:

最新更新