#include <iostream>
using namespace std;
int getDegree()
{
int degree;
cout << "Enter degree of polynomial" << endl;
cin >> degree;
return degree;
}
int* getPoly(int degree)
{
cout << "Enter coefficients in order of power of x. e.g. for 2 + x + 3x^2, enter 2 then 1 then 3" << endl;
int coeff [degree +1];
for (int i = 0; i <= degree; i++)
{
cin >> coeff[i];
}
return coeff;
}
int* polyder(int p[], int degree)
{
int dp[degree];
for(int i = 0; i < degree; i++)
{
dp[i] = p[i+1] * (i+1);
}
return dp;
}
int main(int argc, const char * argv[])
{
int degree = getDegree();
int p = *getPoly(degree);
int dp = *polyder(&p, degree);
for(int i = 0; i < degree +1; i++)
cout << " " << p[i] << " x^" << i;
cout << endl;
for(int i = 0; i < degree +1; i++)
cout << " " << dp[i] << " x^" << i;
cout << endl;
return 0;
}
我在打印语句中遇到错误。 我并不担心所涉及的数学,只是如何在函数/方法之间传递数组。
任何人都可以找到为什么这不起作用? 我是C ++的新手,习惯于Java。
答案 0 :(得分:2)
有人能找到为什么这不起作用吗?
在C ++变量中,当声明它们的作用域结束时,它们被销毁。返回函数结束时不存在的变量的地址:
int* getPoly(int degree)
{
int coeff [degree +1];
// ...
return coeff;
}
如果您希望在函数结束后变量仍然存在,则必须使用new
进行分配:
int* getPoly(int degree)
{
int *coeff = new int[degree +1];
// ...
return coeff;
}
并且,在主函数的末尾(或者您不再需要数组的任何地方),调用delete[]
来释放内存:
int *p = getPoly(degree);
delete[] p;
Array名称本质上是指向数组第一个元素的指针(正如您在上面的代码中看到的,我已将p
声明为int
的指针),所以你通过了他们只需提供他们的名字即可使用其他功能:
int* polyder(int p[], int degree){/*do something here*/}
// <-- some other code
int *p = getPoly(degree);
int* returnedArray = polyder(p,degree);
答案 1 :(得分:0)
首先,行
int coeff [degree +1];
不是有效的C ++语句,除非'degree'是常量,即使某些编译器可能允许它。
即使某些编译器允许,coeff
的空间也会从堆栈中分配,并在函数返回后无效。因此,行
return coeff;
返回一个在使用时无效的内存位置。
为了返回有效的记忆功能,请替换
行int coeff [degree +1];
通过
int* coeff = new int[degree];
数组中不需要degree+1
个项目。
函数polyder
中需要进行类似的更改。
答案 2 :(得分:-1)
在C ++中要记住arrays
的事情是,与Java不同,它们不是对象(至少在Java中是这样的)。它们只是指向已分配内存块的指针,而[]
运算符只是自动进行数学运算以将指针移动到正确的位置。
在函数之间传递数组时,基本上只是传递一个指针。除非你想进入一些非常复杂且可能过多的用例代码,否则你应该总是传递数组的大小以确保索引始终保持在边界内。
正如另一个答案所指出的,你需要确保阵列的生命周期持续只要你需要它。简单地返回一个指向对象的指针不会像在Java中返回引用那样保持活动。