Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于C+的混淆+;Python扩展。比如得到C++;python值的值 我想把一些python代码转换成C++,但是它并不像简单的C++函数和函数调用那样简单。我不知道如何从Python整数对象中获得C++整数。我有一个整数,它是我想要使用的对象的属性。我还需要使用对象中列表中的整数 我想用这个函数测试C++扩展: def setup_framebuffer(surface,flip=False): #Create texture if not done already if surface.texture is None: create_texture(surface) #Render child to parent if surface.frame_buffer is None: surface.frame_buffer = glGenFramebuffersEXT(1) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, c_uint(int(surface.frame_buffer))) glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0) glPushAttrib(GL_VIEWPORT_BIT) glViewport(0,0,surface._scale[0],surface._scale[1]) glMatrixMode(GL_PROJECTION) glLoadIdentity() #Load the projection matrix if flip: gluOrtho2D(0,surface._scale[0],surface._scale[1],0) else: gluOrtho2D(0,surface._scale[0],0,surface._scale[1]) 这个函数调用CuraTyType纹理,所以我必须把这个函数传递给C++函数,我将用第三个参数来处理它。这就是我到目前为止所掌握的内容,同时尝试了解有关python文档的信息: #include <Python.h> #include <GL/gl.h> static PyMethodDef SpamMethods[] = { ... {"setup_framebuffer", setup_framebuffer, METH_VARARGS,"Loads a texture from a Surface object to the OpenGL framebuffer."}, ... {NULL, NULL, 0, NULL} /* Sentinel */ }; static PyObject * setup_framebuffer(PyObject *self, PyObject *args){ bool flip; PyObject *create_texture, *arg_list,*pyflip,*frame_buffer_id; if (!PyArg_ParseTuple(args, "OOO", &surface,&pyflip,&create_texture)){ return NULL; } if (PyObject_IsTrue(pyflip) == 1){ flip = true; }else{ flip = false; } Py_XINCREF(create_texture); //Create texture if not done already if(texture == NULL){ arglist = Py_BuildValue("(O)", surface) result = PyEval_CallObject(create_texture, arglist); Py_DECREF(arglist); if (result == NULL){ return NULL; } Py_DECREF(result); } Py_XDECREF(create_texture); //Render child to parent frame_buffer_id = PyObject_GetAttr(surface, Py_BuildValue("s","frame_buffer")) if(surface.frame_buffer == NULL){ glGenFramebuffersEXT(1,frame_buffer_id); } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, surface.frame_buffer)); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0); glPushAttrib(GL_VIEWPORT_BIT); glViewport(0,0,surface._scale[0],surface._scale[1]); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //Load the projection matrix if (flip){ gluOrtho2D(0,surface._scale[0],surface._scale[1],0); }else{ gluOrtho2D(0,surface._scale[0],0,surface._scale[1]); } Py_INCREF(Py_None); return Py_None; } PyMODINIT_FUNC initcscalelib(void){ PyObject *module; module = Py_InitModule("cscalelib", Methods); if (m == NULL){ return; } } int main(int argc, char *argv[]){ /* Pass argv[0] to the Python interpreter */ Py_SetProgramName(argv[0]); /* Initialize the Python interpreter. Required. */ Py_Initialize(); /* Add a static module */ initscalelib(); } #包括 #包括 静态PyMethodDef SpamMethods[]={ ... {“setup\u framebuffer”,setup\u framebuffer,METH\u VARARGS,“将纹理从曲面对象加载到OpenGL帧缓冲区。”}, ... {NULL,NULL,0,NULL}/*哨兵*/ }; 静态PyObject*设置\帧缓冲区(PyObject*自身,PyObject*参数){ 布尔翻转; PyObject*创建纹理,*参数列表,*pyflip,*帧缓冲区id; if(!PyArg_parsetup(args,“OOO”、&surface、&pyflip、&create_texture)){ 返回NULL; } if(PyObject_IsTrue(pyflip)==1){ 翻转=真; }否则{ 翻转=错误; } Py_XINCREF(创建纹理); //如果尚未创建纹理,请创建纹理 如果(纹理==NULL){ arglist=Py_BuildValue(“(O)”,表面) 结果=PyEval\u CallObject(创建纹理,arglist); Py_DECREF(arglist); 如果(结果==NULL){ 返回NULL; } Py_DECREF(结果); } Py_XDECREF(创建纹理); //将子对象呈现给父对象 frame\u buffer\u id=PyObject\u GetAttr(surface,Py\u BuildValue(“s”,“frame\u buffer”)) if(surface.frame_buffer==NULL){ glGenFramebuffersEXT(1,帧缓冲区id); } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,surface.frame_buffer)); glFramebufferTexture2DEXT(GL_帧缓冲区_扩展,GL_颜色_附件0_扩展,GL_纹理_2D,surface.TEXTURE,0); glPushAttrib(GLU视口位); GLVIEW(0,0,曲面。_比例[0],曲面。_比例[1]); glMatrixMode(GL_投影); glLoadIdentity();//加载投影矩阵 如果(翻转){ gluOrtho2D(0,表面。_比例[0],表面。_比例[1],0); }否则{ gluOrtho2D(0,表面。_比例[0],0,表面。_比例[1]); } Py_增量(Py_无); 返回Py_None; } PyMODINIT_FUNC initcscalelib(void){ PyObject*模块; module=Py_InitModule(“cscalelib”,方法); 如果(m==NULL){ 返回; } } int main(int argc,char*argv[]){ /*将argv[0]传递给Python解释器*/ Py_SetProgramName(argv[0]); /*初始化Python解释器。必需*/ Py_初始化(); /*添加一个静态模块*/ initscalelib(); }_C++_Python_Api_Module - Fatal编程技术网

关于C+的混淆+;Python扩展。比如得到C++;python值的值 我想把一些python代码转换成C++,但是它并不像简单的C++函数和函数调用那样简单。我不知道如何从Python整数对象中获得C++整数。我有一个整数,它是我想要使用的对象的属性。我还需要使用对象中列表中的整数 我想用这个函数测试C++扩展: def setup_framebuffer(surface,flip=False): #Create texture if not done already if surface.texture is None: create_texture(surface) #Render child to parent if surface.frame_buffer is None: surface.frame_buffer = glGenFramebuffersEXT(1) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, c_uint(int(surface.frame_buffer))) glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0) glPushAttrib(GL_VIEWPORT_BIT) glViewport(0,0,surface._scale[0],surface._scale[1]) glMatrixMode(GL_PROJECTION) glLoadIdentity() #Load the projection matrix if flip: gluOrtho2D(0,surface._scale[0],surface._scale[1],0) else: gluOrtho2D(0,surface._scale[0],0,surface._scale[1]) 这个函数调用CuraTyType纹理,所以我必须把这个函数传递给C++函数,我将用第三个参数来处理它。这就是我到目前为止所掌握的内容,同时尝试了解有关python文档的信息: #include <Python.h> #include <GL/gl.h> static PyMethodDef SpamMethods[] = { ... {"setup_framebuffer", setup_framebuffer, METH_VARARGS,"Loads a texture from a Surface object to the OpenGL framebuffer."}, ... {NULL, NULL, 0, NULL} /* Sentinel */ }; static PyObject * setup_framebuffer(PyObject *self, PyObject *args){ bool flip; PyObject *create_texture, *arg_list,*pyflip,*frame_buffer_id; if (!PyArg_ParseTuple(args, "OOO", &surface,&pyflip,&create_texture)){ return NULL; } if (PyObject_IsTrue(pyflip) == 1){ flip = true; }else{ flip = false; } Py_XINCREF(create_texture); //Create texture if not done already if(texture == NULL){ arglist = Py_BuildValue("(O)", surface) result = PyEval_CallObject(create_texture, arglist); Py_DECREF(arglist); if (result == NULL){ return NULL; } Py_DECREF(result); } Py_XDECREF(create_texture); //Render child to parent frame_buffer_id = PyObject_GetAttr(surface, Py_BuildValue("s","frame_buffer")) if(surface.frame_buffer == NULL){ glGenFramebuffersEXT(1,frame_buffer_id); } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, surface.frame_buffer)); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0); glPushAttrib(GL_VIEWPORT_BIT); glViewport(0,0,surface._scale[0],surface._scale[1]); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //Load the projection matrix if (flip){ gluOrtho2D(0,surface._scale[0],surface._scale[1],0); }else{ gluOrtho2D(0,surface._scale[0],0,surface._scale[1]); } Py_INCREF(Py_None); return Py_None; } PyMODINIT_FUNC initcscalelib(void){ PyObject *module; module = Py_InitModule("cscalelib", Methods); if (m == NULL){ return; } } int main(int argc, char *argv[]){ /* Pass argv[0] to the Python interpreter */ Py_SetProgramName(argv[0]); /* Initialize the Python interpreter. Required. */ Py_Initialize(); /* Add a static module */ initscalelib(); } #包括 #包括 静态PyMethodDef SpamMethods[]={ ... {“setup\u framebuffer”,setup\u framebuffer,METH\u VARARGS,“将纹理从曲面对象加载到OpenGL帧缓冲区。”}, ... {NULL,NULL,0,NULL}/*哨兵*/ }; 静态PyObject*设置\帧缓冲区(PyObject*自身,PyObject*参数){ 布尔翻转; PyObject*创建纹理,*参数列表,*pyflip,*帧缓冲区id; if(!PyArg_parsetup(args,“OOO”、&surface、&pyflip、&create_texture)){ 返回NULL; } if(PyObject_IsTrue(pyflip)==1){ 翻转=真; }否则{ 翻转=错误; } Py_XINCREF(创建纹理); //如果尚未创建纹理,请创建纹理 如果(纹理==NULL){ arglist=Py_BuildValue(“(O)”,表面) 结果=PyEval\u CallObject(创建纹理,arglist); Py_DECREF(arglist); 如果(结果==NULL){ 返回NULL; } Py_DECREF(结果); } Py_XDECREF(创建纹理); //将子对象呈现给父对象 frame\u buffer\u id=PyObject\u GetAttr(surface,Py\u BuildValue(“s”,“frame\u buffer”)) if(surface.frame_buffer==NULL){ glGenFramebuffersEXT(1,帧缓冲区id); } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,surface.frame_buffer)); glFramebufferTexture2DEXT(GL_帧缓冲区_扩展,GL_颜色_附件0_扩展,GL_纹理_2D,surface.TEXTURE,0); glPushAttrib(GLU视口位); GLVIEW(0,0,曲面。_比例[0],曲面。_比例[1]); glMatrixMode(GL_投影); glLoadIdentity();//加载投影矩阵 如果(翻转){ gluOrtho2D(0,表面。_比例[0],表面。_比例[1],0); }否则{ gluOrtho2D(0,表面。_比例[0],0,表面。_比例[1]); } Py_增量(Py_无); 返回Py_None; } PyMODINIT_FUNC initcscalelib(void){ PyObject*模块; module=Py_InitModule(“cscalelib”,方法); 如果(m==NULL){ 返回; } } int main(int argc,char*argv[]){ /*将argv[0]传递给Python解释器*/ Py_SetProgramName(argv[0]); /*初始化Python解释器。必需*/ Py_初始化(); /*添加一个静态模块*/ initscalelib(); }

关于C+的混淆+;Python扩展。比如得到C++;python值的值 我想把一些python代码转换成C++,但是它并不像简单的C++函数和函数调用那样简单。我不知道如何从Python整数对象中获得C++整数。我有一个整数,它是我想要使用的对象的属性。我还需要使用对象中列表中的整数 我想用这个函数测试C++扩展: def setup_framebuffer(surface,flip=False): #Create texture if not done already if surface.texture is None: create_texture(surface) #Render child to parent if surface.frame_buffer is None: surface.frame_buffer = glGenFramebuffersEXT(1) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, c_uint(int(surface.frame_buffer))) glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0) glPushAttrib(GL_VIEWPORT_BIT) glViewport(0,0,surface._scale[0],surface._scale[1]) glMatrixMode(GL_PROJECTION) glLoadIdentity() #Load the projection matrix if flip: gluOrtho2D(0,surface._scale[0],surface._scale[1],0) else: gluOrtho2D(0,surface._scale[0],0,surface._scale[1]) 这个函数调用CuraTyType纹理,所以我必须把这个函数传递给C++函数,我将用第三个参数来处理它。这就是我到目前为止所掌握的内容,同时尝试了解有关python文档的信息: #include <Python.h> #include <GL/gl.h> static PyMethodDef SpamMethods[] = { ... {"setup_framebuffer", setup_framebuffer, METH_VARARGS,"Loads a texture from a Surface object to the OpenGL framebuffer."}, ... {NULL, NULL, 0, NULL} /* Sentinel */ }; static PyObject * setup_framebuffer(PyObject *self, PyObject *args){ bool flip; PyObject *create_texture, *arg_list,*pyflip,*frame_buffer_id; if (!PyArg_ParseTuple(args, "OOO", &surface,&pyflip,&create_texture)){ return NULL; } if (PyObject_IsTrue(pyflip) == 1){ flip = true; }else{ flip = false; } Py_XINCREF(create_texture); //Create texture if not done already if(texture == NULL){ arglist = Py_BuildValue("(O)", surface) result = PyEval_CallObject(create_texture, arglist); Py_DECREF(arglist); if (result == NULL){ return NULL; } Py_DECREF(result); } Py_XDECREF(create_texture); //Render child to parent frame_buffer_id = PyObject_GetAttr(surface, Py_BuildValue("s","frame_buffer")) if(surface.frame_buffer == NULL){ glGenFramebuffersEXT(1,frame_buffer_id); } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, surface.frame_buffer)); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0); glPushAttrib(GL_VIEWPORT_BIT); glViewport(0,0,surface._scale[0],surface._scale[1]); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //Load the projection matrix if (flip){ gluOrtho2D(0,surface._scale[0],surface._scale[1],0); }else{ gluOrtho2D(0,surface._scale[0],0,surface._scale[1]); } Py_INCREF(Py_None); return Py_None; } PyMODINIT_FUNC initcscalelib(void){ PyObject *module; module = Py_InitModule("cscalelib", Methods); if (m == NULL){ return; } } int main(int argc, char *argv[]){ /* Pass argv[0] to the Python interpreter */ Py_SetProgramName(argv[0]); /* Initialize the Python interpreter. Required. */ Py_Initialize(); /* Add a static module */ initscalelib(); } #包括 #包括 静态PyMethodDef SpamMethods[]={ ... {“setup\u framebuffer”,setup\u framebuffer,METH\u VARARGS,“将纹理从曲面对象加载到OpenGL帧缓冲区。”}, ... {NULL,NULL,0,NULL}/*哨兵*/ }; 静态PyObject*设置\帧缓冲区(PyObject*自身,PyObject*参数){ 布尔翻转; PyObject*创建纹理,*参数列表,*pyflip,*帧缓冲区id; if(!PyArg_parsetup(args,“OOO”、&surface、&pyflip、&create_texture)){ 返回NULL; } if(PyObject_IsTrue(pyflip)==1){ 翻转=真; }否则{ 翻转=错误; } Py_XINCREF(创建纹理); //如果尚未创建纹理,请创建纹理 如果(纹理==NULL){ arglist=Py_BuildValue(“(O)”,表面) 结果=PyEval\u CallObject(创建纹理,arglist); Py_DECREF(arglist); 如果(结果==NULL){ 返回NULL; } Py_DECREF(结果); } Py_XDECREF(创建纹理); //将子对象呈现给父对象 frame\u buffer\u id=PyObject\u GetAttr(surface,Py\u BuildValue(“s”,“frame\u buffer”)) if(surface.frame_buffer==NULL){ glGenFramebuffersEXT(1,帧缓冲区id); } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,surface.frame_buffer)); glFramebufferTexture2DEXT(GL_帧缓冲区_扩展,GL_颜色_附件0_扩展,GL_纹理_2D,surface.TEXTURE,0); glPushAttrib(GLU视口位); GLVIEW(0,0,曲面。_比例[0],曲面。_比例[1]); glMatrixMode(GL_投影); glLoadIdentity();//加载投影矩阵 如果(翻转){ gluOrtho2D(0,表面。_比例[0],表面。_比例[1],0); }否则{ gluOrtho2D(0,表面。_比例[0],0,表面。_比例[1]); } Py_增量(Py_无); 返回Py_None; } PyMODINIT_FUNC initcscalelib(void){ PyObject*模块; module=Py_InitModule(“cscalelib”,方法); 如果(m==NULL){ 返回; } } int main(int argc,char*argv[]){ /*将argv[0]传递给Python解释器*/ Py_SetProgramName(argv[0]); /*初始化Python解释器。必需*/ Py_初始化(); /*添加一个静态模块*/ initscalelib(); },c++,python,api,module,C++,Python,Api,Module,从Python整数中获取Cint的方法是使用PyInt\u AsLong()和向下转换(尽管您可能希望使用C long来代替)。相反,您可以调用PyInt\u FromLong()。我不清楚您希望在代码中的什么位置执行此操作,尽管我对您的代码有一些其他注释: 从概念上讲,PyObject\u IsTrue()返回一个布尔值。不要将其与1进行比较,仅将其用作布尔值。但是,您应该检查它是否返回了一个错误,即-1。(通常的检查是

从Python整数中获取C
int
的方法是使用
PyInt\u AsLong()
和向下转换(尽管您可能希望使用C long来代替)。相反,您可以调用
PyInt\u FromLong()
。我不清楚您希望在代码中的什么位置执行此操作,尽管我对您的代码有一些其他注释:

  • 从概念上讲,
    PyObject\u IsTrue()
    返回一个布尔值。不要将其与1进行比较,仅将其用作布尔值。但是,您应该检查它是否返回了一个错误,即-1。(通常的检查是
    <0
    )如果不检查错误返回,则最终会吞下异常,但保留异常对象。这很糟糕

  • 创建纹理的
    Py\u XINCREF()
    不是必需的。您借用了对
    args
    元组的引用,而元组又拥有对
    create\u texture
    对象的引用。在函数返回之前,
    create\u texture
    无法消失。如果要使其保持比此函数调用更长的时间,则只需增加它。如果必须增加它,则不需要使用
    Py\u XINCREF()
    ,因为它永远不会为空。如果您确实需要增加它,那么您还需要记住在错误返回案例中减少它

  • 不要创建参数元组来调用
    PyEval\u CallObject()
    ,只需调用
    PyObject\u CallFunctionObjectArgs(create\u texture,arglist,NULL)
    PyObject\u CallFunction(create\u texture,“O”,arglist)

  • Py\u BuildValue(“s”,“frame\u buffer”)
    并不是为
    “frame\u buffer”
    获取Python字符串的正确方法。更好的方法是
    PyString\u FromString()
    。但是,这两种方法都会返回新的引用,并且
    PyObject\u GetAttr()
    不会吃掉对属性名称的引用,因此最终会泄漏该引用。您不应该使用这些属性,而应该使用
    PyObject\u GetAttrString()
    ,它将属性名称作为
    const char*

  • 记住检查所有可能返回错误值的函数的返回值(这几乎是所有Python API函数)。除了
    PyTrue\u IsTrue()
    之外,对于
    Py\u BuildValue()
    PyObject\u GetAttr()
    您也忘记了这一点


    • 我可以在此提出一个真诚的建议吗?在尝试类似这样的新东西时,不要向自己扔上一百行代码,首先尝试最简单的测试用例。尝试获得一个C++扩展,它只会传递值123。(选择0或1可能会意外工作,因此我选择了一个易于识别的值,但不太可能是意外值。)然后获取扩展名,将传入的数字加倍,然后添加两个数字,以此类推


      偷看这个问题!:-)

      我的想法是尽可能多地学习,这样我就可以在不需要分小阶段学习的情况下转换所需的代码。也许你是对的。谢谢你的回答,谢谢。这是非常有用的。我已经设法把它弄坏了