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 :

Constructeur d'entier avec un double temporaire


Sujet :

Langage C++

  1. #1
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut Constructeur d'entier avec un double temporaire
    Bonjour,
    simple question, pourquoi ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main() {
    	float p[2];
    	p[0] = -1;
    	int i(double(p[0])+1); // warning : ISO C++ forbids zero-size array 'p'
    	return i;
    }
    }
    Compilé en -W -Wall -pedantic me sort ce warning (avec gcc 4.4.0 mingw)? Merci d'avance !

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La troisième ligne ne serait-elle pas interprétée comme une déclaration de fonction ? Je ne sais pas ce que signifierait le +1 dans ce cas, mais ça expliquerait que le compilo prenne p pour un tableau de taille 0. D'ailleurs chez moi avec Visual C++, avec +1 ça passe, et sans j'ai la même erreur.

    Essaye "int i = ..." ou "static_cast<double>" pour voir.

  3. #3
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Les autres écritures marche sans problèmes...

    Mais pourquoi serait-elle prit comme-t-elle ? Pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int i(double p[0]);
    Je veux bien ! Mais sinon, je pensais bêtement qu'à syntaxe différente, il avait une sémantique différente aussi...

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Il faut avouer que fait quand même furieusement penser à une déclaration de fonction, et que, sauf erreur, les fonctions peuvent être imbriquées

    De plus, s'il existe effectivement des pseudo constructeurs pour les types primitifs, il faut savoir que ce que tu essaye de faire ici est quelques peu... suspect :

    Tu crées un double anonyme sur base d'un float, alors que les float et les double ne sont pas représentés par le même nombre de bytes.

    Si c'est accepté, ce n'est uniquement que parce que tu ne perd pas de précision en travaillant de la sorte.

    Puis tu essaye de créer un int sur base du double anonyme, sauf que, là, tu as un perte de précision à plus d'un titre:
    • le passage d'un réel à un entier fait, d'office, perdre la précision de ce qu'il y a après la virgule
    • un int est classiquement représenté par un nombre de byte plus petit qu'un double


    Il faut avouer que, l'un dan l'autre, il y a de quoi s'interroger, non
    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

  5. #5
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Il faut avouer que fait quand même furieusement penser à une déclaration de fonction, et que, sauf erreur, les fonctions peuvent être imbriquées
    Je veux bien, mais je vois pas comment on peut arriver à penser que ceci est une déclaration de fonction... double(var) et double var, c'est quand même pas la même chose !

    Citation Envoyé par koala01 Voir le message
    De plus, s'il existe effectivement des pseudo constructeurs pour les types primitifs, il faut savoir que ce que tu essaye de faire ici est quelques peu... suspect :

    Tu crées un double anonyme sur base d'un float, alors que les float et les double ne sont pas représentés par le même nombre de bytes.

    Si c'est accepté, ce n'est uniquement que parce que tu ne perd pas de précision en travaillant de la sorte.

    Puis tu essaye de créer un int sur base du double anonyme, sauf que, là, tu as un perte de précision à plus d'un titre:
    • le passage d'un réel à un entier fait, d'office, perdre la précision de ce qu'il y a après la virgule
    • un int est classiquement représenté par un nombre de byte plus petit qu'un double


    Il faut avouer que, l'un dan l'autre, il y a de quoi s'interroger, non
    Je dis pas ! En faite, le VRAI endroit ou j'utilise se genre de notation, j'ai bien au mieux, un float. Hors, c'est un calculs qui demande une "grosse" précision (comprendre supérieur a celle des floats), pour ensuite être tronquer... Et non, un int ne te fais pas forcément perdre de la précision sur un float... Parfois c'est l'inverse !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Par défaut
    Ton code non seulement ressemble à une déclaration de fonction mais en plus est plein de cast implicites qui ne doivent pas aider le compilateur.

    Quelle est l'intérêt d'une telle écriture à part économiser quelques lignes de code?

Discussions similaires

  1. [SWISH] Faire le preload d'un site entier avec swish
    Par denis finch dans le forum EDI/Outils
    Réponses: 1
    Dernier message: 16/10/2005, 15h28
  2. Formatage d'entiers avec un signe
    Par chtom dans le forum Langage
    Réponses: 5
    Dernier message: 21/09/2005, 20h59
  3. Probleme avec les double Liste chainees
    Par BernardT dans le forum Langage
    Réponses: 1
    Dernier message: 12/07/2005, 17h22
  4. arrondi avec type double
    Par la drogue c'est mal dans le forum MFC
    Réponses: 6
    Dernier message: 08/04/2005, 17h51
  5. [debutant][jsp]Passage d'entier avec une session sans cookie
    Par o151181 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 04/02/2004, 18h22

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