ctypesでC言語側の配列データを取得する方法

// c_hoge.cpp
#include "c_hoge.h"
#include <stdlib.h>

static int numData = 0;
static float* arData = NULL;

void getArrayData(float** ppMem, int* pSize)
{
    if (!arData) {
        numData = 10000;
        arData = new float[numData];
        for (int i=0; i<numData; i++) {
            arData[i] = i;
        }
    }
    *pSize = numData;
    *ppMem = arData;
}
// c_hoge.h
#pragma once

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllexport) void getArrayData(float** ppMem, int* pSize);

#ifdef __cplusplus
}
#endif

g++でDLLを作成。

> g++ -static -shared -o c_hoge.dll c_hoge.cpp
# test.py
from ctypes import *
import sys

cdll = cdll.LoadLibrary('c_hoge.dll')

getArrayData = cdll.getArrayData
getArrayData.argtypes = [POINTER(POINTER(c_float)), POINTER(c_int)]
getArrayData.restype = None

mem = POINTER(c_float)()
size = c_int(0)
getArrayData(byref(mem), byref(size))
print size.value, mem[0], mem[1], mem[2:4], mem[size.value-1]

実行結果。

>python test.py
10000 0.0 1.0 [2.0, 3.0] 9999.0