C ++-值未返回到main.cpp

时间:2018-10-07 07:02:56

标签: c++

我目前正在为c ++进行赋值,其中我从.txt文件中获取值并将这些数字取平均值,然后将该平均值写入新的.txt文件中 我做了所有这些,并调用了main.cpp中的函数,但是没有返回平均值,而且我不知道如何解决此问题。有人能帮我吗?

代码如下: computeaverage.cpp

#include <fstream>
#include <iostream>
#include "computeaverage.hpp"
using namespace std;

double compute_average(double average) {
  double total = 0, count = 0;
  int value;
  ifstream inFile;

  inFile.open("data.txt");

  while (inFile >> value) {
    count++;
    total += value;
  }

  inFile.close();
  average = total/count;
  return average;
}

double write_avg_to_file(double average) {
  ofstream outFile;

  outFile.open("solution.txt");
  outFile << average;
  outFile.close();
}

computeraverage.hpp

double compute_average(double average);
double write_avg_to_file(double average);

main.cpp

#include <iostream>
#include "computeaverage.hpp"
using namespace std;

int main() {
  double average = 0;
  compute_average(average);

  cout << "The average is " << average << endl;

  write_avg_to_file(average);

  return 0;
}

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

compute_average按值取average,并且average从未分配给主函数(除0初始化外)。像这样使用它:

double average = compute_average();

并删除compute_average的参数,该参数无论如何都不会使用。

答案 1 :(得分:2)

通过引用传递import React,{Component} from 'react'; import MetricsReport from '../components/pages/metrics-report'; class MetricsReportContainer extends Component { constructor(props) { super(props) this.generateReport = this.generateReport.bind(this); } generateReport(metricsParam) { console.log('???:', metricsParam); } componentDidMount() { } render() { return( <div> <MetricsReport generateReport={this.generateReport}/> </div> ) } } export default metricsReportContainer; ,从average函数返回后,其值将存在:

在computeraverage.hpp中替换

compute_average

double compute_average(double average);

在computeaverage.cpp中替换

void compute_average(double& average);

double compute_average(double average) {

并删除

void compute_average(double& average) {

答案 2 :(得分:0)

欢迎来到C ++编程世界。我看到您接受了Emil的回答,但正如zett42所建议的那样,可能会有更好的方法。

从函数的参数中返回结果是一种强大的技术,如果您通过C API维护或与C代码,旧版C ++或其他语言接口,则必须使用该技术。该技术确实存在陷阱,应尽可能避免。最好的方法是利用工具的功能。如果您使用的是最新的编译器,并且添加了发出所有警告的选项,并将警告视为错误;对于g ++“ -Wall -Werror”,编译器将提供一些帮助。有时(如上面讨论的那样)您需要禁用这些功能,但是可以肯定的是,在学习或工作时,报告会有所帮助。如果使用这些选项构建代码,则会收到以下消息:

computeaverage.cpp: In function double write_avg_to_file(double):
computeaverage.cpp:33:1: error: no return statement in function returning non-void [-Werror=return-type]

write_avg_to_file的声明更改为void write_avg_to_file(double);会使这些消息静音。

此外,如果您使用的是C ++ 17,则可以声明带有nodiscard属性的返回值的函数(如果您使用的不是C ++ 17,则可以通过其他一些不太方便的方式来指定):

[[nodiscard]] double compute_average(double average);

将提供以下诊断:

main.cpp: In function int main():
main.cpp:7:20: error: ignoring return value of double compute_average(double), declared with attribute nodiscard [-Werror=unused-result]
 compute_average(average);

将有问题的行更改为average = compute_average(average);将使这些消息静音,程序将按预期运行。但是,无需将average传递到compute_average中,因此可以将文件重写为:

computeaverage.hpp

[[nodiscard]] double compute_average();
void write_avg_to_file(double average);

computeaverage.cpp

#include <fstream>
#include <iostream>
#include "computeaverage.hpp"
using namespace std;

double compute_average() {
    double total = 0, count = 0;
    int value;
    ifstream inFile;

    inFile.open("data.txt");

    while (inFile >> value) {
        count++;
        total += value;
    }

    inFile.close();
    double average = total/count;
    return average;
}

void write_avg_to_file(double average) {
    ofstream outFile;

    outFile.open("solution.txt");
    outFile << average;
    outFile.close();
}

main.cpp

#include <iostream>
#include "computeaverage.hpp"
using namespace std;

int main() {
    double average = 0;
    average = compute_average();

    cout << "The average is " << average << endl;

    write_avg_to_file(average);

    return 0;
}

当然,您仍然可以进行错误检查,但是希望这些建议对您或其他人在将来的项目中有所帮助。