首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型字符串指针类型错误

类型字符串指针类型错误
EN

Stack Overflow用户
提问于 2018-03-08 19:34:06
回答 1查看 703关注 0票数 1

下面是一个用于调用DLL的ctype包装器。它将一个简单的文本文件读取为一个字节数组(utf-8编码),创建一个长度相同的字符串缓冲区,并将两者传递给DLL。通过下面的代码,我得到了错误:预期的LP_c_char_p实例,而不是c_char_Array_8049。

我也尝试过将这两个数组作为ctypes.c_byte传递,但这也不起作用。

代码语言:javascript
复制
file_name = r"C:\Projects\--Data_Files\Strings\Sample_Text.txt"
f = io.open(file_name, mode="r", encoding="utf-8")
CA_my_str = f.read()    

CA_no_punct = ctypes.create_string_buffer(len(CA_my_str))

Input_Length_Array = []
Input_Length_Array.append(len(CA_no_punct))
Input_Length_Array.append(len(CA_my_str))

length_array_out = (ctypes.c_double * len(Input_Length_Array))(*Input_Length_Array)

hDLL = ctypes.WinDLL("C:/NASM_Test_Projects/String_Processing/String_Processing.dll")
CallName = hDLL.Main_Entry_fn
CallName.argtypes = [ctypes.POINTER(ctypes.c_char_p),ctypes.POINTER(ctypes.c_char_p), ctypes.POINTER(ctypes.c_double)]
CallName.restype = ctypes.POINTER(ctypes.c_double)

ret_ptr = CallName(CA_no_punct, CA_my_str, length_array_out)

所以问题是:对于CA_my_str和CA_no_punct这两个数组,正确的ctypes类型是什么?

编辑:下面的每个请求都是NASM的入口点:

代码语言:javascript
复制
Main_Entry_fn:
push rdi
push rbp
mov [no_punct_ptr],rcx
mov [my_str_ptr],rdx
mov [data_master_ptr],r8
; Now assign lengths
lea rdi,[data_master_ptr]
mov rbp,[rdi]
xor rcx,rcx
movsd xmm0,qword[rbp+rcx]
cvttsd2si rax,xmm0
mov [no_punct_length],rax
add rcx,8
movsd xmm0,qword[rbp+rcx]
cvttsd2si rax,xmm0
mov [my_str_length],rax
add rcx,8
call String_Processing_fn
exit_label_for_Main_Entry_fn:
pop rbp
pop rdi
ret
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-09 17:03:53

对于两个数组参数,c_char_p都是正确的,并且等价于C的char*

代码语言:javascript
复制
CallName.argtypes = [ctypes.c_char_p,ctypes.c_char_p,ctypes.POINTER(ctypes.c_double)]

使用CA_no_punct.raw查看输出缓冲区的全部内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49181097

复制
相关文章

相似问题

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