在函数内部声明函数时出现C ++语法错误

时间:2012-12-24 07:07:41

标签: c++ function

我正在尝试创建一个允许我找到数字的第n个根的程序。我尝试在xcode上运行它,我得到一个错误,阻止我运行它。我收到了这一行的错误:

double f(double x) {

在这一行中,我试图声明一个函数,但似乎我正在宣布它是错误的。 xcode说expected ;。我该如何解决这个问题?

#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
#include <cctype>
#include <stdio.h>
#include <ctype.h>
#include "helloworld.h"
#include <locale>

using namespace std;
double newton( int n, int number);
string lowercase (string word);

int main()
{
    int n;
    int number;
    cout << "This program can find the nth root of a number without actually solving the problem" <<endl;
    cout << "Tell me what the value of n is: ";
    cin >> n;
    cout << "What is the number that you want to get rooted";
    cin >> number;

    newton(n, number); 
}

double newton( int n, int number) {
    const double epsilon = .0001;
    double x0;
    double x1 = number;

    double f(double x) {
        return (double) pow(x, n) - number;
    }
    double der_f(double x) {
        return (double) n*pow(x, n-1);
    }

    while( abs(x1-x0) < epsilon) {
        x0 = x1;
        x1 = x0 -f(x0)/der_f(x0); 
    }
    return x1;
}

4 个答案:

答案 0 :(得分:2)

如果你真的想要功能内部 - 有一个黑客。 您可以在函数内部使用静态函数定义struct。

示例:

double newton( int n, int number) {
    const double epsilon = .0001;
    double x0;
    double x1 = number;

    struct wrap {
       static int n;
       static double f(double x) {
           return (double) pow(x, n) - number;
       }
       static double der_f(double x) {
           return (double) n*pow(x, n-1);
       }
    };
    wrap::n = n;

    while( abs(x1-x0) < epsilon) {
        x0 = x1;
        x1 = x0 -wrap::f(x0)/wrap::der_f(x0); 
    }
    return x1;
}

像这样。

答案 1 :(得分:1)

移动

   double f(double x) {
        return (double) pow(x, n) - number;
    }
    double der_f(double x) {
        return (double) n*pow(x, n-1);
    }

double newton( int n, int number) {

之外

答案 2 :(得分:1)

这种情况正在发生,因为您在函数内部声明了新函数,这是不可能的。试试这个:

#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
#include <cctype>
#include <stdio.h>
#include <ctype.h>
#include "helloworld.h"
#include <locale>

using namespace std;
double newton( int n, int number);
string lowercase (string word);


double f(double x) {
    return (double) pow(x, n) - number;
}

double der_f(double x) {
    return (double) n*pow(x, n-1);
}

int main() {
  int n;
  int number;
  cout << "This program can find the nth root of a number without actually solving the problem" <<endl;
  cout << "Tell me what the value of n is: ";
  cin >> n;
  cout << "What is the number that you want to get rooted";
  cin >> number;
  newton(n, number);
}

double newton( int n, int number) {
  const double epsilon = .0001;
  double x0;
  double x1 = number;
  // and here call the functions
  f();
  der_f();
  while( abs(x1-x0) < epsilon ) {
    x0 = x1;
    x1 = x0 -f(x0)/der_f(x0); 
  }
  return x1;
}

答案 3 :(得分:0)

正如已经指出的那样,你必须摆脱本地功能。在C ++ 11中执行此操作的另一种方法是使用 lambda-functions

auto f = [=](double x) {
  return (double) pow(x, n) - number;
};
auto der_f = [=](double x) {
  return (double) n*pow(x, n-1);
};

在这种情况下,您只需要将double func_name(double x)替换为auto func_name = [=](double x)

[=] lambda-introducer 。通过=,您告诉您希望所有局部变量都可以通过值在lambda函数中访问。这是最适合您的情况,因为您只有基本类型的变量,并且您不想从本地函数中修改它们。

auto关键字告诉编译器自动推导出用于存储初始化子句中的函数的变量类型。一个人可以std::function<double(double)>而不是auto