首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C++返回的多维数组在使用ctype时发送垃圾。

从C++返回的多维数组在使用ctype时发送垃圾。
EN

Stack Overflow用户
提问于 2020-11-07 07:43:02
回答 1查看 82关注 0票数 0

我在用Python制作游戏引擎。目前它运行在5-7 FPS,我想增加它。所以我想用C/C++把形状放到框架上。我的帧是三维数组。我想在python和C++之间传输这些数组。但是当使用np.ctypeslib.ndpointer时,数组包含垃圾。

下面是C++文件的代码:

代码语言:javascript
复制
#include <iostream>

using namespace std;

int*** zeros_3d_cpp(int n1, int n2, int n3) {
    int ***arr = new int**[n1];

    for (int i = 0; i < n1; i++) {
        arr[i] = new int*[n2];
        for (int j = 0; j < n2; j++) {
            arr[i][j] = new int[n3];
            for (int k = 0; k < n3; k++) {
                arr[i][j][k] = 0;
            }
        }
    }

    return arr;
}

extern "C" {
    __declspec(dllexport) int*** zeros_3d(int n1, int n2, int n3) { return zeros_3d_cpp(n1, n2, n3); }
}

下面是python代码:

代码语言:javascript
复制
from ctypes import *
import numpy as np

lib = cdll.LoadLibrary('./bin/main.dll')

lib.zeros_3d.argtypes = [c_int, c_int, c_int]
lib.zeros_3d.restype = np.ctypeslib.ndpointer(dtype=c_int, ndim=3, shape=(3, 2, 4))

print(lib.zeros_3d(3, 2, 4))

生成的输出是:

代码语言:javascript
复制
[[[  4490944         0   4491040         0]
  [  4491136         0 387641098 268496650]]

 [[  4490976         0   4491008         0]
  [  4456792         0 387641098 268496650]]

 [[        0         0         0         0]
  [  4456792         0 387641098 268496650]]]

而它应该是,到处都是。

请帮我快点,我想在我的学校开学之前完成这个项目。

EN

回答 1

Stack Overflow用户

发布于 2020-11-07 08:29:11

我不认为这是一个好主意,存储在一个多维数组,如你所说的帧。这样可以更容易地将数据存储在一个线性一维数组中.

代码语言:javascript
复制
int*** zeros_3d_cpp(int n1, int n2, int n3) {
    int ***arr = new int**[n1];

    for (int i = 0; i < n1; i++) {
        arr[i] = new int*[n2];
        for (int j = 0; j < n2; j++) {
            arr[i][j] = new int[n3];
            for (int k = 0; k < n3; k++) {
                arr[i][j][k] = 0;
            }
        }
    }

    return arr;
}

我会将代码分成两部分,首先分配Array,然后填充它。

代码语言:javascript
复制
int* zeros_3d_cpp(int width, int height, int breadth) {
    //Allocating Memory
    int *arr = new int[width*height*breadth];

    for (int i = 0; i < breadth; i++) 
    {
        //Iterates over 2D Image
        for (int j = 0; j < height; j++) 
        {
            //Iterates over a Single Row
            for (int k = 0; k < width; k++) 
            {
                arr[i*width*height + j*width +k] = 0;
            }
        }
    }

    return arr;
}

确保将内存(即返回的数组ptr )绑定到python中的某个对象。

存储器

此外,您正在使用原始指针,使用额外的预防措施来查看谁在管理资源的内存。您可以使用numpy或C++从python端分配内存(在您的情况下是动态数组),并跟踪对象在Python中的生存期,以确保它被正确释放。

您还可以使用numpy在python中创建数组,然后将指针返回到C++,因此C++函数将以起始指针地址作为输入。

代码语言:javascript
复制
void zeros_3d_cpp(int* start_address, int width, int height, int breadth) {
 //Only fill in with zeros
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64725533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档