Partage
  • Partager sur Facebook
  • Partager sur Twitter

une erreur que code block émet et que je ne comprend pas.

Sujet résolu
15 juillet 2007 à 19:05:00

Bonsoir,
Je cré un compte à rebours avec une classe (pour m'entrainer).
Mais lorsque je compile sous code::blocks, j'ai des erreur, il me dit que les fonctions ne sont pas déclarées or ceci n'est pas vrai car j'y ai inclu les bibliothèque concerné (dont une pour sleep(1); ).

Les erreurs retounées:



Project   : Console application
Compiler  : GNU GCC Compiler (called directly)
Directory : D:Documents and SettingsPropriétaireMes documentsprogramme test C-C++test code C++projet 02
--------------------------------------------------------------------------------
Switching to target: default
Compiling: rebours.cpp
rebours.cpp: In member function `void Rebours::decompte(int&)':
rebours.cpp:17: error: `sleep' undeclared (first use this function)
rebours.cpp:17: error: (Each undeclared identifier is reported only once for each function it appears in.)
rebours.cpp:19: error: `cout' undeclared (first use this function)
rebours.cpp:19: error: `endl' undeclared (first use this function)
rebours.cpp: In member function `void Rebours::pause(int&, int)':
rebours.cpp:27: error: `cout' undeclared (first use this function)
rebours.cpp:27: error: `endl' undeclared (first use this function)
rebours.cpp: In member function `void Rebours::stop()':
rebours.cpp:45: error: `cout' undeclared (first use this function)
rebours.cpp:45: error: `endl' undeclared (first use this function)
Process terminated with status 1 (0 minutes, 0 seconds)



Voici le code:

rebours.h



/*
rebours.h
---------
Prototype

*/


#ifndef DEF_REBOURS
#define DEF_REBOURS

class Rebours
{
    public:

    void decompte(int &temps);
    void pause(int &temps, int oui);
    void repart(int &m_oui, int &m_tempsPause);
    void stop();

    private:

    int m_tempsDepart, m_oui, m_tempsPause;

};

#endif
 


rebours.cpp



/*
rebours.cpp
-----------
Class faisant le compte à rebours (pose, départ, stop...)
*/


#include <iostream>
#include <unistd.h>
#include "rebours.h"

void Rebours::decompte(int &temps)
{
    m_tempsDepart = temps;

    for(int i = 0; i <= m_tempsDepart; i++) //  temps que i ne dépasse pas le temps de départ on décrémente temps
    {
        sleep(1);   //   "endormissement" du programme pendant une seconde
        temps--;    //  on retire -1 à chaque tour de la boucle
        cout << temps << endl;  //  on affiche ce qu'il se passe
    }
}

void Rebours::pause(int &temps, int oui)
{
    m_oui = oui;

    cout << "Pause..." << endl;

    while(m_oui)
    {
        m_tempsPause = temps;
    }

    cout << "Repart.." << endl;
}

void Rebours::repart(int &m_oui, int &m_tempsPause)
{
    m_oui = 0;
    decompte(m_tempsPause);
}

void Rebours::stop()
{
    cout << "Vous avez arrete le compte à rebourg." << endl;
}
 


main.cpp


#include <iostream>
#include "rebours.h"

unsing namespace std;

int main(void)
{
    Rebours temps = 0;

    cout << "Entrez le temps en seconde : ";
    cin >> temps;
    cout << endl;

    temps.decompte(temps);

        return 0;
}
 


Désolé de "balancer" tout le code mais je pense que c'est nessécaire ;) .

Merci de votre aide :) .
  • Partager sur Facebook
  • Partager sur Twitter
:)
15 juillet 2007 à 19:17:49

Salut .

Je ne peux pas répondre à ton message , mais si tu veux de l'aide, ordonne le . Mets des interlignes, fais des paragraphes . Pour mettre ton code , utilise la liste de séléction du code dans le menu d'edition , tout à gauche .

printf("Ca : ");


C'est mieux que ca .

Cordialement ,Arvel .
  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2007 à 19:22:06

Désolé mais le parsage ne s'effectu pas j'ai déjà tenté d'édité plusieurs fois sans succès.
Je l'ai signalé:
http://www.siteduzero.com/forum-83-167855-1537981-poste-de-message-le-parsage-n-est-plus-effectue.html#r1537981

je ne peux pas mettre le code car en faite c'est dès que je le met que tout beug :(
  • Partager sur Facebook
  • Partager sur Twitter
:)
16 juillet 2007 à 12:05:09

si ca bug, alors je vais afficher ton code (meme si cette erreur est tres etrange :o )

Project : Console application Compiler : GNU GCC Compiler (called directly) Directory : D:Documents and SettingsPropriétaireMes documentsprogramme test C-C++test code C++projet 02 -------------------------------------------------------------------------------- Switching to target: default Compiling: rebours.cpp rebours.cpp:
In member function `void Rebours::decompte(int&)':
 rebours.cpp:17: error: `sleep'
undeclared (first use this function) rebours.cpp:17: error:
 (Each undeclared identifier is reported only once for each function it appears in.)
 rebours.cpp:19: error: `cout' undeclared (first use this function) rebours.cpp:19: error: `endl' undeclared (first use this function) rebours.cpp: In member function `void Rebours::pause(int&, int)': rebours.cpp:27: error: `cout' undeclared (first use this function) rebours.cpp:27: error: `endl' undeclared (first use this function) rebours.cpp: In member function `void Rebours::stop()': rebours.cpp:45: error: `cout' undeclared (first use this function) rebours.cpp:45: error: `endl' undeclared (first use this function) Process terminated with status 1 (0 minutes, 0 seconds) 


c'est etrage la balises <code type="console"> ne semble pas marcher .

à vu d'oeil tu aurais oublié de mettre using namespace std;
ou tu n'as pas inclus <iostream>


essaie pour voir ;)
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 1:17:36

Merci à toi neuneutrinos, mais il y a une dernière chose
j'utilise la fonction sleep(); de la bibliothèque #include <unistd.h>
mais code::blocks me dis que la fonction est pas définie..

rebours.h


/*
rebours.h
---------
Prototype

*/


#ifndef DEF_REBOURS
#define DEF_REBOURS

#include <iostream>
#include <unistd.h>

class Rebours
{
    public:

    void decompte(int &temps);
    void pause(int &temps, int oui);
    void repart(int &m_oui, int &m_tempsPause);
    void stop();

    private:

    int m_tempsDepart, m_oui, m_tempsPause;

};

#endif


 


rebours.cpp


#include <iostream>
#include <limits>

#include "rebours.h"

using namespace std;

int main(void)
{
    Rebours temps = 0;

    cout << "Entrez le temps en seconde : ";
    cin >> temps;
    cout << endl;

    temps.decompte(temps);

    cout << "Appuyez sur entrée pour continuer...";
    cin.ignore( numeric_limits<streamsize>::max(), '\n' );
        return 0;
}
 



Merci de ton aide! ;)
  • Partager sur Facebook
  • Partager sur Twitter
:)
17 juillet 2007 à 9:09:22

C'est quoi unistd.h ?

Si c'est toi qui l'a programmé, mets des "", sinon il est bien possible que tu aies oublié de linker cette bibliothèque.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
17 juillet 2007 à 9:29:35

Regarde si unistd.h est dans le dossier des include de MinGW.
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 14:23:49

unistd.h est une bibliothèque standars:
Plus d'info

J'ai quand même vérifier dans les includes de code::blocks et elle y est bien.

Voila en espérant que cela pourra vous aider a me faire comprendre le problème.
Merci (je cherche toujours, ne croyez pas que je glande lol)
;)
  • Partager sur Facebook
  • Partager sur Twitter
:)
17 juillet 2007 à 14:28:38

Sous linux,ça marche (il faut dire que c'est l'un des plus important en-tête sous Linux:) ).
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 14:30:24

En faite c'est code blocks qui me dit que cette fonction n'est pas déclaré.
  • Partager sur Facebook
  • Partager sur Twitter
:)
17 juillet 2007 à 14:39:58

l'implémentation de ta classe stp :)
je pense que tu as un problème de namespace dans le fichier d'implémentation.
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 14:43:42


rebours.h


/*
rebours.h
---------
Prototype

*/


#ifndef DEF_REBOURS
#define DEF_REBOURS

#include <iostream>
#include <unistd.h>

class Rebours
{
    public:

    void decompte(int &temps);
    void pause(int &temps, int oui);
    void repart(int &m_oui, int &m_tempsPause);
    void stop();

    private:

    int m_tempsDepart, m_oui, m_tempsPause;

};

#endif
 


rebours.cpp



/*
rebours.cpp
-----------
Class faisant le compte à rebours (pose, départ, stop...)
*/


#include "rebours.h"

using namespace std;

void Rebours::decompte(int &temps)
{
    m_tempsDepart = temps;

    for(int i = 0; i <= m_tempsDepart; i++) //  temps que i ne dépasse pas le temps de départ on décrémente temps
    {
        sleep(1);   //   "endormissement" du programme pendant une seconde
        temps--;    //  on retire -1 à chaque tour de la boucle
        cout << temps << endl;  //  on affiche ce qu'il se passe
    }
}

void Rebours::pause(int &temps, int oui)
{
    m_oui = oui;

    cout << "Pause..." << endl;

    while(m_oui)
    {
        m_tempsPause = temps;
    }

    cout << "Repart.." << endl;
}

void Rebours::repart(int &m_oui, int &m_tempsPause)
{
    m_oui = 0;
    decompte(m_tempsPause);
}

void Rebours::stop()
{
    cout << "Vous avez arrete le compte à rebourg." << endl;
}
 


main.cpp


#include <iostream>
#include <limits>

#include "rebours.h"

using namespace std;

int main(void)
{
    Rebours temps = 0;

    cout << "Entrez le temps en seconde : ";
    cin >> temps;
    cout << endl;

    temps.decompte(temps);

    cout << "Appuyez sur entrée pour continuer...";
    cin.ignore( numeric_limits<streamsize>::max(), '\n' );
        return 0;
}
 



Voila :)
  • Partager sur Facebook
  • Partager sur Twitter
:)
17 juillet 2007 à 14:50:26

il faut que tu inclues unistd.h dans main.cpp :)
Ça peut faire une jolie boucle infinie...
void Rebours::pause(int &temps, int oui)
{
    m_oui = oui;

    cout << "Pause..." << endl;

    while(m_oui)
    {
        m_tempsPause = temps;
    }

    cout << "Repart.." << endl;
}
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 14:53:14

Citation : altic


Ça peut faire une jolie boucle infinie...

void Rebours::pause(int &temps, int oui)
{
    m_oui = oui;

    cout << "Pause..." << endl;

    while(m_oui)
    {
        m_tempsPause = temps;
    }

    cout << "Repart.." << endl;
}
J'ai penser que la méthode repart arreterais cette boucle grace à la variable &m_oui qui elle serais modifier a 0 .

Mais je m'embrouille et ne comprend pas comment je pourrai faire pour que m_oui soit mis à 0.
J'utiliserai bien les pointeur du langage C mais je ne trouve pas ça super propre.

Pourquoi réinclure cette bibliothèque alors que je l'ai déjà inclus dans rebours.h qui est inclu dans main.cpp et rebours.cpp?

Voilà.
Merci de ton aide! :)
  • Partager sur Facebook
  • Partager sur Twitter
:)
17 juillet 2007 à 14:58:35

pourtant tu as l'air de maîtriser les références ^^.
C'est parce que le compilateur à besoin des déclarations (complètes) pour compiler en fichiers objets et ensuite linker.
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 15:07:04

Citation : altic

C'est parce que le compilateur à besoin des déclarations (complètes) pour compiler en fichiers objets et ensuite linker.



Je ne comprend pas.

Sinon j'ai inclu unistd.h au main.cpp mais toujours la fonction est inconu :( bizzard code::blocks..

Dernière question dans ce poste ( :p )
Sur quel site peut-on apprendre plus en profondeur le c et le c++?
Car la je fais de l'entraînement (compte à rebours) mais mon but finale est de créer un logiciel de traitement de texte comme bloc-notes au début et après je le ferais évoluer. Je pense utiliser QT pour librairie d'aide.

Merci de ton aide :)
  • Partager sur Facebook
  • Partager sur Twitter
:)
17 juillet 2007 à 15:08:36

tu programmes sous windows à ce que je vois, unistd.h c'est en linux

sous windows on fait :
#include <windows.h>
//... et la fonction s'appel comme cela
Sleep( 1000 );


attention c'est des millisecondes
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 15:11:26

Moi je voudrais que cette fonction soit pour tous les OS. Donc devrais-je la reproduire?
Si oui je ne vois pas du tout comment faire..
  • Partager sur Facebook
  • Partager sur Twitter
:)
17 juillet 2007 à 15:26:34

cette fonction existe sous windoxs.
voici son contenu...
/*
 * This file is part of the Mingw32 package.
 *
 * unistd.h maps (roughly) to io.h
 */


#ifndef _UNISTD_H
#define _UNISTD_H

#include <io.h>
#include <process.h>

#define __UNISTD_GETOPT__
#include <getopt.h>
#undef __UNISTD_GETOPT__

#ifdef __cplusplus
extern "C" {
#endif

/* This is defined as a real library function to allow autoconf
   to verify its existence. */

int ftruncate(int, off_t);
__CRT_INLINE int ftruncate(int __fd, off_t __length)
{
  return _chsize (__fd, __length);
}

#ifdef __cplusplus
}
#endif

#endif /* _UNISTD_H */
 


j'ai chercher dans toutes les includes mais cete fonction n'existe pas ou n'est pas définit dans cette fonction :o

et le raccourcit ctrl+click gauche ne marche pas sur cette fonction(ce reccourcit ouvre le fichier ou la define ou la fonction est defini)
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 15:27:01

La fonction n'a peut-être pa été portée sur windows...
Tu peux utiliser Sleep() et utiliser des typedef.
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 16:02:40

Tu pourrais déveloper stp car je l'ai déjà vu cette histoire mais je ne me souviens plus.
:)
  • Partager sur Facebook
  • Partager sur Twitter
:)
17 juillet 2007 à 16:42:21

par exemple pour inclure un en-tête différend selon si tu es sous windows ou Linux et changer le nom de la fonctiontu fais:

#ifdef WIN32
#include <windows.h>

#ifdef linux
#include <unistd.h>
#define Sleep(param) sleep(param)

#endif
 

enfin je crois (à confirmer par un pro du préprocesseur) :)
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 16:52:44

remplacer sleep(param) par Sleep(param)
l'utilité de la défine n'est pas flagrante ^^

il serait plus propre de mettre
#ifdef WIN32
#include <windows.h>

#elif linux
#include <unistd.h>
#define Sleep(param) sleep(param)

#endif
 



  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 17:04:55

Je crois que ceci ne fonctionne que lorsqu' on compile , non?
  • Partager sur Facebook
  • Partager sur Twitter
:)
17 juillet 2007 à 17:07:28

Bien sûr mais comme t es obligé de compiler -> ca va marcher :p
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
17 juillet 2007 à 18:20:43

j'ai une new erreur qui est apparu:

Citation

main.cpp:10: error: conversion from `int' to non-scalar type `Rebours' requested
main.cpp:13: error: no match for 'operator>>' in 'std::cin >> temps'



La ligne en défaut:

    Rebours temps = 0;


J'ai fais une erreur????? franchement je n'y comprend rien lol
La je ne vois pas..
  • Partager sur Facebook
  • Partager sur Twitter
:)
17 juillet 2007 à 18:27:46

Et bien, le compilateur te dit qu'il ne sait pas comment passer de cin au type "Rebours", car tu n'as définit aucun opérateur ">>" entre les deux. Regarde cette partie du tuto de m@teo, tu comprendras mieux je pense (même s'il explique la chose pour un cout, mais tu devrais pouvoir adapter ça pour ton cin ;) ) :

http://www.siteduzero.com/tuto-3-16681-1-la-surcharge-d-operateurs.html#ss_part_5
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2007 à 18:29:15

trois fois rien ^^ tu compare un type rebour à un type long/int ^^

soit tu surcharges les operateurs :lol:

soit tu ecris rebour temps(0);//grace au constructeur rebour::rebour(long temps); que tu creeras (au lieux de temps fait ce que tu veux ^^ )
 


c'est assez clair :o
  • Partager sur Facebook
  • Partager sur Twitter