在python中获取调用dll函数时返回的二维数组

2018.05.31

一种不需要结构体更简单的方法

  • dllmain.c中的函数
DLLIMPORT char *E48s(char *root)
{
    int m,n,i=0;
    char s[13][6];
    for(m=10;m<100;m++)
    {       
        for(n=10;n<100;n++)
        {
            if(fabs(m*1.0/n-(m/10)*1.0/(n%10))<1e-6&&m%10==n/10)
            {
                sprintf(s[i++],"%d/%d\n",m,n);
            }           
        }   
    }
//***
    sprintf(root,"%s",s[0]);
//***
    return root;
}
  • python中的函数
   def E48s(self):
        dll.E48s.arqtypes = c_char_p
        dll.E48s.restype = c_char_p
        pout = c_char_p(b'')
        dll.E48s(pout)
        return pout.value.decode()

2018.05.30

  • 在dll的.h文件中定义结构体:
//在dll的.h文件中定义结构体:
typedef struct _SimpleStruct  
{  
    int num[999];
    char *pstr;
} SimpleStruct, *PSimpleStruct;
  • dllmain.c中的函数
//dllmain.c中的函数
DLLIMPORT char *E48(PSimpleStruct root)
{
    int m,n,i=0;
    //定义二维数组 不能用动态分配存储 具体原因见0x11 
    char s[13][6];
    for(m=10;m<100;m++)
    {       
        for(n=10;n<100;n++)
        {
            if(fabs(m*1.0/n-(m/10)*1.0/(n%10))<1e-6&&m%10==n/10)
            {
                //循环存储多个sprintf打印的字符串 
                sprintf(s[i++],"%d/%d\n",m,n);
            }           
        }   
    }
    //把二维数组的首地址赋给形参中的指针 
    root->pstr = s[0];
    return root->pstr;
}
  • python中的函数
#python中的函数
#此处结构体的定义要与dll中结构体的定义对应
class SimpStruct(Structure):
    _fields_ = [ ("num", c_int*999),
                 ("pstr",c_char_p)]

#...

class fun:
    def E48(self):
        dll.E48.restype = c_char_p
        pout = SimpStruct()
        dll.E48(byref(pout))
        return pout.pstr.decode()

#...

if __name__ == '__main__':
    f = fun()
    root = f.E48()
    print(root)

你可能感兴趣的:(在python中获取调用dll函数时返回的二维数组)