Problème de compilation

Problème de compilation - C++ - Programmation

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;
 

Code :
  1. #ifndef LineSegment_HPP
  2. #define LineSegment_HPP
  3. #include <iostream>
  4. using namespace std;
  5. #include "Point.hpp"
  6. class LineSegment
  7. {
  8. private:
  9.  Point e1; // Start
  10.  Point e2; // End
  11. public:
  12. // Constructors
  13. LineSegment();         // Line with both end Points at the origin
  14. LineSegment(const Point& p1, const Point& p2);               // Line with end Points [p1, p2]
  15. LineSegment(const LineSegment& l);          // Copy constructor
  16. virtual ~LineSegment();           // Destructor
  17. // Accesssing functions
  18. Point start() const;                 // Synonym for e1
  19. Point end() const;         // Synonym for e2
  20. // Modifiers
  21. void start(const Point& pt);              // Set Point pt1
  22. void end(const Point& pt);      // Set Point pt2
  23. // Arithemetic
  24. double length() const;       // Length of line
  25. // Interaction with Points
  26. Point midPoint() const;       // MidPoint of line segment
  27. friend
  28. ostream& operator << (ostream& os, const LineSegment& p);
  29. };
  30. #endif


 
Ensuite mon fichier source:
 

Code :
  1. #include "LineSegment.hpp"
  2. // Constructors
  3. LineSegment::LineSegment()
  4. { // Line with both end Points at the origin
  5. e1 = e2 = Point();
  6. }
  7. LineSegment::LineSegment(const Point& p1, const Point& p2)
  8. { // Line with end Points [p1, p2]
  9. e1 = p1;
  10. e2 = p2;
  11. }
  12. LineSegment::LineSegment(const LineSegment& l)
  13. {  // Copy constructor
  14. e1 = l.e1;
  15. e2 = l.e2;
  16. }
  17. LineSegment::~LineSegment()
  18. {       // Destructor
  19. }
  20. // Accesssing functions
  21. Point LineSegment::start() const
  22. {
  23. return e1;
  24. }
  25. Point LineSegment::end() const
  26. {
  27. return e2;
  28. }
  29. // Modifiers
  30. void LineSegment::start(const Point& pt)
  31. { // Set Point pt1
  32. e1 = pt;
  33. }
  34. void LineSegment::end(const Point& pt)
  35. { // Set Point pt2
  36. e2 = pt;
  37. }
  38. // Arithemetic
  39. double LineSegment::length() const
  40. {  // Length of line
  41. return e1.distance(e2);
  42. }
  43. // Interaction with Points
  44. Point LineSegment::midPoint() const
  45. { // MidPoint of line segment
  46. return e1.midPoint(e2);
  47. }
  48. // Output
  49. ostream& operator << (ostream& os, const LineSegment& ls)
  50. { // Output to screen
  51. os << "Point: (" << ls.e1 << ", " << ls.e2 << " )" << endl;
  52. return os;
  53. }


 
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,
 

Code :
  1. #include "Point.hpp"
  2. #include "LineSegment.hpp"
  3. #include <iostream>
  4. int main()
  5. {
  6. // Create a point
  7. Point p1;
  8. // Modify it cordinates
  9. p1.X(2.0);
  10. p1.Y(3.0);
  11. // Print it
  12. cout << "[" << p1.X() << "," << p1.Y() << "]" << endl;
  13. // Midpoint
  14. Point pL(0.0, 0.0);
  15. Point pR(1.0, 1.0);
  16. LineSegment myLine(pL, pR);
  17. cout << "Length: " << myLine.length() << endl;
  18. cout << "Midpoint: " << myLine.midPoint() << endl;
  19. return 0;
  20. }


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
Reply

Marsh Posté le 13-05-2011 à 22:54:07   

Reply

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 ?

Reply

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 ?


Message édité par theshockwave le 16-05-2011 à 11:31:18

---------------
last.fm
Reply

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...

Reply

Marsh Posté le 17-05-2011 à 10:20:00    

aymar73 a écrit :


Lorsque j'ôte les "using namespace" de mes headers, le nombre d'erreurs s'accentue...


 
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.

Reply

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 ?


---------------
last.fm
Reply

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

Reply

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

Reply

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;  
>------ 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é  

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.

Reply

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  :D  
 
 
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.  :lol:


Message édité par __tomjost le 20-05-2011 à 00:17:13
Reply

Marsh Posté le 20-05-2011 à 00:16:10   

Reply

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...
Pardon pour la confusion


 
envoie aussi tes lignes de compilation, parce que je soupçonne une erreur dans ta commande de link


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed