C++ python 扩展数组大小问题 (C2133)

Posted

技术标签:

【中文标题】C++ python 扩展数组大小问题 (C2133)【英文标题】:C++ python extension array size issue (C2133) 【发布时间】:2012-05-19 21:15:07 【问题描述】:

我正在创建一个将游戏 api 暴露给嵌入式 python 解释器的游戏扩展,我在 PyMethodDef 中收到 C2133 数组未知大小错误:

static PyMethodDef pyTTPlayerMethods[] = 
"Get_Player_Name", pyTTGet_Player_Name, METH_VARARGS, "Returns the nickname of a client.",
"Get_Player_Type", pyTTGet_Player_Type, METH_VARARGS, "TODO: Returns the player type of a client.",
"Get_Bandwidth", pyTTGet_Bandwidth, METH_VARARGS, "Returns a player's bandwidth.",
"Get_Ping", pyTTGet_Ping, METH_VARARGS, "Returns the ping of a client.",
"Get_Kbits", pyTTGet_Kbits, METH_VARARGS, "Return kbits of a client.",
"Get_Ip", pyTTGet_Ip_Address, METH_VARARGS, "Returns the IP of a client.",
"Get_Port", pyTTGet_Ip_Port, METH_VARARGS, "Returns the port of a client.",
"Get_Team", pyTTGet_Team, METH_VARARGS, "Returns the team ID of a client.",
"Get_Translated_Team", pyTTGet_Translated_Team, METH_VARARGS, "Returns the team name of a client (GDI, NOD).",
"Change_Team", pyTTChange_Player_Team, METH_VARARGS, "Changes the team of a client.",
"Change_Team2", pyTTChange_Player_Team2, METH_VARARGS, "Changes the team of a client without killing respawning the player.",
"Get_Kills", pyTTGet_Kills, METH_VARARGS, "Returns the kill count of a client.",
"Get_Deaths", pyTTGet_Deaths, METH_VARARGS, "Returns the death count of a client.",
"Get_KD", pyTTGet_KillDeath_Ratio, METH_VARARGS, "Returns the KD ratio of a client.",
"Get_Rank", pyTTGet_Rank, METH_VARARGS, "Returns the rank of a client.",
"Set_Rung", pyTTSet_Rung, METH_VARARGS, "Sets the rung of a client.",
"Set_Ladder_Points", pyTTSet_Ladder_Points, METH_VARARGS, "Returns the rank of a client.",
"Get_Score", pyTTGet_Score, METH_VARARGS, "Returns the score of a client.",
"Set_Score", pyTTSet_Score, METH_VARARGS, "Sets the score of a client.",
"Get_Money", pyTTGet_Money, METH_VARARGS, "Returns the amount of money a client has.",
"Set_Money", pyTTSet_Money, METH_VARARGS, "Sets the amount of money a client has.",
"Refill", pyTTGrant_Refill, METH_VARARGS, "Replenishes a client's health and ammo.",
"Change_Character", pyTTChange_Character, METH_VARARGS, "Changes a client's character.",
"Toggle_Fly_Mode", pyTTToggle_Fly_Mode, METH_VARARGS, "Toggles a client's flying mode.",
"Is_Stealth", pyTTIs_Stealth, METH_VARARGS, "Returns a client's stealth status.",
NULL, NULL, 0, NULL
;

编译插件时,我得到这个结果:

1>------ Build started: Project: PythonTT, Configuration: Release SSGM Win32 ------
1>  pyGame.cpp
1>  pyPlayer.cpp
1>  PythonTT.cpp
1>pyGame.cpp(10): error C2248: 'cGameData::MapName' : cannot access protected member declared in class 'cGameData'
1>          g:\c++\ssgm 4.0\scripts\GameData.h(104) : see declaration of 'cGameData::MapName'
1>          g:\c++\ssgm 4.0\scripts\GameData.h(76) : see declaration of 'cGameData'
1>pyGame.cpp(15): error C2039: 'MapNum' : is not a member of 'cGameData'
1>          g:\c++\ssgm 4.0\scripts\GameData.h(76) : see declaration of 'cGameData'
1>g:\c++\ssgm 4.0\pythontt\pyPlayer.h(46): error C2133: 'pyTTPlayerMethods' : unknown size
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

第一个错误是因为我在 PyObject 中选择了错误的调用,但我不知道如何更正最后一个错误(C2133);有什么建议吗?

【问题讨论】:

减少数组并尝试找到一个最小的例子来说明问题。很可能在文本墙上只有一个逗号或不应该的东西。代码通常应该是正确的。 代码对我来说也不错。摆脱其他编译器错误 - 可能是其中一个扰乱了编译器并导致了 C2133。 @Voo , Nick 我错误地将列表声明为头文件中的其他内容,不过感谢您的帮助 【参考方案1】:

您可以尝试使用选项 /Ze 进行编译,将一个未调整大小的数组声明为成员。 http://msdn.microsoft.com/en-us/library/0k0w269d%28v=vs.71%29

【讨论】:

以上是关于C++ python 扩展数组大小问题 (C2133)的主要内容,如果未能解决你的问题,请参考以下文章

为啥必须动态分配扩展数组才能使此函数正常工作 C++

将 C++ 数组发送到 Python 并返回(使用 Numpy 扩展 C++)

C++ 对 Python 的扩展——安全的内存访问和内存布局

扩展 Python:处理 numpy 数组

在opencv(C++)中从caffe读取多维数组

C++ 如何创建一个需要输入大小的数组