15

Cライブラリに関数があります。これは、引数の1つとしてrunsim()ポインタを取り、はによって与えられますstruct repdatastruct repdata

struct repdata {
    int *var1;
    int *var2;
    int *var3;
    char *var4;
    double *var5;
    double *var6;
    int *var7;
};

C のみを使用する場合struct repdata、関数を呼び出す型の変数を初期化します。

struct repdata data;
void create_data_container(struct repdata *data, int len_data)
{

    data -> var1 = malloc( sizeof(int) * len_data );
    data -> var2 = malloc( sizeof(int) * len_data );
    data -> var3 = malloc( sizeof(int) * len_data );
    data -> var4 = malloc( sizeof(char) * len_data );
    data -> var5 = malloc( sizeof(double) * len_data);
    data -> var6 = malloc( sizeof(double) * len_data);
    data -> var7 = malloc( sizeof(int) * len_data);
}

シミュレーションが進行するにつれて、この構造体を埋めます。データをファイルに書き込んだ後、標準を使用してメモリを解放します

free(data.var1);
free(data.var2);
.
.
.
free(data.var7);

runsim()Python Ctypes を使用して Python から関数を呼び出したい。このために、引数struct repdataの 1 つとして変数 (の型と同等) へのポインターを渡す必要があります。runsim()Pythonstruct repdataで、次の方法で同等のものを定義したとします。

import ctypes as C

class Repdata(C.Structure):
    _fields_ = [
        ("var1", C.POINTER(C.c_int)),
        ("var2", C.POINTER(C.c_int)),
        ("var3", C.POINTER(C.c_int)),
        ("var4", C.POINTER(C.c_char)),
        ("var5", C.POINTER(C.c_double)),
        ("var6", C.POINTER(C.c_double)),
        ("var7", C.POINTER(C.c_int)),
    ]

create_data_containerPython側で上記の関数に相当するものは何ですか? C コードに渡すことができ、レプリケーション データを格納するための十分なメモリがある Repdata のインスタンスを初期化したいと考えています。また、シミュレーションが完了したら、Python からメモリを解放するにはどうすればよいですか?

Ubuntu Linux 12.04 を使用しています。

よろしくお願いします。

4

1 に答える 1