Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用共享C++;功能 我对C++是新的,所以对任何愚蠢的错误都要道歉。 我在C++中创建了一个共享对象,用于Python中。但是,当我尝试在Python中调用此函数时,内核崩溃 C++文件如下: #include <cmath> #include <iostream> #include <list> #include <vector> using namespace std; extern "C" { vector<int> cplusplus(int n=3,int maximum=1000) { int i,j,order,m,i1,i2,mag; vector<int> output(0); i=1; j=0; while (i/maximum<=1) { i=10*i; j=j+1; } m=j-1; for (i1=1; i1<m+2; i1++) { mag=pow(10,(i1-1)); i=0; while (i+mag*(n+1)<=maximum) { for (i2=i+mag*n; i2<i+mag*(n+1); i2++) { output.push_back(i2-1); } i=i+10*mag; } if(i+mag*(n+1)>maximum) { for (i2=i+mag*n; i2<maximum+1; i2++) { output.push_back(i2-1); } } } return output; } } 和我在Python中调用C++函数:使用< /P> import ctypes cpp=ctypes.cdll.LoadLibrary('/Users/.../cplusplus.so') print cpp.cplusplus(n=3,maximum=1000)_Python_C++_Ctypes - Fatal编程技术网 import ctypes cpp=ctypes.cdll.LoadLibrary('/Users/.../cplusplus.so') print cpp.cplusplus(n=3,maximum=1000),python,c++,ctypes,Python,C++,Ctypes" /> import ctypes cpp=ctypes.cdll.LoadLibrary('/Users/.../cplusplus.so') print cpp.cplusplus(n=3,maximum=1000),python,c++,ctypes,Python,C++,Ctypes" />

调用共享C++;功能 我对C++是新的,所以对任何愚蠢的错误都要道歉。 我在C++中创建了一个共享对象,用于Python中。但是,当我尝试在Python中调用此函数时,内核崩溃 C++文件如下: #include <cmath> #include <iostream> #include <list> #include <vector> using namespace std; extern "C" { vector<int> cplusplus(int n=3,int maximum=1000) { int i,j,order,m,i1,i2,mag; vector<int> output(0); i=1; j=0; while (i/maximum<=1) { i=10*i; j=j+1; } m=j-1; for (i1=1; i1<m+2; i1++) { mag=pow(10,(i1-1)); i=0; while (i+mag*(n+1)<=maximum) { for (i2=i+mag*n; i2<i+mag*(n+1); i2++) { output.push_back(i2-1); } i=i+10*mag; } if(i+mag*(n+1)>maximum) { for (i2=i+mag*n; i2<maximum+1; i2++) { output.push_back(i2-1); } } } return output; } } 和我在Python中调用C++函数:使用< /P> import ctypes cpp=ctypes.cdll.LoadLibrary('/Users/.../cplusplus.so') print cpp.cplusplus(n=3,maximum=1000)

调用共享C++;功能 我对C++是新的,所以对任何愚蠢的错误都要道歉。 我在C++中创建了一个共享对象,用于Python中。但是,当我尝试在Python中调用此函数时,内核崩溃 C++文件如下: #include <cmath> #include <iostream> #include <list> #include <vector> using namespace std; extern "C" { vector<int> cplusplus(int n=3,int maximum=1000) { int i,j,order,m,i1,i2,mag; vector<int> output(0); i=1; j=0; while (i/maximum<=1) { i=10*i; j=j+1; } m=j-1; for (i1=1; i1<m+2; i1++) { mag=pow(10,(i1-1)); i=0; while (i+mag*(n+1)<=maximum) { for (i2=i+mag*n; i2<i+mag*(n+1); i2++) { output.push_back(i2-1); } i=i+10*mag; } if(i+mag*(n+1)>maximum) { for (i2=i+mag*n; i2<maximum+1; i2++) { output.push_back(i2-1); } } } return output; } } 和我在Python中调用C++函数:使用< /P> import ctypes cpp=ctypes.cdll.LoadLibrary('/Users/.../cplusplus.so') print cpp.cplusplus(n=3,maximum=1000),python,c++,ctypes,Python,C++,Ctypes,正确返回后,该函数应返回一个包含3(即3,13,23,30,31,…)的1到1000之间所有数字的向量。但是,目前Python内核崩溃 我想这与我在C++文件中使用向量或内存泄漏有关。 提前感谢您的帮助 我想知道n和max是否是实际变量。试试看: Print cpp.cplusplus () 尝试建立一个在C++中显示你的向量的方法。这样就不会混合打印语言方法。您需要告诉python函数的输入和返回类型是什么。我很确定std::vector不是选项的一部分,选项列在文档中 这不是最快的最佳实践

正确返回后,该函数应返回一个包含3(即3,13,23,30,31,…)的1到1000之间所有数字的向量。但是,目前Python内核崩溃

我想这与我在C++文件中使用向量或内存泄漏有关。


提前感谢您的帮助

我想知道n和max是否是实际变量。试试看:

Print cpp.cplusplus ()

<>尝试建立一个在C++中显示你的向量的方法。这样就不会混合打印语言方法。

您需要告诉python函数的输入和返回类型是什么。我很确定std::vector不是选项的一部分,选项列在文档中

这不是最快的最佳实践选项 我开始的是将您的输入序列化到JSON,并将它们作为CARUP传递给共享库,然后将它们投到C++中,并返回另一个CARP…但这当然不是最快或最好的选择


(如果您确实正确地定义了类型,编辑您的帖子,我将删除这个答案)

<代码> cType < /C>不理解C++类型,所以这里是一个只在函数接口中使用C类型的函数的版本。必须预先分配结果缓冲区,并按地址传递元素数。函数用计算向量的长度更新元素的数量,如果可以将这些元素复制到结果缓冲区,则返回1(成功),否则返回0(失败)

请注意,代码算法不正确并返回错误的答案,但ctypes可以工作

#include <cmath>
#include <iostream>
#include <list>
#include <vector>
using namespace std;

extern "C"
{
    __declspec(dllexport) int cplusplus(int n, int maximum, int* result, size_t* pLength)
    {
        int i, j, order, m, i1, i2, mag;
        vector<int> output(0);

        i = 1;
        j = 0;

        while(i / maximum <= 1)
        {
            i = 10 * i;
            j = j + 1;
        }

        m = j - 1;

        for(i1 = 1; i1 < m + 2; i1++)
        {
            mag = pow(10, (i1 - 1));
            i = 0;

            while(i + mag * (n + 1) <= maximum)
            {
                for(i2 = i + mag * n; i2 < i + mag * (n + 1); i2++)
                    output.push_back(i2 - 1);

                i = i + 10 * mag;
            }

            if(i + mag * (n + 1) > maximum)
            {
                for(i2 = i + mag * n; i2 < maximum + 1; i2++)
                    output.push_back(i2 - 1);
            }
        }

        if(output.size() > *pLength)
        {
            *pLength = output.size();
            return 0; // fail
        }

        *pLength = output.size();
        memcpy(result, output.data(), output.size() * sizeof(int));
        return 1; // success
    }
}

恐怕内核仍然会使用此命令崩溃。这是
ctypes
而不是
cpptypes
<代码>类型无法处理
向量
。你必须有C数据类型。非常感谢!算法中的错误语句是
output\u push.back(i2-1)
。它应该是
output\u push.back(i2)
#include <cmath>
#include <iostream>
#include <list>
#include <vector>
using namespace std;

extern "C"
{
    __declspec(dllexport) int cplusplus(int n, int maximum, int* result, size_t* pLength)
    {
        int i, j, order, m, i1, i2, mag;
        vector<int> output(0);

        i = 1;
        j = 0;

        while(i / maximum <= 1)
        {
            i = 10 * i;
            j = j + 1;
        }

        m = j - 1;

        for(i1 = 1; i1 < m + 2; i1++)
        {
            mag = pow(10, (i1 - 1));
            i = 0;

            while(i + mag * (n + 1) <= maximum)
            {
                for(i2 = i + mag * n; i2 < i + mag * (n + 1); i2++)
                    output.push_back(i2 - 1);

                i = i + 10 * mag;
            }

            if(i + mag * (n + 1) > maximum)
            {
                for(i2 = i + mag * n; i2 < maximum + 1; i2++)
                    output.push_back(i2 - 1);
            }
        }

        if(output.size() > *pLength)
        {
            *pLength = output.size();
            return 0; // fail
        }

        *pLength = output.size();
        memcpy(result, output.data(), output.size() * sizeof(int));
        return 1; // success
    }
}
>>> from ctypes import *
>>> lib = CDLL('test')
>>> lib.cplusplus.argtypes = c_int,c_int,POINTER(c_int),POINTER(c_size_t)
>>> lib.cplusplus.restype = c_int
>>> arr = (c_int * 1000)()
>>> size = c_size_t(1000)
>>> lib.cplusplus(3,1000,arr,byref(size))
1
>>> size
c_ulonglong(300)
>>> list(arr[:size.value])
[2, 12, 22, 32, 42, 52, 62, 72, 82, 92, 102, 112, 122, 132, 142, 152, 162, 172, 182, 192, 202, 212, 222, 232, 242, 252,
262, 272, 282, 292, 302, 312, 322, 332, 342, 352, 362, 372, 382, 392, 402, 412, 422, 432, 442, 452, 462, 472, 482, 492,
502, 512, 522, 532, 542, 552, 562, 572, 582, 592, 602, 612, 622, 632, 642, 652, 662, 672, 682, 692, 702, 712, 722, 732,
742, 752, 762, 772, 782, 792, 802, 812, 822, 832, 842, 852, 862, 872, 882, 892, 902, 912, 922, 932, 942, 952, 962, 972,
982, 992, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 229, 230, 231, 232,
233, 234, 235, 236, 237, 238, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 429, 430, 431, 432, 433, 434, 435, 436,
437, 438, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 729, 730,
731, 732, 733, 734, 735, 736, 737, 738, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 929, 930, 931, 932, 933, 934,
935, 936, 937, 938, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,
319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366,
367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390,
391, 392, 393, 394, 395, 396, 397, 398]
>>> size = c_size_t(200) # too small
>>> lib.cplusplus(3,1000,arr,byref(size))
0
>>> size
c_ulonglong(300)