【发布时间】:2011-12-13 07:22:13
【问题描述】:
我有一个名为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.
};
我对@987654325@ 的数组执行此操作,如下所示:
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: %d\n", pp.len);
for (int b = 0; b < pp.len; b++) {
printf("height, weight %d, %d\n", 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')
当我尝试打印 2d 数组时,打印人员数组时收到垃圾,并从 Windows 收到访问冲突错误。
所以这是我的问题,按重要性排序(我不想在 dll 中使用 python api,因为 dll 也可以被其他语言使用)
1) 如何使专用于数组/ 2darray 的内存保留在内存中,以免出现访问冲突错误。我试过做静态Arrayofperson,但没用。
2) 如何在二维数组的子数组中轻松访问person 而不是这样做。
pp.subarray[a].p[b]。 (我想这样做:pp[a][b],其中 pp 是人的 2darray)。我相信这与重载[ ] 运算符有关,但我不熟悉制作类(这就是我现在制作结构的原因)。
3) 如何使用相同的方式在 python 中访问数组/2darray(我想在 python 中执行此操作:
test = CDLL('test.dll')
array_of_person = test.create_arr_person(5)
print (array_of_person[0]) #something like this
【问题讨论】:
-
你想创建人的二维数组......对吗?
-
我已经知道如何创建数组,但是我不知道如何在函数返回后将其中的信息保持“活跃”。