第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何從內(nèi)存分配發(fā)生在C層的Python腳本將float*數(shù)組傳遞給C方法

如何從內(nèi)存分配發(fā)生在C層的Python腳本將float*數(shù)組傳遞給C方法

喵喔喔 2023-10-26 15:13:07
我試圖從Python腳本調(diào)用C方法,C方法調(diào)用反過(guò)來(lái)C++方法。我使用 malloc() 在 getResults() 方法內(nèi)分配數(shù)組。現(xiàn)在的問(wèn)題是如何將參數(shù)傳遞給 python 腳本中的 float* oresults,其內(nèi)存分配發(fā)生在 C 層內(nèi)。這是io.cint getResults(char* iFilename, char* iStagename, int iStateidCnt,     int* Stateids, int iEntityIdCount, int* iEntityids, char* iEntityType,    char* iVariablegroup, char* ivariable, int *oRescount,    float* oResults){    int Status, i;        EString etype(iEntityType), stagename(iStagename);    EString vargroup(iVariablegroup);    std::vector<ERF_INT> entity_ids;    std::vector<ERF_INT> stateids;    std::vector<ERF_FLOAT> results;    _CopyIntArrayIntoVector(iStateidCnt, Stateids, stateids);    _CopyIntArrayIntoVector(iEntityIdCount, iEntityids, entity_ids);    CreateIoInstance(iFilename, iStagename);    ioData pIodata = CreateIoDataInstance();    if (iEntityIdCount <= 0)        pIodata.setWholeSection(true);    else    {        pIodata.setWholeSection(false);        pIodata.setEntityList(entity_ids);    }            pIodata.setStateList(stateids);    pIodata.setType(etype);    pIodata.setVariableGroup(iVariablegroup);    pIodata.setVariable(ivariable);        //This is C++ method    Status = pIo->get_results(pIodata, results);    *oRescount = results.size();        //allocation for oresults whose size > 2    oResults = (float*)malloc(results.size() * sizeof(float));    _CopyVectorIntoDoubleArray(results, oResults);    return Status;}TypeError: byref() 參數(shù)必須是 ctypes 實(shí)例,而不是 '_ctypes.PyCPointerType' 這是我運(yùn)行腳本時(shí)收到的錯(cuò)誤。我對(duì)如何在腳本中發(fā)送 float *oresults 的參數(shù)有點(diǎn)困惑。
查看完整描述

2 回答

?
繁星點(diǎn)點(diǎn)滴滴

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊

在 C++ 代碼中,簽名int getResults(..., float* oResults)無(wú)法將分配的指針傳回調(diào)用者。線(xiàn)路

oResults?=?(float*)malloc(results.size()?*?sizeof(float));

在 getResults 中本地設(shè)置oResults指針,而不影響調(diào)用者。為了輸出指針,您必須使用return它或使用指針到指針參數(shù):int getResults(..., float** oResults)

在Python代碼中,我不熟悉ctypes,但它看起來(lái)float_values = POINTER(c_float)是一個(gè)問(wèn)題。為浮點(diǎn)指針POINTER(c_float)創(chuàng)建 Python類(lèi)型。您想要POINTER(c_float)()創(chuàng)建這樣一個(gè)指針的實(shí)例(最初為空)。

查看完整回答
反對(duì) 回復(fù) 2023-10-26
?
慕婉清6462132

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊

該float* oResults參數(shù)是按值傳遞的,因此不可能返回該參數(shù)中已分配的指針。相反,使用float** oResults.


另外,float_values = POINTER(c_float)是類(lèi)型,而不是類(lèi)型的實(shí)例。所以byref(float_values)相當(dāng)于無(wú)效的 C &(float*)。相反,您需要一個(gè)指針的實(shí)例POINTER(c_float)()(注意括號(hào))并通過(guò)引用傳遞它,類(lèi)似于 C float *p; func(&p)。這會(huì)將指針按地址傳遞給 C 函數(shù),然后函數(shù)可以將其修改為輸出參數(shù)。


這是一個(gè)簡(jiǎn)化的示例,僅關(guān)注int *oRescount和float** oResults參數(shù)。還需要一個(gè)釋放分配的函數(shù):


測(cè)試.cpp


#include <vector>

#define API __declspec(dllexport)


extern "C" {

    API int getResults(size_t *oRescount, float** oResults) {

        std::vector<float> results {1.25,2.5,3.75,5.0}; // Simulated results

        *oRescount = results.size(); // Return size of results

        auto tmp = new float[results.size()]; // allocate

        for(size_t i = 0; i < results.size(); ++i) // copy vector to allocation

            tmp[i] = results[i];

        *oResults = tmp; // return allocation

        return 0;

    }


    API void freeResults(float* oResults) {

        delete [] oResults;

    }

}

test.py


from ctypes import *

dll = CDLL('./test')

dll.getResults.argtypes = POINTER(c_size_t),POINTER(POINTER(c_float))

dll.getResults.restype = c_int


def getresults():

    oRescount = c_size_t()         # instance to hold the returned size

    oResults = POINTER(c_float)()  # instance of a float* to hold the returned allocation.

    err = dll.getResults(byref(oRescount), byref(oResults))


    # oResults is a float* and it is possible to index past the end.

    # Make a copy into a Python list slicing to the correct size,

    # then free it so there is no memory leak.

    results = oResults[:oRescount.value]

    dll.freeResults(oResults)


    return err,results


err,ores = getresults()

print(err,ores)

輸出:


0 [1.25, 2.5, 3.75, 5.0]


查看完整回答
反對(duì) 回復(fù) 2023-10-26
  • 2 回答
  • 0 關(guān)注
  • 178 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)