首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归ctype结构添加

递归ctype结构添加
EN

Stack Overflow用户
提问于 2020-11-03 05:58:31
回答 1查看 30关注 0票数 0
代码语言:javascript
复制
class flistStruct(ctypes.Structure): 
    """This is repos struct which is used in c code"""
    pass
flistStruct._fields_ = [('fname', ctypes.c_char * 257),
            ('ftime', ctypes.c_char * 257),
            ('fsize', ctypes.c_double),
            ('next1',ctypes.POINTER(flistStruct))]
repolistfun.DirRepository.argtypes = [ctypes.c_char_p,ctypes.POINTER(flistStruct)]
        repolistfun.DirRepository.restype = ctypes.c_int

def func():
    mylist = flistStruct()
    ret2 = repolistfun.DirRepository(bytes(arg1, encoding='utf8'),ctypes.byref(mylist))
    while mylist != None:
        result += "fname:"+str(mylist.fname)
        result += "ftime:"+str(mylist.ftime)
        result += "fsize:"+str(mylist.fsize)
        mylist = mylist.next1

对于while循环的第一次迭代,我得到fname、ftime、fsize的值。但是对于第二次迭代,我得到了下面的错误。错误。'LP_flistStruct‘对象没有属性'fname’

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-03 06:21:42

C中没有递归结构,作为成员,您得到的是指向结构指针。只需使用

代码语言:javascript
复制
mylist = mylist.next1.contents

但是,请注意您的mylist != None是假的。任何类型的类型都不等于None

相反,您需要将您的循环重构为

代码语言:javascript
复制
while True:
    result += "fname:"+str(mylist.fname)
    result += "ftime:"+str(mylist.ftime)
    result += "fsize:"+str(mylist.fsize)
    if not mylist.next1:
        break

    mylist = mylist.next1.contents

最后,一些文体建议:您的变量命名是关闭的- mylist不是一个列表,而是列表中的一个节点/元素。"fsize:"+str(mylist.fsize)似乎很想写,怎么样?

代码语言:javascript
复制
results = []

    ...
    results.append(f"fname:{node.fname} ftime:{node.ftime} fsize:{node.size}")

result = " ".join(results)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64657497

复制
相关文章

相似问题

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