'foo' n'a pas été déclarée dans ce champ d'application c++
Je suis en train d'apprendre le c++ (premier jour de la regarder depuis que j'ai pris 1 semaine de camp d'été il y a des années)
J'ai été la conversion d'un programme que je suis en train de travailler avec Java C++:
#ifndef ADD_H
#define ADD_H
#define _USE_MATH_DEFINES
#include <iostream>
#include <math.h>
using namespace std;
class Evaluatable {
public:
virtual double evaluate(double x);
};
class SkewNormalEvalutatable : Evaluatable{
public:
SkewNormalEvalutatable();
double evaluate(double x){
return 1 / sqrt(2 * M_PI) * pow(2.71828182845904523536, -x * x / 2);
}
};
SkewNormalEvalutatable::SkewNormalEvalutatable()
{
}
double getSkewNormal(double skewValue, double x)
{
SkewNormalEvalutatable e ();
return 2 / sqrt(2 * M_PI) * pow(2.71828182845904523536, -x * x / 2) * integrate(-1000, skewValue * x, 10000, e);
}
//double normalDist(double x){
// return 1 /Math.sqrt(2 * Math.PI) * Math.pow(Math.E, -x * x /2);
//}
double integrate (double start, double stop,
int numSteps,
Evaluatable evalObj)
{
double stepSize = (stop - start) / (double)numSteps;
start = start + stepSize / 2.0;
return (stepSize * sum(start, stop, stepSize, evalObj));
}
double sum (double start, double stop,
double stepSize,
Evaluatable evalObj)
{
double sum = 0.0, current = start;
while (current <= stop) {
sum += evalObj.evaluate(current);
current += stepSize;
}
return(sum);
}
//int main()
//{
// cout << getSkewNormal(10.0, 0) << endl;
// return 0;
//}
#endif
Les erreurs ont été:
SkewNormal.h: In function 'double getSkewNormal(double, double)' :
SkewNormal.h: 29: error: 'integrate' was not declared in this scope
SkewNormal.h: In function 'double integrate(double, double, int, Evaluatable)':
SkewNormal.h:41: error: 'sum' was not declared in this scope
Intégrer et de la somme sont censés être des fonctions
Voici le code Java, plus ou moins le même:
public static double negativelySkewed(double skew, int min, int max){
return randomSkew(skew) * (max - min) + min;
}
public static double randomSkew(final double skew){
final double xVal = Math.random();
return 2 * normalDist(xVal) * Integral.integrate(-500, skew * xVal, 100000, new Evaluatable() {
@Override
public double evaluate(double value) {
return normalDist(value);
}
});
}
public static double normalDist(double x){
return 1 / Math.sqrt(2 * Math.PI) * Math.pow(Math.E, -x * x / 2);
}
/** A class to calculate summations and numeric integrals. The
* integral is calculated according to the midpoint rule.
*
* Taken from Core Web Programming from
* Prentice Hall and Sun Microsystems Press,
* http://www.corewebprogramming.com/.
* © 2001 Marty Hall and Larry Brown;
* may be freely used or adapted.
*/
public static class Integral {
/** Returns the sum of f(x) from x=start to x=stop, where the
* function f is defined by the evaluate method of the
* Evaluatable object.
*/
public static double sum(double start, double stop,
double stepSize,
Evaluatable evalObj) {
double sum = 0.0, current = start;
while (current <= stop) {
sum += evalObj.evaluate(current);
current += stepSize;
}
return(sum);
}
/** Returns an approximation of the integral of f(x) from
* start to stop, using the midpoint rule. The function f is
* defined by the evaluate method of the Evaluatable object.
*/
public static double integrate(double start, double stop,
int numSteps,
Evaluatable evalObj) {
double stepSize = (stop - start) / (double)numSteps;
start = start + stepSize / 2.0;
return(stepSize * sum(start, stop, stepSize, evalObj));
}
}
/** An interface for evaluating functions y = f(x) at a specific
* value. Both x and y are double-precision floating-point
* numbers.
*
* Taken from Core Web Programming from
* Prentice Hall and Sun Microsystems Press,
* http://www.corewebprogramming.com/.
* © 2001 Marty Hall and Larry Brown;
* may be freely used or adapted.
*/
public static interface Evaluatable {
public double evaluate(double value);
}
Je suis certain que c'est quelque chose de très simple
Aussi, comment dois-je appeler
getSkewNormal(double skewValue, double x)
À partir d'un fichier en dehors de SkewNormal.h?
- Vous avez besoin de déclarer une fonction avant que vous pouvez appeler en C++. Aussi, préférez
M_E
à2.71828...
Vous devez vous connecter pour publier un commentaire.
En C++, vous êtes censé déclarer des fonctions avant de pouvoir les utiliser. Dans votre code
integrate
n'est pas déclarée avant le point de le premier appel àintegrate
. La même chose s'applique àsum
. D'où l'erreur. Soit modifier l'ordre de vos définitions, afin que la définition de la fonction précède le premier appel de la fonction, ou d'introduire un [forward] non-définition de la déclaration pour chaque fonction.En outre, définir des non-inline fonctions dans les fichiers d'en-tête dans un non-non en C++. Vos définitions de
SkewNormalEvalutatable::SkewNormalEvalutatable
,getSkewNormal
,integrate
etc. n'ont rien à faire dans le fichier d'en-tête.Aussi
SkewNormalEvalutatable e();
déclaration en C++ déclare une fonctione
, pas un objete
comme vous semblez le supposer. Le simpleSkewNormalEvalutatable e;
va déclarer un objet initialisé par le constructeur par défaut.En outre, vous recevez le dernier paramètre de
integrate
(et desum
) en valeur comme un objet deEvaluatable
type. Cela signifie que de tenter de passerSkewNormalEvalutatable
comme dernier argument deintegrate
entraîneraSkewNormalEvalutatable
obtenir des tranches deEvaluatable
. Le polymorphisme ne fonctionne pas à cause de ça. Si vous voulez le comportement polymorphique, vous devez recevoir ce paramètre par référence ou par pointeur, mais pas en valeur.SkewNormalEvalutatable e ();
qui est mal et de ne pas créer des objets.main.cpp
etSkewNormal.cpp
. Vous devez compiler à la fois des fichiers et de lier les résultats (fichiers objets) ensemble. Vous apparemment, ne sont pas à la compilationSkewNormal.cpp
à tous ou ne pas lier le résultat de sa compilation dans le programme final. Quel compilateur que vous utilisez?SkewNormal.cpp
à votre "projet", "makefile" ou que ce soit, il est appelé dans KDevelop.En C++, vos fichiers source sont généralement analysées à partir du haut vers le bas en un seul passage, de sorte que toute variable ou fonction doit être déclarée avant d'être utilisée. Il y a quelques exceptions, comme lors de la définition des fonctions inline dans une définition de classe, mais ce n'est pas le cas de votre code.
Soit déplacer la définition de
integrate
au-dessus de l'un pourgetSkewNormal
, ou ajouter une déclaration ci-dessusgetSkewNormal
:La même chose s'applique pour
sum
.En général, dans les fonctions C++ doivent être déclarés avant de vous appeler. Alors parfois, avant la définition de
getSkewNormal()
, le compilateur a besoin de voir la déclaration:Plupart des gens faire est de mettre toutes les déclarations (seulement) dans le fichier d'en-tête, et de mettre le code -- le définitions des fonctions et méthodes-dans une autre source (
*.cc
ou*.cpp
) fichier. Cela résout parfaitement le problème d'avoir besoin de toutes les fonctions qui doivent être déclarés.