Bonjour à tous!
Je tiens tout d'abord avant de me lancer à preciser que je suis un Neophite (un vrai de vrai) avec le langage C++
Mon probleme j'ai un projet à realiser mais pour cela j'ai besoin de créer une nouvelle classe. Ne m'y connaissant pas j'ai fait quelques recherches et de ces recherches ont découlés trois fichiers un '.h' un '.c' et un autre (le main) dans lequel j'inclus la classe et essaie de la tester.
Le pb lors de la compilation j'ai plein d'erreurs que je ne saurais expliquer....
Je vous copie donc ci-dessous les contenus des fichiers et la liste d'erreurs affichées:
header fichier '.h'
class Cplx{
private:
// attributs
private float reel;
private float im;
public:
//Methodes
Cplx(float r, float i);
float PartReelle();
float PartIm();
void Conj();
void C_Somme(Cplx a, Cplx b);
void C_Somme_float (Cplx a, float b);
void C_Diff (Cplx a, Cplx b);
void C_Diff_float (Cplx a, float b);
void C_Produit(Cplx a, Cplx b);
void C_Produit_float (Cplx a, float b);
void C_Inv();
void C_Div (Cplx a, Clpx b);
void C_Div_float (Cplx a, float b)
};
____________________________________________
____________________________________________
Fichier '.C'
public class Cplx {
// attributs
private float reel;
private float im;
// constructeur
public Cplx(float r, float i){
reel =r;
im = i;
}
// accesseurs aux attributs
public float PartReelle(){
return reel;
}
public float PartIm(){
return im;
}
//operation sur les complexes
public void Conj(){
im=-im;
}
public void C_Somme(Cplx a, Cplx b){
reel= a.PartReelle + b.PartReelle;
im = a.PartIm + b.PartIm;
}
public void C_Somme_float (Cplx a, float b){
reel= a.PartReelle + b;
}
public void C_Diff (Cplx a, Cplx b){
reel= a.PartReelle - b.PartReelle.b;
im = a.PartIm - b.PartIm;
}
public void C_Diff_float (Cplx a, float b){
reel= a.PartReelle - b;
}
public void C_Produit(Cplx a, Cplx b){
reel= a.PartReelle*b.PartReelle - a.PartIm + b.PartIm;
im = a.PartReelle*b.PartIm + a.PartIm + b.PartReelle;
}
public void C_Produit_float (Cplx a, float b){
reel= a.PartReelle*b;
im = a.PartIm*b;
}
public void C_Inv(){
reel= reel/(pow(reel,2) + pow(im,2));
im = im/(pow(reel,2) + pow(im,2));
}
public void C_Div (Cplx a, Clpx b){
C_Produit(a , b.C_Inv);
}
public void C_Div_float (
Cplx a, float b){ reel= (a.PartReelle)/b;
im = (a.PartIm)/b;
}
___________________________________________
___________________________________________
fichier main (.C)
int main ()
{
Clpx A =new Clpx(12,4);
A.PartReelle;
A.PartIm;
A.conj;
A.PartReelle;
A.PartIm;
C_Somme(A,A.conj);
C_Somme_float(A,2);
return 0;
}
__________________________________________
__________________________________________
erreurs:
1>------ Début de la génération : Projet : test_class, Configuration : Debug Win32 ------
1> Clpx.cpp
1>Clpx.cpp(1): warning C4627: '#include <iostream>' : ignoré lors de la recherche d'une utilisation d'un en-tête précompilé
1> Ajoutez la directive à 'StdAfx.h' ou régénérez l'en-tête précompilé
1>Clpx.cpp(2): warning C4627: '#include <math.h>' : ignoré lors de la recherche d'une utilisation d'un en-tête précompilé
1> Ajoutez la directive à 'StdAfx.h' ou régénérez l'en-tête précompilé
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(8): error C2144: erreur de syntaxe : 'float' doit être précédé de ':'
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(9): error C2144: erreur de syntaxe : 'float' doit être précédé de ':'
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(14): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(14): warning C4183: 'Cplx' : type de retour manquant ; fonction membre retournant 'int' prise par défaut
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(18): error C2061: erreur de syntaxe : identificateur 'Cplx'
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(19): error C2061: erreur de syntaxe : identificateur 'Cplx'
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(20): error C2061: erreur de syntaxe : identificateur 'Cplx'
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(21): error C2061: erreur de syntaxe : identificateur 'Cplx'
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(22): error C2061: erreur de syntaxe : identificateur 'Cplx'
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(23): error C2061: erreur de syntaxe : identificateur 'Cplx'
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(25): error C2061: erreur de syntaxe : identificateur 'Cplx'
1>c:\users\mouyabi\desktop\cours\2010-2011\tp_info
\tp3\test_class\test_class\Clpx.h(26): error C2061: erreur de syntaxe : identificateur 'Cplx'
1>Clpx.cpp(10): error C2144: erreur de syntaxe : 'float' doit être précédé de ':'
1>Clpx.cpp(11): error C2144: erreur de syntaxe : 'float' doit être précédé de ':'
1>Clpx.cpp(14): error C2144: erreur de syntaxe : 'Cplx' doit être précédé de ':'
1>Clpx.cpp(19): error C2144: erreur de syntaxe : 'float' doit être précédé de ':'
1>Clpx.cpp(23): error C2144: erreur de syntaxe : 'float' doit être précédé de ':'
1>Clpx.cpp(29): error C2144: erreur de syntaxe : 'void' doit être précédé de ':'
1>Clpx.cpp(33): error C2144: erreur de syntaxe : 'void' doit être précédé de ':'
1>Clpx.cpp(37): error C2144: erreur de syntaxe : 'void' doit être précédé de ':'
1>Clpx.cpp(40): error C2144: erreur de syntaxe : 'void' doit être précédé de ':'
1>Clpx.cpp(44): error C2144: erreur de syntaxe : 'void' doit être précédé de ':'
1>Clpx.cpp(48): error C2144: erreur de syntaxe : 'void' doit être précédé de ':'
1>Clpx.cpp(52): error C2144: erreur de syntaxe : 'void' doit être précédé de ':'
1>Clpx.cpp(56): error C2144: erreur de syntaxe : 'void' doit être précédé de ':'
1>Clpx.cpp(60): error C2144: erreur de syntaxe : 'void' doit être précédé de ':'
1>Clpx.cpp(63): error C2144: erreur de syntaxe : 'void' doit être précédé de ':'
1>Clpx.cpp(67): fatal error C1075: fin de fichier rencontrée avant que l'élément accolade '{' gauche de 'Clpx.cpp(8)' soit équilibré
1> test_class_Cplx.cpp
1>test_class_Cplx.cpp(1): warning C4627: '#include <iostream>' : ignoré lors de la recherche d'une utilisation d'un en-tête précompilé
1> Ajoutez la directive à 'StdAfx.h' ou régénérez l'en-tête précompilé
1>test_class_Cplx.cpp(2): warning C4627: '#include <math.h>' : ignoré lors de la recherche d'une utilisation d'un en-tête précompilé
1> Ajoutez la directive à 'StdAfx.h' ou régénérez l'en-tête précompilé
1>test_class_Cplx.cpp(3): warning C4627: '#include <Clpx.h>' : ignoré lors de la recherche d'une utilisation d'un en-tête précompilé
1> Ajoutez la directive à 'StdAfx.h' ou régénérez l'en-tête précompilé
1>test_class_Cplx.cpp(4): warning C4627: '#include <math.h>' : ignoré lors de la recherche d'une utilisation d'un en-tête précompilé
1> Ajoutez la directive à 'StdAfx.h' ou régénérez l'en-tête précompilé
1>test_class_Cplx.cpp(19): fatal error C1010: fin de fichier inattendue lors de la recherche d'un en-tête précompilé. N'auriez-vous pas oublié d'ajouter '#include "StdAfx.h"' à votre source ?
1> Génération de code en cours...
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
___________________________________
___________________________________
Apparement l'erreur est la meme pour les methodes dans le fichier .C mais je ne vois pas....
pour info j'utilise visual C++ 2010 express.
Désolé pour la longueur du post.
En esperant que vous puissiez m'aider .
«
class Cplx{
»
EPIC FAIL !
Dejà, tu fais du C++, donc nomme tes fichiers *.hpp / *.cpp.
Ensuite, remplace ton #define par quelque chose comme :
afin d'éviter un conflit dans les noms.
Enfin,
c'est TOUJOURS une erreur.
J'espère qu'avec tout ça ça ira un peu mieux déjà. ![]()
bonsoir
finalement une bonne partie de mes erreurs venaient du fait que je m'etait trompé en réecrivant le type des elements de la classe que je creais ( Clpx au lieu de Cplx) et surtout je faisais une erreur en créant le projet...enfin bref....
en tout cas merci pour ta reponse Chris_27, en effet le fait de mettre '#define __CPLX_HPP__ ' m'enleve une erreur que je ne comprenais pas du tout
sinon qu'entends tu par:
«
class Cplx{
»
EPIC FAIL !
parcequ'en effet parmis les quelques erreurs qui me restent:
==================================
1>------ Début de la génération : Projet : Cplx, Configuration : Debug Win32 ------
1> Cplx.cpp
1>Cplx.cpp(6): error C2011: 'Cplx' : redéfinition du type 'class'
1>
c:\users\mouyabi\desktop\cours\2010-2011\tp_info\t
p3\cplx\cplx\Cplx.h(6) : voir la déclaration de 'Cplx'
1>Cplx.cpp(65): fatal error C1004: fin de fichier inattendue rencontrée
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
=====================================
il y en a une qui me parle d'une redefinition de classe..... et j'ai bien l'impression que ca a un rapport direct avec ce que tu as noté
plus de precision serait chaleureusement acceuillie
merci encore ![]()
Mettre
ça revient à dire que dans toute la suite, il faudra remplacer les "Cplx" pas des "". Donc quand tu arrives à
"class Cplx{ "
ça devient
"class {"
ce qui va poser problème.
Bref… dans ton Fichier.C, tu as un :
public class Cplx {
…
}
qui n'est pas la bonne façon de faire. La partie :
class Cplx {
…
}
est déjà dans le Ficher.h, donc dans le Fichier.C il faut faire un truc genre :
// constructeur
Cplx::Cplx(float r, float i){
…
}
float Cplx::PartIm() {
return im;
}
etc.
PS: dans ton main.C, il y a un
« #include <Clpx.h> »
qui devrait être un
« #include "Clpx.h" »
je pense.
sorry de repondre aussi tard..j'etais encore dessus...
merci encore pour cette rapide reponse en effet ca marche mieu (bien que j'ai encore quelques pb
apres ca je me suis rendu compte que je faisais mal certains appels de fonctions (j'oubliais des '()' pour les fonctions n'ayant pas de parametres) et aussi que je redeclarais les methodes 'public' alors que c'etait deja fait dans le header....du coup cplx.cpp ==> checked!
ayant egalement modifié le truc de test plus de pb ![]()
merci pour ton aide
par contre ensuite j'ai d'autres pb
lors de la genération du code une liste d'erreur apparait
=====================================
1>------ Début de la génération : Projet : Cplx, Configuration : Debug Win32 ------
1> Cplx.cpp
1> Test_Cplx.cpp
1> Génération de code en cours...
1>Test_Cplx.obj : error LNK2028: jeton non résolu (0A00000B) "public: float __thiscall Cplx::PartIm(void)" (?PartIm@Cplx@@$$FQAEMXZ) référencé dans la fonction "int __cdecl main(void)" (?main@@$$HYAHXZ)
1>Cplx.obj : error LNK2028: jeton non résolu (0A000015) "public: float __thiscall Cplx::PartIm(void)" (?PartIm@Cplx@@$$FQAEMXZ) référencé dans la fonction "void __cdecl Conj(class Cplx)" (?Conj@@$$FYAXVCplx@@@Z)
1>Test_Cplx.obj : error LNK2028: jeton non résolu (0A00000C) "public: float __thiscall Cplx::PartReelle(void)" (?PartReelle@Cplx@@$$FQAEMXZ) référencé dans la fonction "int __cdecl main(void)" (?main@@$$HYAHXZ)
1>Cplx.obj : error LNK2028: jeton non résolu (0A000016) "public: float __thiscall Cplx::PartReelle(void)" (?PartReelle@Cplx@@$$FQAEMXZ) référencé dans la fonction "void __cdecl Conj(class Cplx)" (?Conj@@$$FYAXVCplx@@@Z)
1>Test_Cplx.obj : error LNK2028: jeton non résolu (0A000009) "public: void __thiscall Cplx::C_Somme_float(class Cplx,float)" (?C_Somme_float@Cplx@@$$FQAEXV1@M@Z) référencé dans la fonction "int __cdecl main(void)" (?main@@$$HYAHXZ)
1>Test_Cplx.obj : error LNK2028: jeton non résolu (0A00000A) "public: void __thiscall Cplx::Conj(class Cplx)" (?Conj@Cplx@@$$FQAEXV1@@Z) référencé dans la fonction "int __cdecl main(void)" (?main@@$$HYAHXZ)
1>Cplx.obj : error LNK2019: symbole externe non résolu "public: float __thiscall Cplx::PartIm(void)" (?PartIm@Cplx@@$$FQAEMXZ) référencé dans la fonction "void __cdecl Conj(class Cplx)" (?Conj@@$$FYAXVCplx@@@Z)
1>Test_Cplx.obj : error LNK2001: symbole externe non résolu "public: float __thiscall Cplx::PartIm(void)" (?PartIm@Cplx@@$$FQAEMXZ)
1>Cplx.obj : error LNK2019: symbole externe non résolu "public: float __thiscall Cplx::PartReelle(void)" (?PartReelle@Cplx@@$$FQAEMXZ) référencé dans la fonction "void __cdecl Conj(class Cplx)" (?Conj@@$$FYAXVCplx@@@Z)
1>Test_Cplx.obj : error LNK2001: symbole externe non résolu "public: float __thiscall Cplx::PartReelle(void)" (?PartReelle@Cplx@@$$FQAEMXZ)
1>Test_Cplx.obj : error LNK2019: symbole externe non résolu "public: void __thiscall Cplx::C_Somme_float(class Cplx,float)" (?C_Somme_float@Cplx@@$$FQAEXV1@M@Z) référencé dans la fonction "int __cdecl main(void)" (?main@@$$HYAHXZ)
1>Test_Cplx.obj : error LNK2019: symbole externe non résolu "public: void __thiscall Cplx::Conj(class Cplx)" (?Conj@Cplx@@$$FQAEXV1@@Z) référencé dans la fonction "int __cdecl main(void)" (?main@@$$HYAHXZ)
1>C:\Users\MOUYABI\Desktop\cours\2010-2011\TP_Info
\TP3\Cplx\Debug\Cplx.dll : fatal error LNK1120: 10 externes non résolus
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
====================================
et la,je ne vois pas du tout de quoi il peut s'agir...
Une aide serait bien entendu la bienvenue
merci encore d'avoir repondu a mes interogations jusque la ![]()
peut tu nous redonner le code bien indenter sur un wall (comme pastebin.com) ?
Une erreur de linker, le plus souvent cela est dû au fait que certaines méthodes déclarées dans tes headers n'ont pas d'implémentations correspondantes.
Vérifie bien la syntaxe de tes déclarations comme le suggère Chris dans son message précédent.
Suite à la demande de 'godrik' les liens ci-dessous renvoient aux codes:
header Cplx.h
http://pastebin.com/tp9R080v
Cplx.cpp
http://pastebin.com/F33gnM9K
Test_Cplx.cpp
http://pastebin.com/ER7zksnX
la dessus j'ai pour l'instant enelvé les #include <iostream> et #include <cmath>
=======================================
skip
je suis sur de comprendre tout a fait ce que tu veux dire par la
par implementation correspondante à ce qui est declaré dans le header tu entends que j'ai pu ne pas respecter les parametres d'entrées de la methode et le type en sortie de la methode?
ou alors parles tu des operations qui y sont effectuées?
ou encore autre chose?
pour les types de sortie et les parametres je les ai verifiés et surtout lorsqu'il y avait un probleme lors du debug avant le debut de la generation du code ca me le disait. et comme la ca n'est plus le cas je ne pense pas que ce soit ca.pareil pour la construction des methodes.
Ligne 16 :
float PartReelle(){
float Cplx::PartReelle(){
Même remarque pour les lignes 21, 27, 32, etc.
Merci je vais modifier ca une fois de retour chez moi ![]()
Une question cependant. Ca signifie quoi le fait de l'ecrire comme ca? Histoire que je comprenne un peu ce que j'ecris
et que je sache quoi faire pour les prochaines fois ![]()
Et merci encore pour vos reponses ![]()
Ça signifie que tu définis la méthode PartReelle *** de la classe Cplx ***.
Sans le "Cplx::", le compilateur ne peux pas deviner que ton bout de code est lié à ta classe Cplx (et de fait, tu pourrais très bien avoir une fonction "PartReelle" qui n'a rien à voir avec Cplx).
Merci, mais dans ce cas ne faudrait il pas le faire avec toutes les methodes?
Bien sûr, il faut faire ça pour toutes les méthodes définies dans ton .C :
« Même remarque pour les lignes 21, 27, 32, etc. »
sorry je n'avais pas fait attention au 'ect' du coup je pensais que tu ne me le disais que pour les 4lignes mentionnées
en tout cas je vous tiens au courant de l'evolution une fois que je testerai ces modifications
merci encore.
cette fois plus de probleme de generation
par contre une fenetre me dit qu'il est impossible de demarrer le programme....
http://img193.imageshack.us/img193/3227/imageerreur.png
zoom
http://img585.imageshack..us/img585/5553/zoomerreur.png
Cette fois, moi je ne peux absolument rien pour toi. C'est un problème de Windows, pas un problème de C++… ![]()
Non, là le truc c'est qu'il a compilé son code comme une bibliothèque de classe, ce qui lui donne une .dll au lieu d'un .exe
Si, c'est un problème de Windows
J'ai jamais réussi à produire de .dll sous Unix perso. ![]()
T'as commis l'erreur de base de tous les anti-windows : accuser l'OS avant de chercher ailleurs.
T'as surement eu beaucoup de peine à exécuter directement un .so aussi? Ce sont les options de compilation ou le type de projet qui n'est pas le bon. Ca n'a rien à voir avec l'OS.
PS: Le début du message c'était pour rire hein... ![]()
_skip
ca doit etre ca
en fait je me suis dit que comme je testais une classe il fallait que je la crée comme une biblio de classe
je vais essayer de creer un projet vierge dans ce cas et voir ce que ca donne
merci encore a tous pour votre soutien ![]()