将 python 代码移植到 C++ /(在 C++ 中打印出数组)

Posted

技术标签:

【中文标题】将 python 代码移植到 C++ /(在 C++ 中打印出数组)【英文标题】:Porting python code to C++ / (Printing out arrays in c++) 【发布时间】:2021-08-16 11:28:47 【问题描述】:

我目前正在学习 C++ 并且非常精通 python,我决定尝试将我的一些 python 代码移植到 C++。具体来说,我尝试移植我编写的这个生成器,它可以将斐波那契序列提供到某个给定的停止值。

def yieldFib(stop):
    a = 0
    b = 1
        yield i
    for i in range(2):
    for i in range(stop-2):
        fib = a+b
        a = b
        b = fib
        yield fib
fib = list(yieldFib(100))
print(fib)

到这里

int* fib(int stopp)
    int a = 0;
    int b = 1;
    int fibN;
    int fibb[10000000];
    fibb[0] = 0;
    fibb[1] = 1;
    for(int i=2; i<stopp-2; i++)
        fibN = a+b;
        a =  b;
        b =  fibN;
        fibb[i] = fibN;
    
    return fibb;

int main()
    int stop;
    cin >> stop;
    int* fibbb = fib(stop);
    cout << fibbb;


我承认 c++ 很粗糙,但这只是为了帮助我学习。由于某种原因,代码在接受用户输入后会崩溃并退出,我怀疑这与我尝试使用数组的方式有关,但我不太确定是什么。任何帮助将不胜感激

【问题讨论】:

除非我弄错了,否则您一开始就不会在函数中为 fibN 赋值。要使用它,您需要给它一个值。还有一点,b 的用途是什么,你不会在任何地方的函数中使用它。 int fibb[10000000]; 对于堆栈来说可能太大了。您可以考虑使用std::vector&lt;int&gt;。您还应该知道int 可以容纳的值的范围。你会很快超过这个限制。 @bluejambo 我的错误,我不小心将错误的代码复制到 SO,我已更正它 【参考方案1】:

大小为 10000000 的整数数组通常太大而无法在堆栈上分配,从而导致崩溃。相反,请使用std::vector&lt;int&gt;。除此之外:

变量b 未使用。 fibN 未初始化。它的值是不确定的。 返回指向堆栈内存的指针将不起作用,因为该指针在函数返回后不再有效。 代码将打印 整数指针 的值,而不是数组的值。相反,遍历数组并一一打印值。

附带说明:您似乎正在尝试通过反复试验来学习 C++,而最好使用书籍或课程从头开始学习。

【讨论】:

嘿,谢谢。我已经更正了 fibN,不小心复制了该示例的旧版本代码。另外,我实际上正在学习一门课程,但还没有完全完成。我错误地认为我有足够的知识可以开始尝试一些我猜想的事情。【参考方案2】:

在提供的代码中,我看到很多错误。

首先:您正在堆栈内创建长度为 10000000 的 int-array(您没有分配内存)什么是 40 MB!你只是超过了堆栈长度(我记得 1 MB)。只需使用 new 运算符分配它。如果你不想使用这种数组(或者不想计算它的精确长度),你可以使用 std::vector ,它可以在内存中扩展自己。

int* fibb = new int[precise_length];
//or
std::vector<int> fibb = std::vector<int>(); //and fill it by calling fibb.push_back()

第二:cout用法。您尝试打印数组 POINTER,而不是内容。分别打印数组的每个成员。

【讨论】:

哇,谢谢。这是非常有见地的。所以这意味着“数组/列表”实际上是 c++ 中的指针,不能像普通的 python 那样一次性打印出来 很高兴注意到:这不是您看不到内存背景的 Python。在这里,您应该自己管理内存并计算您使用的每个字节。如果你分配了一些东西(“new”操作符),你应该(!)在没有必要避免内存泄漏时释放它。在堆栈中创建的变量(没有 new,就像你创建那个庞大的数组一样),不应该用 delete 操作符释放。 @TochiBedford,是的,没错。正如 Yun 上面所说,我建议阅读有关内存管理的内容,以了解事物是如何包含在那里的。那么C++对你来说会很容易:)【参考方案3】:
    #include<bits/stdc++.h>

    using namespace std;

    vector<int> fib( const int& n )

        vector<int> v = 0, 1;

        for(int i = 2; i <= n; i++)
            v.push_back( v[i - 1] + v[i - 2] );
        

        return v;
    


    int main()

        int n;
        cin >> n;

        vector<int> _fib = fib( n );

        for( auto x : _fib )
            cout << x << ' ';
        

        return 0;
    

【讨论】:

如果您解释了代码的作用以及它解决原始问题的原因,这可能是一个有用的答案。没有#include&lt;bits/stdc++.h&gt; 会更好,因为这不是标准的,许多编译器不包含它,还有using namespace std;

以上是关于将 python 代码移植到 C++ /(在 C++ 中打印出数组)的主要内容,如果未能解决你的问题,请参考以下文章

将数据序列化代码从 C++ linux/mac 移植到 C++ windows

C++ - 将 C++ 代码从 Visual Studio 移植到 Linux Eclipse IDE 时出现问题

将 C++ opencv 移植到 Python - 数组问题

将 C++ 类移植到 PyQt

将python代码转换为c ++时出现opencvcornerSubPix异常

将本机 C++ 移植到 .NET [关闭]