Problème de compilation - C++ - Programmation
Marsh Posté le 16-05-2011 à 10:50:36
Dans le troisième code source, il ne faudrait pas oublier
using namespace std; |
Mais, il semble que le problème vienne de la définition du projet, de sa configuration.
C'est pour créer une application en mode console (DOS), ou une application Windows, ou autre chose ?
Marsh Posté le 16-05-2011 à 11:29:55
quelques remarques :
* les "using namespace" sont à proscrire dans les headers.
* les initialisations des membres ne doivent pas se faire dans le corps du constructeur (autant que possible, du moins)
pour ton problème de link, il semblerait effectivement que tu aies un problème de déclaration de ta fonction main. Comme le propose olivthill, selon ta configuration de projet, le compilateur va attendre un main différent.
que compiles-tu, tentais tu de faire une lib ? ou de produire un exe ?
Marsh Posté le 17-05-2011 à 00:59:57
à olivthill et theshockwave merci pour avoir pris la peine de me répondre. La mienne est une application en mode console; TestLineSegment.cpp vise juste à vérifier que les fichiers source et d'en-tête sont bien conçus...
Lorsque j'ôte les "using namespace" de mes headers, le nombre d'erreurs s'accentue...
Marsh Posté le 17-05-2011 à 10:20:00
aymar73 a écrit : |
Forcément... Si tu enlèves "using namespace", il faut préfixer par "std::" les objets définis dans "iostream" partout où tu les utilises dans le code.
Marsh Posté le 17-05-2011 à 11:06:59
tu n'es pas clair sur ton erreur.
les lignes que tu donnes pour ton "fichier de test" ne sont pas des lignes données par le compilateur mais par le programme qui s'exécute.
Quel est l'ensemble des fichiers que tu compiles lorsque tu ne testes pas ?
Marsh Posté le 17-05-2011 à 22:14:47
Bonjour à tous!
C'est bien le fichier source ci-dessus que je compile. Avec lui, puisque le principe de délégation est utilisé ici, les fichiers Point.hpp et Point.cpp sont pris en compte. Lorsque je compile Point.cpp, je n'ai aucune erreur même si j'ai cette erreur "Le programme '[4960] ExoPage61b.exe: Natif' s'est arrêté avec le code 0 (0x0)." à la fin de la compilation. Pour être correct, vous trouverez ci-dessous les fichiers en-tête et source de Point:
#ifndef Point_HPP
#define Point_HPP
#include <iostream>
using namespace std;
class Shape
{
};
class Point : public Shape
{
private:
double x; // X coordinate
double y; // Y coordinate
void init(double dx, double dy);
public:
// Constructors
Point(); // Default constructor
Point(double xval, double yval); // Initialize with x and y value
Point(const Point& pt); // Copy constructor
~Point() {} // Destructor
// Accessing functions
double X() const { return x;} // The x-coordinate
double Y() const; // The y-coordinate
// Modifiers
void X(double NewX);
void Y(double NewY);
// Arithmetic functions
Point add(const Point& p) const; // Return current + p
Point operator +(const Point& p) const; // Return current + p
/*friend */Point operator +(double d) const;
friend Point operator +(double d, const Point& p);
friend Point operator -(const Point& p, double d);
friend Point operator -(double d, const Point& p);
Point subtract(const Point& p) const; // Return current - p
Point scale(const Point& pt) const; // Return current * p
Point midPoint(const Point& pt) const; // Point midway
double distance (const Point& pt2) const;
// Copy
Point& copy(const Point& p); // Copy p in current
};
ostream& operator << (ostream& os, const Point& p);
#endif // Point_HXX
#include "Point.hpp"
#include <cmath>
using namespace std;
// Private functions
void Point::init(double dx, double dy)
{
x = dx;
y = dy;
}
Point::Point()
{// Default constructor
init(0.0, 0.0);
}
Point::Point(double newx, double newy)
{// Initialize using newx and newy
init(newx, newy);
}
/*
Point::Point(double newx, double newy) : x(newx), y(newy)
{// Initialize using newx and newy
// init(newx, newy); NOT NEEDED
}
*/
Point::Point(const Point& pt)
{// Copy constructor
x = pt.x;
y = pt.y;
}
/*
Point::~Point()
{
}
*/
/*
double Point::X() const
{
return x;
}
*/
double Point::Y() const
{
return y;
}
// Modifiers
void Point::X(double NewX)
{
x = NewX;
}
void Point::Y(double NewY)
{
y = NewY;
}
// Arithmetic functions
Point Point::add(const Point& p) const
{
return Point(x + p.x, y + p.y);
}
Point Point::operator +(const Point& p) const
{
return Point(x + p.x, y + p.y);
}
Point Point::subtract(const Point& p) const
{
return Point(x - p.x, y - p.y);
}
Point Point::operator +(double d)const
{
return Point (x + d, y + d);
}
Point operator +(double d, const Point& p)
{
return p + d;
}
Point operator -(const Point& p, double d)
{
return Point (p.x - d, p.y - d);
}
Point operator -(double d, const Point& p)
{
return Point (d - p.x, d - p.y);
}
Point Point::scale(const Point& pt) const
{ // Scale a Point by another Point
return Point(x * pt.x, y * pt.y);
}
Point Point::midPoint(const Point& pt) const
{ // Scale a Point by another Point
Point result((x + pt.x) * 0.5, (y + pt.y) * 0.5);
return result;
}
// Copy
Point& Point::copy(const Point& p)
{// Copy p in current
x = p.x;
y = p.y;
return *this;
}
double Point::distance(const Point& pt2) const
{
double dx = x - pt2.x;
double dy = y - pt2.y;
return sqrt(dx*dx + dy*dy);
}
// Output
ostream& operator << (ostream& os, const Point& p)
{ // Output to screen
os << "Point: (" << p.X() << ", " << p.Y() << " )" << endl;
return os;
}
Cordialement
Marsh Posté le 18-05-2011 à 02:24:12
Juste préciser que je veux produire des exe pour vérifier l'exactitude de mes fichiers...
Pardon pour la confusion
Marsh Posté le 18-05-2011 à 09:21:52
Donc, il reste quelle erreur ? Celle-ci ?
Citation : Lorsque je compile mon fichier source, j'obtiens l'erreur suivante; |
Si c'est ça, alors c'est une erreur de l'édition des liens, pas de la compilation proprement dite. L'édition des liens est la dernière phase de génération d'un exécutable. La partie la plus importante de ces lignes d'erreur est "symbole externe non résolu _main". Cela signifie que le projet est mal défini car il n'inclut pas le fichier qui contient main(), ou bien qu'il y a eu une autre erreur antérieure lors de la compilation de ce fichier.
Ce qui me parait un peu bizarre est le chemin "E:....". Le disque "E:" est souvent un disque externe, ou une clé USB. Si c'est le cas, cela poser des problèmes. Il vaudrait mieux créer un projet sur le disque C, mettre ces fichiers sources dans le répertoire indiqué par le projet de ce disque C, et lancer la génération du programme.
Marsh Posté le 20-05-2011 à 00:16:10
Tu doit cree un projet de "console application"si tu trouve des problemes pour changer les configurations , commence un nouveau projet console , et ajoute les fichiers
Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré
en VC6 la sortie des erreur etait plus intelligent , avec cetter forme
sur un seul ligne tu peut facilement lire "réussi 1"
Citation : Ce qui me parait un peu bizarre est le chemin "E:....". Le disque "E:" est souvent un disque externe... |
Plutot file://A:\Homework\ExoPage61b\ExoPage61b\Debug\BuildLog.htm
..si vous avez encore un lecteur disquette.
Marsh Posté le 20-05-2011 à 10:58:13
aymar73 a écrit : Juste préciser que je veux produire des exe pour vérifier l'exactitude de mes fichiers... |
envoie aussi tes lignes de compilation, parce que je soupçonne une erreur dans ta commande de link
Marsh Posté le 13-05-2011 à 22:54:07
Bonjour à tous,
je dois coder un segment qui est un bon exemple de la notion de composition (un segment se composant de deux points)
Ci-dessous, mon fichier d'en-tête;
Ensuite mon fichier source:
Lorsque je compile mon fichier source, j'obtiens l'erreur suivante;
>------ Début de la génération : Projet : ExoPage61b, Configuration : Debug Win32 ------
1>Édition des liens en cours...
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: symbole externe non résolu _main référencé dans la fonction ___tmainCRTStartup
1>E:\Homework\ExoPage61b\Debug\ExoPage61b.exe : fatal error LNK1120: 1 externes non résolus
1>Le journal de génération a été enregistré à l'emplacement "file://e:\Homework\ExoPage61b\ExoPage61b\Debug\BuildLog.htm"
1>ExoPage61b - 2 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré
Le fichier test ci-dessous,
me donne ceci lors de sa compilation,
'ExoPage61b.exe' : Chargé 'E:\Homework\ExoPage61b\Debug\ExoPage61b.exe', Les symboles ont été chargés.
'ExoPage61b.exe' : Chargé 'C:\Windows\SysWOW64\ntdll.dll'
'ExoPage61b.exe' : Chargé 'C:\Windows\SysWOW64\kernel32.dll'
'ExoPage61b.exe' : Chargé 'C:\Windows\SysWOW64\KernelBase.dll'
'ExoPage61b.exe' : Chargé 'C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcp90d.dll'
'ExoPage61b.exe' : Chargé 'C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcr90d.dll'
Le programme '[4140] ExoPage61b.exe: Natif' s'est arrêté avec le code 0 (0x0).
Pourriez-vous m'aider à voir plus clair sur ce qui se passe??
Merci à tous
Cordialement
Message édité par gilou le 14-05-2011 à 02:35:31