将 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<int>
。您还应该知道int
可以容纳的值的范围。你会很快超过这个限制。
@bluejambo 我的错误,我不小心将错误的代码复制到 SO,我已更正它
【参考方案1】:
大小为 10000000 的整数数组通常太大而无法在堆栈上分配,从而导致崩溃。相反,请使用std::vector<int>
。除此之外:
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<bits/stdc++.h>
会更好,因为这不是标准的,许多编译器不包含它,还有using namespace std;
。以上是关于将 python 代码移植到 C++ /(在 C++ 中打印出数组)的主要内容,如果未能解决你的问题,请参考以下文章
将数据序列化代码从 C++ linux/mac 移植到 C++ windows
C++ - 将 C++ 代码从 Visual Studio 移植到 Linux Eclipse IDE 时出现问题
将 C++ opencv 移植到 Python - 数组问题