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 :

Plusieurs return pour une fonction


Sujet :

C

  1. #21
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Le problème des int, c'est qu'on ne sait pas ce que c'est.
    C'est sur 16 ou 32 bits officiellement. ET il y a déjà eu des gros bugs dans des programmes qui ont été faits et testés sur des systèmes 16 bits quand le système est passé en 32 bits. Une fusée Ariane se serait scratchée à cause de ça. Ils sont donc interdits dans certains environnement de programmation, par exemple, ceux qui travaillent pour eurocopter n'ont pas le droit d'utiliser int.
    Vu les ordinateurs actuels, je ne vois pas pourquoi un int ne passerait pas en 64 bits...
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #22
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par troumad Voir le message
    Une fusée Ariane se serait scratchée à cause de ça.
    Quand j'étais à l'école, un de mes profs nous a parlé d'une fusée qui se serait scratchée mais pas tout à fait à cause des int mais plutôt à cause d'un pb de latitude et de variable non signée. Et quand le calculateur s'est retrouvé dans la latitude sud...
    Mais plus vraisemblablement je pense qu'il doit s'agir d'une légende urbaine...

    Citation Envoyé par troumad Voir le message
    Le problème des int, c'est qu'on ne sait pas ce que c'est.
    C'est pas forcément mieux avec les short ou les long. Car un short c'est au minimum 2 octets et un long c'est au minimum 4 mais "au minimum" n'implique rien en ce qui concerne le maximum. Et j'ai bossé une fois sur un Siemens Nixdorf où les shorts étaient à 2, les int à 4 et les long à 6...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #23
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Tout à fait, de toute façon aucun des types de base n'a une taille normalisée. Si on veut être sûr de la taille d'un type on utilise int8_t, int16_t, int32_t et int64_t.

    Et puis utiliser un long sous prétexte qu'on ne sait pas ce qu'est un int, c'est un peu paradoxal puisque que sur la plupart des architecture actuelles un int fait 32 bits quel que soit le mode de compilation, alors qu'un long peut faire au choix 32 ou 64 bits.

  4. #24
    Membre éclairé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 471
    Points : 831
    Points
    831
    Par défaut
    Bonjour à tous
    Mais plus vraisemblablement je pense qu'il doit s'agir d'une légende urbaine...
    C'est pas une légende, mais une réalité. De mémoire, c'est la première Araine 5, un overflow dans un calcul a planté le logiciel, et a fait scratché notre fusée. Lorsque le bug a été compris, ArianeEspace( si je me trompe pas) a décidé de faire développer un logiciel qui permet de détecter ces erreurs. Ce logiciel existe toujours, et son passage est systématiquement demandé sur les soft atomobiles. Son nom: Polyspace
    Ce logiciel a été passé alors sur le soft incriminé et a bien détecté cet overflow.

    Alea jacta est.
    Page sur Developpez : http://pbriand.developpez.com

  5. #25
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Ouais, d'accord...
    Donc au final, si on est certain que l'on ne va utiliser que des valeurs de l'intervalle [-2^15; 2^15[, il n'y a aucun danger...

  6. #26
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    C'est clair que le danger, et quel que soit le type, c'est l'overflow. Que l'int fasse 16 ou 32 bits, pour gérer 10 valeurs qui se battent en duel, on s'en fout un peu. Et une des premières choses que font les bibliothèques C et C++ c'est de redéfinir les types de base avec en suffixe le nombre de bits occupés...
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  7. #27
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    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
    16
    17
    18
    19
    20
    21
    signed char est_premier(unsigned long nb)
    {
        unsigned long i;
     
        if (nb < 2)
            return 0;
     
        if  (nb == 2)
            return 1;
     
        if  (nb % 2 == 0)
            return 0;
     
        for (i = 3; i * i <= nb; i += 2)
        {
            if (nb % i == 0)
                return 0;
        }
     
        return 1;
    }
    Sinon un peu plus aéré c'est bien aussi, non ?
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  8. #28
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    La faille dans tous ces codes n'est pas liée au nombre de bits d'un unsigned int (ou d'un unsigned long...). Après tout, si on déclare un paramètre en unsigned int, on peut exiger du programmeur qu'il mette un argument compatible avec un unsigned int.
    Par contre, si il met un argument compatible avec le type utilisé, il peut s'attendre à avoir une réponse exacte.
    Et ce n'est pas toujours le cas à cause de la condition erronnée i*i<=nb du for

    Supposons que le type utilisé soit sur 2n bits (on excluera du raisonnement les cas où on utilise comme type unsigned char ou unsigned short pour lesquels l'évaluation est faite différemment).
    Supposons qu'il existe un nombre premier P dans l'intervalle ](2^n-1)^2 , 2^(2n)-1]
    - Pour i = 2^n-1 la condition i*i<=P est satisfaite et on passe à i= 2^n+1
    - On a alors i*i = (2^n+1)^2 modulo(2^(2n)) = 2^(n+1)+1 , la condition i*i<=P est satisfaite et on passe à i= 2^n+3,
    - etc.
    i continue à croître et on peut alors s'attendre à la réponse "non premier" lorsque i arrivera (au bout d'un long moment) à P.

    Vérifiez, si vous le souhaitez, avec des unsigned de 32 bits et nb = 4294967291

    On peut modifier cette condition par (pour des unsigned int) i<max && i*i<=nbavec unsigned int const max = 1<< sizeof(nb)*CHAR_BIT/2;
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #29
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Citation Envoyé par diogene Voir le message
    i<max && i*i<=nbavec unsigned int const max = 1<< sizeof(nb)*CHAR_BIT/2;
    C'est une question que je m'étais posée.
    Je me suis même demandé si nb en 32 bits pouvait signifier que i peut être en 16 bits. Le tout est de savoir si 1<< sizeof(nb)*CHAR_BIT/2-1 est premier ou non.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  10. #30
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Je me suis même demandé si nb en 32 bits pouvait signifier que i peut être en 16 bits....
    Si on déclare i en unsigned short (supposé sur 16 bits), l'expression i*i sera quant même évaluée en int ou en unsigned int.
    Le tout est de savoir si 1<< sizeof(nb)*CHAR_BIT/2-1 est premier ou non.
    La réponse est non : si nb est sur un nombre de bits multiple de 4 (8, 16, 32, 64,...), soit 4p, ce qui est le plus fréquent, alors max-1 vaut 2^(2p)-1 = (2^p-1)(2^p+1).
    Maintenant, je ne vois pas quelle importance a le fait qu'il soit premier ou non.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #31
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Je n'avais pensé à a²-b² sur ce cas là !

    Pourquoi ? Parce que alors tant que max peut alors être sizeof(nb)*CHAR_BIT/2-1 et i peut être de la taille en dessous de celle de nb.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  12. #32
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Parce que alors tant que max peut alors être sizeof(nb)*CHAR_BIT/2-1 et i peut être de la taille en dessous de celle de nb.
    Désolé, je ne vois pas le rapport avec le fait que max-1 soit premier ou pas.

    A mon avis, la question de réduire la taille de i est très mineure. Par contre, la question de comment s'évalue i*i est essentielle.

    Par exemple, sur la machine considérée, supposons nb déclaré comme un unsigned long de 32 bits et i déclaré unsigned int de 16 bits
    max sera un unsigned long (égal à 2^16) et la comparaison i<max ne posera pas de problème puisque i sera converti en unsigned long avant comparaison.

    Par contre i*i sera évalué en unsigned int, résultat en unsigned int. Alors, i*i sera toujours < 2^16. Par exemple, pour i = 2^8, on aura i*i = 2^16 mod(2^16) = 0.
    La comparaison i*i <= nb est faite en convertissant le résultat i*i (type unsigned int) en unsigned long suivi de la comparaison entre unsigned long, et non pas en convertissant i en unsigned long, puis en effectuant le produit i*i entre unsigned long puis en comparant.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  13. #33
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Citation Envoyé par diogene Voir le message
    Désolé, je ne vois pas le rapport avec le fait que max-1 soit premier ou pas.
    Parce que max sera alors
    nb_max=1<< sizeof(nb)*CHAR_BIT/2-1 .
    S'il était premier, on sortirait avant d'avoir testé max sur nb_max² qui n'est pas premier et serait considéré premier. Comme on ajoute 2 à chaque fois, si on est obligé de tester si le nombre est multiple de nb_max, il faudrait modifier la boucle : un for deviendrait alors plus dur à gérer car l'incrémentation se fait en fin de boucle et ici nb_max+2=1 à cause des débordements.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  14. #34
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 148
    Points : 28 113
    Points
    28 113
    Par défaut
    Citation Envoyé par troumad Voir le message
    Le problème des int, c'est qu'on ne sait pas ce que c'est.
    C'est sur 16 ou 32 bits officiellement
    La norme C ne definissant AUCUNE taille pour les types, est-ce que tu codes sans type ?
    Pour les valeurs minimales et maximales des differents types standards, voir le paragraphe 5.2.4.2.1 de la norme C99.
    Pour la definition des types, voir le paragraphe 6.2.5.

    Si on s'en refere a la norme, le type unsigned long que tu utilises n'est pas plus precis que int que tu decries : rien ne te dit qu'il sera 32 ou 64 bits.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. Plusieurs boutons pour une fonction
    Par SoGood dans le forum jQuery
    Réponses: 5
    Dernier message: 19/05/2013, 17h11
  2. [XL-2007] Plusieurs outputs pour une fonction
    Par Wini29 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/04/2013, 12h43
  3. Plusieurs return dans une fonction
    Par ninikkhuet dans le forum Langage
    Réponses: 4
    Dernier message: 19/05/2010, 13h45
  4. plusieurs return dans une fonction?
    Par contremaitre dans le forum C
    Réponses: 27
    Dernier message: 21/02/2008, 10h35
  5. [C#] Plusieurs LinkButton pour une seule fonction
    Par FunnyDjo dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/06/2005, 23h01

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