- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
故事:我正在使用 ctypes从 python 到 C 进行通信,反之亦然。我也在制作我也试图连接的 C 共享库。在这个开发步骤中,它只是一个简单的库,用于在深入编写代码之前测试所有概念。它是用 C++ 编写的库,使用 extern "C"公开函数,没什么特别的。我测试了具有原始参数/返回类型、指针和函数回调的函数。
现在我想传递结构。由于我是一个懒惰的程序员,我打算将 C++ 结构传递给统一的 C 表示(即简单字典和列表的组合)并将其处理给 python,后者会将其转换为真正的 python 对象(即一个字典和列表的 python 组合)。
问题:为了实现这一点,我首先在 C++ 中定义了一个模板化字典,它的实现只是为了测试,一个键值对的链表,字典拥有根。然后,对于每个需要特化的函数,该特化的 typedef 用作 C 结构。
代码看起来像这样(不是实际代码):
#include <cstdlib>
template <typename key_t, typename value_t>
struct DictNode
{
key_t key;
value_t value;
};
template <typename key_t, typename value_t>
struct Dict
{
typedef DictNode<key_t, value_t> node_t;
node_t root;
};
typedef Dict<int, char> Dict_int_char;
extern "C" Dict_int_char* example_new()
{
Dict_int_char* result;
result = (Dict_int_char*)malloc(sizeof(Dict_int_char));
return result;
}
extern "C" void example_delete(Dict_int_char* value)
{
free(value);
}
现在,在 python 中,为了避免为每个专业创建一个类,我采用了相同的方法。一个方法将为我创建给定键值类型的专用类。
代码看起来像这样(实际代码):
import types
import ctypes
# This is to provide some hiding of the module internals
# Suggestions on a more pythonic way are gladly accepted
class __Internals:
"""
Creates class to interface with a C structure comming from a
typedef'd C++ class template specialization. This method recieves
the types of the template class, creates the ctypes classes to
interface with the specialized class (which has been typedef'd)
and returns them for usage with ctypes.
"""
@staticmethod
def __DictClassCreate__(key_t, value_t):
# Foward declare the classes
class InterfaceListNode(ctypes.Structure):
pass;
class InterfaceList(ctypes.Structure):
pass;
#### NODE
# Node class
nodeType = InterfaceListNode;
# The pointer-to-node class
nodeTypePointerType = ctypes.POINTER(nodeType);
# Fields of the node class (next, key, value)
nodeType._fields_ = [("next", nodeTypePointerType),
("key", key_t),
("value", value_t) ];
# Function to create a node pointer
def nodeTypePointerCreate(cls, value=None):
if(value is None):
return nodeTypePointerType();
else:
return nodeTypePointerType(value);
# Bind the function to the node class
nodeType.pointer = types.MethodType(nodeTypePointerCreate, nodeType);
#### DICT
# Dict class
dictType = InterfaceList;
# The pointer-to-dict class
dictTypePointerType = ctypes.POINTER(dictType);
# Useful for dict to know the types of it's nodes
dictType._nodeType = nodeType;
# Fields of the dict class (root)
dictType._fields_ = [("root", ctypes.POINTER(nodeType))];
# Function to create a dict pointer
def dictTypePointerCreate(cls, value=None):
if(value is None):
return dictTypePointerType();
else:
return dictTypePointerType(value);
# Bind the function to the dict class
dictType.pointer = types.MethodType(dictTypePointerCreate, dictType);
# For debugging
print 'Inside metaclass generator'
print hex(id(nodeType));
print hex(id(dictType));
# Return just the dict class since it knows about it's node class.
return dictType;
# Create a new specialized dict<c_uint, c_char>
dictType_1 = __Internals.__DictClassCreate__(ctypes.c_uint, ctypes.c_char);
# Obtain the node type of this dict
nodeType_1 = dictType_1._nodeType;
# For debugging
print 'In Script'
print hex(id(nodeType_1));
print hex(id(dictType_1));
# Try to instance this dictionary with 1 element
#(not NULL root, NULL root.next)
dict_1 = dictType_1(nodeType_1(nodeType_1.pointer(), 0, 'a'));
运行此代码时,将显示以下输出:
python SciCamAPI.py
Inside metaclass generator
0x249c1d8L
0x249c588L
In Script
0x249c1d8L
0x249c588L
Traceback (most recent call last):
File "SciCamAPI.py", line 107, in <module>
dict_1 = dictType_1(nodeType_1(nodeType_1.pointer(), 0, 'a'));
TypeError: incompatible types, InterfaceListNode instance instead of LP_InterfaceListNode instance
从打印的输出中我可以看到我正在使用相同的元类来实例化简单字典及其节点,作为方法中生成的节点。
我用谷歌搜索了错误中附加的 LP_ 是什么,但是搜索 LP_ python 只返回线性问题求解器和 this answer .从对答案的理解来看,ctypes 正在从 nodeType_1.pointer() (最后一行)创建一个 C 风格的指针,但这就是当 node.next 被声明为 [("next", nodeTypePointerType) 时应该收到的内容,...](在 nodeType.fields=...)。所以我很迷茫。
最佳答案
引用eryksun的评论:
dictType_1.root
is anLP_InterfaceListNode
field, i.e.POINTER(InterfaceListNode)
, but you're initializing it with anInterfaceListNode
instead of a pointer to one. "LP" is for "long pointer" from back in the day of segmented architectures that had near (within segment) and far/long pointers. Windows types retain this prefix even though it's no longer meaningful, such asLPVOID
andLPWSTR
. ctypes was initially a Windows-only package
所以我错过了将 dictType_1.root
转换为指针。将最后一行更改为:
rootNode = nodeType_1(nodeType_1.pointer(), 0, 'a');
dict_1 = dictType_1(nodeType_1.pointer(rootNode));
解决问题。
关于python - ctypes 和构建元类 : TypeError: *class* instance instead of LP_*class* instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592318/
我正在使用 React Native 构建移动应用程序。我面临 Nativ Base Toast 问题。当我第一次加载应用程序然后导航到工单状态时,如果我返回带有 android 后退按钮的主页,则会
我正在尝试创建一个“完美的滚动条”,它是这样的:。Https://github.com/noraesae/perfect-scrollbar-bower。使用尽可能简单的代码:。我犯了以下错误:。当然
我正在尝试在简单的 Draftjs 编辑器上应用自定义装饰器: import React from 'react'; import {Editor, EditorState, RichUtils} f
读取以钟形字符作为分隔符的CSV文件时,出现类型错误。我不想使用熊猫,我需要使用CSV库来解决这个问题。。示例标题:。数据类型。样本数据:。示例代码。我明白这个错误-。铃声字符参考-https://w
我正在处理 useSelector的 react-redux在我的 React Native 应用程序中,我收到以下错误: TypeError: TypeError: (0, _reactRedux.
当我用 Node 运行以下代码时: var command = "/home/myScript.sh"; fs.exists(command, function(exists){ if(exi
我正在为我的一个组件编写测试用例,该组件具有路由器(使用 withrouter)。我收到错误 wrapper.find is not a function。基本要求是需要检查我的渲染中是否存在标签,还
我一直在研究一个简单的表单提交。首先,我想在提交表单之前创建一个模式警报。于是,我使用了bootstrap的modal函数,反复得到 TypeError: $(...).modal is not a
这个问题在这里已经有了答案: Flask-Login raises TypeError: 'bool' object is not callable when trying to override
这是我在leetcode中遇到的问题。您将看到两个非空链接表,表示两个非负整数。数字以相反的顺序存储,并且它们的每个节点都包含一个数字。将这两个数字相加,然后以链表的形式返回总和。。你可以假设这两个数
我正在尝试学习Python,并试图将GitHub问题变成一种可读的形式。根据关于如何将JSON转换为CSV的建议,我得出了以下结论:。其中“Issues.json”是包含GitHub问题的JSON文件
我在使用 Proxy 类时遇到了这个有趣的错误: TypeError: 'set' on proxy: trap returned truish for property 'users' which
在研究Jupyter笔记本电脑时,我遇到了这个问题:。这是代码开始的地方:。下面的代码是在jupyter笔记本的另一个单元上运行的。我怎么才能解决它呢?。尝试更改参数和一系列其他内容,但所有这些都弹出
Working on jupyter notebooks, I came across this problem:在研究Jupyter笔记本电脑时,我遇到了这个问题: TypeError:un
我对此很陌生(对于 Jasmine 测试、ExtJs 和 JS 来说确实很陌生),我必须修复这个错误/错误。我正在运行一些单元测试,但不断收到以下错误: TypeError: object is no
在下面的文档中,我们可以不使用JupyterDash在笔记本中运行应用程序,而只需运行app.run(jupyter_mode=“外部”)。。Https://dash.plotly.com/dash-
导入地理位置时: import { Geolocation } from '@ionic-native/geolocation/ngx'; 获取错误: ionic Geolocation :Ionic
我定义了以下函数: def eigval(matrix): a = matrix[0, 0] b = matrix[0, 1] c = matrix[1, 0] d =
刚刚获得了SDXL模型的访问权限,希望为即将发布的版本进行测试...不幸的是,我们当前用于我们服务的代码似乎不能与稳定ai/稳定-扩散-xl-base-0.9一起工作,我不完全确定SDXL有什么不同,
这是我的全部代码。我试图通过/insta/:id在我的page.ejs页面上查找,但它显示错误:。无法读取未定义的属性(正在读取‘UserName’)。。我希望获得uuidv4()将提供的id,但它返
我是一名优秀的程序员,十分优秀!