C++返回的数组值不正确
Posted
技术标签:
【中文标题】C++返回的数组值不正确【英文标题】:C++ the returned array value is not correct 【发布时间】:2017-06-12 06:16:16 【问题描述】:首先感谢您帮我解决这个问题。我不是 C++ 专家,但我在 C 中做了一些工作。我的代码问题是它不能正确显示返回的数组值。
一般来说,我的程序试图做的是评估函数 F(x) ,以表格格式显示它并找到它的最小值和最大值。我已经找到了做这一切的方法,但是当我想显示数组 F(x) 的返回值时,它以某种方式被扭曲了。第一个值总是正确的,例如
cout << *(value+0) <<endl;
但是下一个值与假定的 f(x) 不同。如果我的代码没有达到适当的标准,请提前抱歉,但我已经为此考虑了一段时间。
My Full Code
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
#include <string>
#include <stdlib.h>
using namespace std;
float *evaluate ();
void display ();
void Min_Max(float *);
int main()
float *p;
evaluate();
display();
cin.get();
p = evaluate();
Min_Max(p);
return 0;
float *evaluate()
ofstream Out_File("result.txt");
int n=30;
float x [n];
float fx[n];
float interval = ((4-(-2))/0.2);
x[0]= -2.0;
for(n=0;n <= interval;n++)
fx[n] = 4*exp((-x[n])/2)*sin((2*x[n]- 0.3)*3.14159/180);
x[n+1] = x[n] + 0.2;
if (Out_File.is_open())
Out_File <<setprecision(5)<<setw(8)<<showpoint<<fixed<< x[n];
Out_File << "\t\t"<<setprecision(5)<<setw(8)<<showpoint<<fixed<<fx[n]<<endl;
else cout << "Unable to open file";
Out_File.close();
return fx;
void display()
ifstream inFile;
inFile.open("result.txt");
string line;
cout << " x\t\t\t f(x)"<<endl;
cout << "_______________________________________"<<endl;
while( getline (inFile,line))
cout<<line<<endl;
inFile.close();
void Min_Max(float *value)
int a=0;
for(a=0;a<=30;a++)
cout << *(value+a) <<endl;
*value =0;
【问题讨论】:
【参考方案1】:我明白了,你将p
传递给你的函数Min_Max
。其中p
是指向数组入口点的指针。该数组在另一个函数evaluate
中创建为local variable
。这不起作用,因为一旦evaluate
完成,它的所有local variables
,例如fx
数组,都会被销毁,然后您返回的指针指向“无”。
在这种情况下,您可以使用heap
内存(使用new
运算符)来分配fx
。但不要忘记之后释放它。
另外,看here
【讨论】:
原谅我,但我不完全理解你的答案,英语不是我的第一语言,但让我试着理解它。你说指针 p 只能访问数组的第一个值?堆内存对我来说是新的,我已经看过你给出的例子,但我不明白如何在我的代码中使用它。最后,“不要忘记之后释放它”是什么意思。 你知道variable scope
吗?这就是这里的确切问题。当您创建 local variable
时,它仅存在于这些括号
内。当程序超出括号时,变量不再存在。因此,您在括号内创建一个变量,将指向它的指针传递给外部,一旦您退出函数,该指针就没有指向任何东西。关于heap memory
,您只需继续使用谷歌new
操作员,我相信您一开始就会找到其他相关内容:)
更明确地说:您在函数evaluate
中创建了一个变量fx
。 fx
在函数开始工作时创建,在函数停止工作后立即终止。因此,当函数运行时,您获取fx
的内存地址(这只是一个数字)并从函数中返回它。在main
函数中,您将那个内存地址分配给变量p
。由于evaluate
已停止工作,其所有local variables
(包括fx
)此时都不存在。 p
具有创建 fx
的内存地址,但现在该地址处没有“任何内容”。
本地和全球范围内的可变范围?将float *p
更改为全球帮助?因为我把它改成全局的,和以前一样。感谢您清楚地解释它有帮助,但我不明白为什么我的方法在小范围内有效但不是这样?感谢您提供的帮助,希望人们将来也会对您做同样的事情。跨度>
如果你将float fx[n];
放在int main()
之前,那么它会起作用。或者,如果您只是将float fx[n];
更改为static float fx[n];
。但我不会改变范围,这是一种不好的做法。我会接受一个数组指针作为参数并在函数内取消引用它。如果你在谷歌中输入C++ return array from function
,你会发现很多关于这个的信息。以上是关于C++返回的数组值不正确的主要内容,如果未能解决你的问题,请参考以下文章