IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Questions en vrac: librairie std,objet cout.


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    104
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Par d�faut Questions en vrac: librairie std,objet cout.
    Bonjour,


    Je ne comprends pas bien ce qu'est la "standard library".

    1) Apperement on recommende de toujurs �crire std::cout, au lieux de mettre en d�but: include namespace.... Si j'ai bien compris cout est un objet de la librairie standard que l'on peut utiliser seuleement gr�ace au fichier d'ent�te iostream. Dans le cas o� l'utilisateur d�fiit lui m�me une fonction/objet cout (donc un homonyme), on doit pr�ciser si n utilise celui de iostream ou celui de l'utilisateur (d'o� le besoin de pr�ciser std (celui d�finit par la librairie standard). Ai je bien compris ?

    2)Je ne comprens pas les chevrns << apr�s cout. Il semble qu'il s'agisse d'"op�rateurs" ( unpeu comme l' addition + qui est un "op�rateur binaire" puisqu'il agit sur deux variables). std::cout << signifie t il que << est un op�rateur unaire qui agit � droite de l'objet cout (qui est donc l'op�rande)?

    3) Si je retourne 1 au lieu de 0 dans le main est ce un soucis ? car c'est bin un entier donc �a semble logique aussi

    4)Qu 'est ce que le "core language" ? d'apr�sle bouquin que je suis (accelerated c++, que je compl�te ave c++ for mathematicians et c++ par la pratique, j'esp�re que ce sont de bonnes r�ferences) il est mentionn�e que le "core language est disponible sur tous les programme c++". Je ne comprends pas bien ce que ca signifie...

  2. #2
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    104
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Par d�faut
    5) Apperement on distingue:
    - les "expressions" comme qui 'compute' quelquechose (un r�sultat et peuvent avoir un "side effect" � l' �cran). Apperement c'est compos� d'op�rateurs (op�rateurs math�matiques usuels, chevrons <<,...) [on pourrait les remplacer par des fonctions], et op�randes (variables x,donn�e comme le chiffre 1, objet) .
    Tous les op�randes ont un type: l'objet cout est de type ostream, 1 est de type int.... Un type

  3. #3
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Bonnes questions.

    C++ est un langage.

    Comme tout langage il requiert un vocabulaire minimal (que j'appelle primitif), c'est l'ensemble des mots-cl�s, des types primitifs et des op�rateurs agissant sur ceux-ci.
    La norme (qui est aussi un trait� ) d�finit la syntaxe et la grammaire de ce langage.
    Le langage fournit ainsi plusieurs moyens pour �tendre le vocabulaire.

    La norme pr�voit aussi un vocabulaire de base, qui est la biblioth�que standard. (et pas librairie)
    Il s'agit d'un ensemble de choses d�finies au moyen du langage.
    Par exemple, le code de std::string est int�gralement disponible dans <string> (et ses inclusions).



    Le namespace est un outil qui permet de regrouper diverses choses sous un certain pr�fixe.
    Comme tu l'as assez bien d�crit, std::cout est une variable (cout) d�clar�e dans le namespace std.

    using permet d'importer des noms dans un namespace commun (au domaine d'origine du nom et le domaine courant).

    1) ton analyse est la bonne, les espaces de noms permettent de limiter les cas d'interf�rence entre les biblioth�ques.
    Concernant la recommandation, la posture normale est:
    Aucun using namespace dans un en-t�te (un header, .h ou .hpp)
    Cela, parce que ce using sera inclus sans le savoir par tout code qui utiliserait l'en-t�te.

    Par contre, un using sur un type particulier (comme using std::vector) peut appara�tre dans la d�claration d'une classe.

    Pour les fichiers d'impl�mentation, c'est � toi de voir.
    Dans l'impl�mentation d'un vecteur (au sens math�matique), je n'utiliserais certainement pas using std::vector, mais dans d'autre cas, pourquoi pas.

    2) << est initialement un op�rateur binaire, qui calcule un d�calage � gauche (left shift).
    Ainsi, 2 << 3 vaut 16, car 2 s'�crit 0000000010 et qu'en d�calant les bits de 3 vers la gauche, on obtient 0000010000.

    Le mod�le de classe std::basic_ostream<...> (dont h�rite la classe dont std::cout est un objet) surcharge cet op�rateur.
    Ainsi, std::basic_ostream<...>::operator<<(double) est une fonction membre.

    L'un des moyens d'�tendre le vocabulaire du C++ est justement de surcharger les op�rateurs pour certaines classes.
    Par exemple, les classes std::vector et std::map surchargent l'op�rateur [] (chacune � sa fa�on).

    3) la valeur de retour de main est (ou n'est pas, la norme ne l'impose pas) utilis� comme code d'ex�cution du programme.
    Comme a priori il n'y a qu'une mani�re de r�ussir et plein de se tromper, la coutume veut qu'on utilise 0 pour la r�ussite du programme et tous les autres entiers pour les erreurs.
    Ca n'emp�che pas que ton programme fait bien ce qu'il veut avant de retourner.

    Concr�tement, pour le C++, tu peux retourner la valeur qu'il te plait.
    Voire m�me, il est possible pour la fonction main (et uniquement celle-ci) de ne pas faire de return explicitement, car il sera ajout� en cas de besoin par la compilation.
    Dans ce cas particulier, je ne sais plus ce que C++ demande ou sugg�re comme valeur. J'imagine cependant que ce sera 0.

    4) Le "core language" ou "langage pur", c'est le langage sans sa biblioth�que standard.
    Il s'agit du vocabulaire primitif et de la grammaire.
    Pour r�sumer succintement, c'est ce qui est disponible sans utiliser #include.


    5) une instruction est ex�cut�e. une expression est une op�ration produisant une valeur.
    Il existe trois grands genres d'instructions:
    les d�clarations: un type, un nom et �ventuellement une valeur (int a = 2; ou int f(int i) {return 2*i})
    les instructions-expressions: c'est � dire une expression suivie d'un point-virgule.
    les instructions de controle comme if ou while.

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    104
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Par d�faut
    Merci pour ces r�ponses pr�cises et tr�s instructives.
    6) Je ne coprends pas bien cette portion de cour:
    "The input operation has another side effect: It causes our prompt, which asks for the user's
    name, to appear on the computer's output device. In general, the input-output library saves
    its output in an internal data structure called a buffer, which it uses to optimize output
    operations. Most systems take a significant amount of time to write characters to an output
    device, regardless of how many characters there are to write. To avoid the overhead of
    writing in response to each output request, the library uses the buffer to accumulate the
    characters to be written, and flushes the buffer, by writing its contents to the output
    device, only when necessary. By doing so, it can combine several output operations into a
    single write."

  5. #5
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    En gros y'a un buffer interne pour pas avoir � faire un flush � chaque fois vers la sortie, op�ration longue. Et tu flush tout une fois � la fin.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  6. #6
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Voici une version imag�e:
    Le processeur est � quelques centim�tres de la RAM.
    Le processeur est � environ un m�tre de l'utilisateur (plus, en longueur de fil).
    Il est donc a priori cent fois plus rapide d'acc�der � un bloc m�moire qu'� l'utilisateur.

    Partant de ce constat, les affichages et saisies sont faites au travers d'un bloc m�moire interne (un buffer) de la mani�re suivante:
    • En sortie: On �crit quand on veut, l'OS l'affiche quand il peut, et quand on l'exige, on peut s'arreter pour attendre que l'ordinateur l'affiche (flush the buffer)
    • En lecture: L'utilisateur quand il veut, l'OS nous le transmet quand il le veut, nous, on l'attendra.


    C'est tr�s imag�, � moiti� faux, mais ca explique le probl�me.
    En r�alit�, le probl�me, c'est de convertir un caract�re en pixels � l'�cran.
    Et c'est d'autant plus difficile que l'interface graphique est puissante.

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    104
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Par d�faut
    Je suis d�sol� mais j'ai du mal � bien comprendre...
    Si je combine vos deux r�pnses (enfin ce que j'en comprends): on veut limiter les "flushs" qui prennent trop de temps. Pour cel� on va essayer d'optimiser l'utilisation du buffeur lors des ecritures/lectures.

    Pour bien expliquer l' ensemble du prbl�me voici le paragraphe complet:

    "The input operation has another side effect: It causes our prompt, which asks for the user's
    name, to appear on the computer's output device. In general, the input-output library saves
    its output in an internal data structure called a buffer, which it uses to optimize output
    operations. Most systems take a significant amount of time to write characters to an output
    device, regardless of how many characters there are to write. To avoid the overhead of
    writing in response to each output request, the library uses the buffer to accumulate the
    characters to be written, and flushes the buffer, by writing its contents to the output
    device, only when necessary. By doing so, it can combine several output operations into a
    single write.

    There are three events that cause the system to flush the buffer. First, the buffer might be
    full, in which case the library will flush it automatically. Second, the library might be asked
    to read from the standard input stream. In that case, the library immediately flushes the
    output buffer without waiting for the buffer to become full. The third occasion for flushing
    the buffer is when we explicitly say to do so.

    When our program writes its prompt to cout , that output goes into the buffer associated
    with the standard output stream. Next, we attempt to read from cin . This read flushes the
    cout buffer, so we are assured that our user will see the prompt.

    Our next statement, which generates the output, explicitly instructs the library to flush the
    buffer. That statement is only slightly more complicated than the one that wrote the prompt.
    Here we write the string literal "Hello, " followed by the value of the string variablename , and finally by std::endl . Writing the value of std::endl ends the line of output,and then flushes the buffer, which forces the system to write to the output stream
    immediately.

    Flushing output buffers at opportune moments is an important habit when you are writing
    programs that might take a long time to run. Otherwise, some of the program's output
    might languish in the system's buffers for a long time between when your program writes it
    and when you see it"
    Moi j' en comprends :
    - A chaque cout le tampn se vide au moment ou le texte s'affiche sur l' �cran
    - Lors d'un cin, l� je ne sais pas trop... Car il faut le temps au pc de lire ce qui est tap� puis de le stoker dans une variable....

    7) Quel diff�rence entre char et string ? Ce sont �videment deux types diff�rents, mais char ne repr�sente t'il qu'un seul caract�re alors que string est une suite de caract�res ?

  8. #8
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    char est un caract�re unique, c'est aussi un type primitif.
    char* est un pointeur de char, c'est aussi le type utilis� en C r�f�rer � une suite continue de char, termin�e par un '\0' qui est le caract�re nul.
    std::string est une classe standard garantissant de ne pas faire de b�tise avec la m�moire (sauf � le faire expr�s).

    Pour les deux buffers, en gros, il permettent de ne pas payer le co�t d'acc�s � l'�cran/le clavier pour � chaque fois.

    Par exemple, si ton programme contient ceci:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    std::cout << "veuillez saisir trois nombre " << std::endl;
    int a, b, c;
    std::cin >> a >> b >> c;
    Alors � l'ex�cution, apr�s l'affichage, l'utilisateur est attendu.
    Il peut par exemple taper ceci: "1 2<entr�e>3"

    cin >> a >> b >> c; est �valu� ainsi:
    • cin >> a qui retourne (une r�f�rence sur) cin
    • cin >> b qui retourne cin
    • cin >> c qui retourne cin
    • puis rien de plus, car on arrive au point-virgule. C'est un exemple d'instruction-expression. Seul ses effets de bord sont int�ressant, car la valeur est abandonn�e.


    la premi�re partie s'arr�te jusqu'� ce que le buffer soit assez rempli.
    Concr�tement, l'OS va attendre jusqu'� ce que l'utilisateur appuie sur <entr�e> ou provoque une fin de fichier (EOF, Ctrl+D avec un linux).

    voici ce qui se passe:
    avant l'�tape 1: a, b et c valent "random: m�moire non initialis�e", le buffer est vide.
    durant l'�tape 1:
    le buffer �tant vide, le programme rend la main � l'OS
    l'utilisateur commence � taper. En appuyant sur la touche <entr�e>, il signale � l'OS que le buffer est assez rempli.
    le buffer contient "1 2\n"
    cin parvient � lire un int, qu'il retire du buffer, et assigne 1 � a.
    le buffer contient finalement " 2\n"

    �tape 2:
    le buffer n'est pas vide, cin cherchant un int, il saute les �ventuels caract�res blancs (espace, tab, \n ...), arrivant devant 2.
    Il lit cet int, et l'affecte � b (2).
    le buffer contient "\n".

    �tape 3:
    le buffer n'est pas vide, cin cherchant un int, il saute les �ventuels caract�res blancs (espace, tab, \n ...), vidant ainsi le buffer.
    le programme rend la main � l'OS, qui continue alors � �couter l'utilisateur.
    celui-ci finit sa saisie: "3"
    tant qu'il n'a pas appuy� sur <entr�e> ou provoqu� une fin de fichier, l'OS attend sagement.

    Voila pour la m�canique du buffer d'entr�e.
    Si au lieu de saisir "3", l'utilisateur appuie de suite sur <entr�e>, cin ne trouve rien � lire, mais comme il n'est pas sur un cas d'erreur, il demande encore la suite � l'OS.
    Enfin, si l'utilisateur ne saisi toujours pas de nombre, mais provoque enfin une fin de fichier, cin ne donnera pas de valeur � c, mais se marquera en erreur.

    chose que tu pourras v�rifier avec if(cin), voire meme avec une instruction combin�e:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    if (!(cin>>c)) {
        cout << "le troisième nombre n'a pas été lu" << endl;
    }
    C'est pr�cis�ment ce qu'on fait quand on lit un fichier.

Discussions similaires

  1. [VBA-E] Questions en Vrac...
    Par Pouic dans le forum Macros et VBA Excel
    R�ponses: 6
    Dernier message: 08/02/2006, 13h50
  2. [FLASH 8] Question sur la port�e des objets.
    Par i_shinji dans le forum Flash
    R�ponses: 1
    Dernier message: 02/11/2005, 17h18
  3. Question sur les librairies .lib
    Par elvivo dans le forum Autres �diteurs
    R�ponses: 5
    Dernier message: 05/10/2005, 20h06
  4. R�ponses: 3
    Dernier message: 13/08/2004, 18h52
  5. question de d�butant sur les objets
    Par boucher_emilie dans le forum ASP
    R�ponses: 3
    Dernier message: 06/08/2004, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo