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 :

problème avec constructeur


Sujet :

C++

  1. #21
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par matlab_ Voir le message
    je voulais dire: je trouve ça curieux, j'ai modifié mon précédent post.

    merci

    Si je comprends, c'est donc ld qui crée le fichier -o ? et g++ appelle ld ?
    Citation Envoyé par white_tentacle Voir le message
    C’est bien cela.

    L’avantage est que g++ t’ajoutes automatiquement toutes les librairies standard c++ quand il appelle ld, t’évitant de le faire toi-même.
    White, tu as sans doute mal lu.. l'option -o se contente d'indiquer le non du fichier de sortie

    En fait, il faut comprendre la chaine de compilation :

    La première chose qui est faite par g++ est d'appeler le préprocesseur (cpp dans cette chaine de travail) qui va passer chaque fichier en revue à la recherche des différentes directives préprocesseur.

    Tu peux avoir un aperçu du résultat avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -c fichier.cpp  -o fichier.pre -E
    (comme il n'existe pas d'extension pour les fichiers préprocessés, l'extension pre semble pas si mal )

    Si tu ouvres ce fichier, attention les yeux, un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <iostream>
    int main()
    {
    	std::cout<<"hello world"<<std::endl;
    	return 0;
     
    }
    se traduit en 15800 lignes de code à cause des inclusions indirectes

    La deuxième étape est celle de la génération de code assembleur.
    tu peux te faire une idée du résultat avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -c fichier.cpp  -o fichier.s -S
    Je ne sais plus exactement quel est le backend utilisé dans le cas d'un code C++, mais il n'est pas exclu que ce soit le travail de g++ lui-meme

    Vient ensuite l'appel à as pour générer le code "objet" au départ du code assembleur

    Le résultat obtenu n'est plus "lisible par un humain" car le code est composé des instructions que le processeur va lui-même utiliser
    C'est ce que tu obtiens avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -c fichier.cpp -o fichier.o
    Enfin vient l'étape de l'édition de liens, qui correspond à la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ fichier1.o fichier2.o fichier3.o -o application.exe
    G++ fait alors appel à l'éditeur de liens (ld) pour générer l'exécutable final.

    Son rôle sera de remplacer les différents symboles correspondant aux appels de fonctions par les adresses auxquelles ces fonctions se trouvent réellement en mémoire

    On peut aussi parfaitement envisager de générer directement l'exécutable (donc en utilisant des pipes au lieu de fichier *.o) avec une commande proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++  fichier1.cpp fichier2.cpp fichier3.cpp -o application.exe
    Evidemment, cette manière de travailler devient assez vite fastidieuse dans le contexte d'un projet important, peut etre subdivisé en un nombre important de sous bibliothèques, composé d'une arborescence complexe ou susceptible d'avoir un certain nombre de définitions de symboles pour modifier le comportement à la compilation.

    C'est la raison pour laquelle on préfère généralement utiliser un système qui permet d'automatiser la chaine de compilation

    NOTA:
    Cela correspond aux étapes "logiques" de compilation, cependant, le fait d'appeler la commande g++ -c fichier.cpp -o fichier.o va en fait utiliser des pipes pour passer les différentes étapes (et je ne suis même pas sur qu'il devra effectivement passer par une étape en code assembleur )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Points : 30
    Points
    30
    Par défaut question corrigé examen
    Bonjour dans le corrigé de cet exam. joint en pdf,

    page 3/4

    question 2 :

    voici la question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int *i = new int[6]; //Question i
    A la suite de cette ligne, on peut écrire   F
    if (i != NULL)
          i = 4;
    A la suite de cette ligne, on peut écrire V
    if (i != NULL)
          i[0] = 4;
    A la suite de cette ligne, on peut écrire   F
    if (i != NULL)
          i[6] = 4;
    A la suite de cette ligne, on peut écrire   F
    if (i != NULL)
          i[] = {1, 2, 3, 4, 5, 6};

    je ne saisis pas le "vrai" pour la deuxième proposition.

    en effet i est un pointeur sur un entier , n'est-ce pas ?

    Donc , d'après ce que je sais, il faut utiliser pour désigner des valeurs alors que i tout seul désignerait des adresses ? ou bien ce serait pour désigner l'adresse de ?

    Dans ce cas, pourquoi peut-on écrire, alors que à ma connaissance i[0] désignerait plutôt des adresses ?


    Merci de vos explications

    ps: d'ailleurs, dans ce code, on a un ce qui montre bien que la valeur de i est une adresse
    Images attachées Images attachées

  3. #23
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Encore une fois, la seule date à laquelle a été présenté cet examen tend à le disqualifier si tu veux avoir une chance d'apprendre du C++ un tout petit peu moderne.

    En datant de 2000, il a pris du retard sur deux versions de la norme et sur un technical report ce qui est, vraiment, très important.

    Quand on sait qu'en plus les profs sont très lents à se mettre à jour...

    Ceci dit:
    je ne saisis pas le "vrai" pour la deuxième proposition.

    en effet i est un pointeur sur un entier , n'est-ce pas ?

    Donc , d'après ce que je sais, il faut utiliser
    pour désigner des valeurs alors que i tout seul désignerait des adresses ? ou bien ce seraitpour désigner l'adresse de
    Oui, mais non...

    C'est, quelque part, tout le problème des pointeurs...

    Le fait est que i n'est jamais qu'un pointeur. C'est à dire une variable qui contient l'adresse mémoire à laquelle on va trouver un élément du type indiqué.

    Mais l'adresse contenue par i est l'adresse qui résulte de new int[6]. Or, new int[6] a eu comme effet de réserver l'espace mémoire suffisant pour pouvoir représenter 6 éléments de type int consécutifs et le résultat est l'adresse du premier élément (celui à l'index 0).

    Tu peux donc tout à fait sans problème travailler "comme bon te semble":
    fonctionnera en assignant la valeur 4 à "ce qui est pointé par i" et qui correspond à l'élément d'index 0, mais cela aura exactement le même résultat que
    car l'opérateur [] a pour résultat de dire "prend ce qui se trouve à l'adresse de i et décales toi du nombre d'éléments indiqué entre les crochets" ce qui correspond bel et bien à la même chose

    Ce qui est vrai, c'est que tu peux effectivement envisager de passer un array lorsqu'un pointeur est attendu sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* soient 
    void foo(int * tab)
    et 
    void bar(int tab[4])
    */
    int main()
    {
       int i[4];
       foo(i); // ok : i est bel et bien un pointeur sur le premier élément
       bar(i); // ok : i est bel et bien un array de 4 entiers
    }
    Par contre, tu ne peux pas envisager de passer un pointeur quand un array est attendu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /* soient 
    void foo(int * tab)
    et 
    void bar(int tab[4])
    */
    int main()
    {
       int * i = new int[4];
       foo(i); // ok : i est bel et bien un pointeur sur le premier élément
       bar(i); // nok : i n'est pas un array mais un pointeur
    }
    ps: d'ailleurs, dans ce code, on a un
    En effet, et alors...

    A ton avis, il s'agit de l'adresse de quoi, selon toi

    Si on a mis ce test, c'est uniquement pour s'assurer de la validité du pointeur, et rien d'autre (bien que le test soit, a priori inutile dans ce cas particulier car il y aurait une exception std::bad_alloc() lancée si l'allocation dynamique avait échoué )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #24
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Points : 30
    Points
    30
    Par défaut
    Bonjour koala et bonjour à tous,

    je ne connais pas les fonctions bar et foo dans qui apparaissent dans le dernier post de koala.

    Pouvez-vous me dire précisément à quoi elles servent ?

    (d'après ce post, elles vient de std)

    Merci

  5. #25
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par matlab_ Voir le message
    Bonjour koala et bonjour à tous,

    je ne connais pas les fonctions bar et foo dans qui apparaissent dans le dernier post de koala.

    Pouvez-vous me dire précisément à quoi elles servent ?

    (d'après ce post, elles vient de std)
    Pas vraiment...

    Ce sont des noms de fonctions que l'on utilise régulièrement pour signifier "toute fonction qui présenterait une signature similaire"

    c'est comme si on les avait nommées "faitQuelqueChose" et "faitAutrechose"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #26
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Points : 30
    Points
    30
    Par défaut
    Bonsoir,

    je n'ai toujours pas compris ce que signifient bar et foo.

    merci de vos explications

    cordialement

  7. #27
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par matlab_ Voir le message
    Bonsoir,

    je n'ai toujours pas compris ce que signifient bar et foo.

    cordialement
    Je ne sais pas vraiment comment t'expliquer les choses autrement:

    Cela signifie "si tu as n'importe quelle fonction qui qui présente la signature de foo (comprends: si tu as une fonction qui ne renvoie rien et qui prend un int * en argument), tu peux envisager de l'utiliser à la place de foo (dont le nom est mis de manière "générique")", et "si tu as n'importe quelle fonction qui présente la signature de bar (comprend: si tu as une fonction qui ne renvoie rien et qui prend un int[4] comme argument), tu peux envisager de l'utiliser à la place de bar.

    Ce sont des noms de fonctions qui ne correspondent à rien de particulier, mais qui sont mis là parce qu'il faut bien nommer les fonctions.

    On utilise ces noms un peu comme on aurait utilisé des noms come "uneFonctionGenerique" ou comme "doSomething"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #28
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Points : 30
    Points
    30
    Par défaut
    C'est compris maintenant,

    merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Problème avec constructeurs
    Par MS181 dans le forum Débuter
    Réponses: 5
    Dernier message: 30/04/2013, 18h32
  2. problème avec pointeur et constructeur
    Par matteli dans le forum C++
    Réponses: 2
    Dernier message: 24/02/2008, 16h11
  3. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 09h15
  4. problème de constructeur avec wxWidget
    Par Ardeciel dans le forum wxWidgets
    Réponses: 2
    Dernier message: 10/03/2007, 23h11
  5. [Conception]Problèmes avec un constructeur dérivé
    Par Le Furet dans le forum Langage
    Réponses: 6
    Dernier message: 10/03/2006, 09h44

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