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 中创建了一个变量fxfx 在函数开始工作时创建,在函数停止工作后立即终止。因此,当函数运行时,您获取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++返回的数组值不正确的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 函数与 Python 函数返回的值不一致,用于偏斜正态分布

循环和结构数组时打印的值不正确

C ++用户定义函数返回不正确[关闭]

在 gcc 中将二维数组初始化为 0 时的值不正确

检查二维向量中的邻居周围坐标时返回的值不正确

C ++从函数返回指向数组的指针的正确方法