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

Langage C++ Discussion :

Tableau dynamique (ou new) implicite ?


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 6
    Par défaut Tableau dynamique (ou new) implicite ?
    Bonjour, je ne comprend pas trop pourquoi le code suivant marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        int n = 15;
        char tab[n]; // ??? Allocation implicite ???
     
        cout << sizeof(tab) << endl;
     
        cout << "Hello world!" << endl;
        return 0;
    }
    Cela compile sans soucis avec gcc, la valeur renvoyée par le sizeof est 15 et on peut accéder aux éléments du tableau.

    Je pensais que l'allocation dynamique devait se faire via un new (et delete) et donc que le compilateur aurait planté (au moins fait un warning), mais ce n'est pas le cas (il n’interprète pas n comme étant une constante la lecture d'un nombre via la console donne le même résultat). De même je pensais que sizeof était un élément remplacé à la compilation... or il semblerait que ce soit une évaluation dynamique qui soit faite.

    Quelqu'un a-t-il des informations à ce sujet ? ce genre de syntaxe est-elle portable ? A quel comportement doit-on s'attendre de la part de ce programme ?

  2. #2
    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
    oui pour tout.
    une variable T[] n'est pas un pointeur, c'est un tableau, alloué localement.
    (à la différence d'un parametre T[], qui est quasiment un pointeur…)

    sizeof sur une telle variable retourne bien la taille du tableau, (en nombre de T, je suppose)

    sizeof est un operateur (unaire), au meme titre que - ou !.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    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 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par leternel Voir le message
    sizeof sur une telle variable retourne bien la taille du tableau, (en nombre de T, je suppose)
    Pour connaître le nombre d'élément, la syntaxe serait sizeof(T) / sizeof(T[0]), mais sizeof(char) a l'air de valoir 1 chez toi (cas commun)
    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.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour commencer compile en -ansi -pedantic, on a vu quelqu'un avoir des questions récemment avec ce genre de déclaration.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    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 147
    Billets dans le blog
    4
    Par défaut
    Petit message supplémentaire, pas le temps tout à l'heure.

    Cette syntaxe ne devrait pas compiler dans l'absolu, ça ne marche que si n est constant. Ici le compilateur a l'air de l'utiliser comme tel, puisque tu ne l'utilises pas et ne changes pas de sa valeur initiale.

    Sinon, il y a les VLA, mais c'est du C (pur et non valide C++ il me semble), et pas vraiment vu comme une bonne pratique.
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    gcc supporte les VLA en C++ en tant qu'extension, d'où mon conseil de tester avec -pedantic.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    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
    Citation Envoyé par Bousk Voir le message
    Pour connaître le nombre d'élément, la syntaxe serait sizeof(T) / sizeof(T[0]), mais sizeof(char) a l'air de valoir 1 chez toi (cas commun)
    Que sizeof(char) vaille 1 est normatif. C'est même la seule taille de type qui soit spécifiée, pour autant que je sache.
    Les autres tailles sont "suffisantes pour représenter" une plage de valeur, et "au moins aussi grandes" que d'autres (i.e. long est au moins aussi grand que int)

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. récupérer la memoire et tableau dynamique
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 06/01/2003, 08h02
  3. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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