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 :

unsigned long long int et printf


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut unsigned long long int et printf
    Bonjour,

    Je reprenais un vieux code et je me disais que je voulais utiliser des unsigned long long mais le compilo n'accepte pas le format dans le printf et me colle des warnings.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <time.h>
    #include "matrix.h"
    #include "allocate.h"
    #include "deallocate.h"
    #include "file.h"
     
    int main()
    {
        printf("%llu\n", ULLONG_MAX);
        file_log();
        allocate_log();
        deallocate_log();
        matrix_log();
     
        srand(time(NULL));
        t_matrix *m0=matrix_create(5,6);
        t_matrix *m1=matrix_create(5,5);
     
        matrix_random(m0,0,100);
        matrix_random(m1,0,500);
     
        t_matrix *m2=matrix_sum(m0,m1);
        t_matrix *m3=matrix_substract(m1,m0);
        t_matrix *m4=matrix_multiply(m1,m0);
     
        matrix_display(m0);
        matrix_display(m1);
        matrix_display(m2);
        matrix_display(m3);
        matrix_display(m4);
     
        matrix_destroy(m0);
        matrix_destroy(m1);
        matrix_destroy(m2);
        matrix_destroy(m3);
        matrix_destroy(m4);
     
        matrix_unlog();
        allocate_unlog();
        deallocate_unlog();
        file_unlog();
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    main.c|12|warning: unknown conversion type character 'l' in format|
    main.c|12|warning: too many arguments for format|
    ||=== Build finished: 0 errors, 2 warnings ===|
    Une petite idée =) ?
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    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 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    Bonjour,

    Je reprenais un vieux code et je me disais que je voulais utiliser des unsigned long long mais le compilo n'accepte pas le format dans le printf et me colle des warnings.


    Une petite idée =) ?
    Passer une option de compilation pour qu'il reconnaisse ton code comme etant C99 ? Un truc du genre --std=C99 ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Nikel !

    MERCI
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  4. #4
    Membre expérimenté Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Points : 1 372
    Points
    1 372
    Par défaut
    Quel compilateur utilises-tu et quelle est sa version ?
    J'ai testé le code suivant avec gcc 4.7.2 sans option particulière et je n'ai aucun message d'erreur ni avertissement, même avec l'option -Wall.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
     
    int main()
    {
      printf("%llu\n", ULLONG_MAX);
      getchar();
     
      return 0;
    }

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    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 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par Ngork Voir le message
    Quel compilateur utilises-tu et quelle est sa version ?
    J'ai testé le code suivant avec gcc 4.7.2 sans option particulière et je n'ai aucun message d'erreur ni avertissement, même avec l'option -Wall.
    Tient, c'est drole ca.
    GCC 4.1.2 :
    > gcc -Wall -Wextra test.c -o test
    test.c: In function 'main':
    test.c:7: error: 'ULLONG_MAX' undeclared (first use in this function)
    test.c:7: error: (Each undeclared identifier is reported only once
    test.c:7: error: for each function it appears in.)
    du coup, avec l'option -std=c99, ca passe sans erreur.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Je n'ai aucune idée de la version de gcc, je sais que j'ai code blocks 10.05 je crois. Je suppose que l'on peut retrouver la version de gcc associée avec ça.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Joa,
    Citation Envoyé par darkwall_37 Voir le message
    Je n'ai aucune idée de la version de gcc, je sais que j'ai code blocks 10.05 je crois. Je suppose que l'on peut retrouver la version de gcc associée avec ça.
    Non, ce n'est pas implicite : Code::Blocks est seulement un environnement de développement, il peut accepter n'importe quel compilateur.

    Pour connaître ta version de gcc :

    - avec une invite de commande, change le répertoire actif pour être dans le répertoire des binaires de gcc (Chemin_Vers_Mingw/bin)

    - et entre la commande: gcc --version

    - et tu le sauras.
    Si les cons volaient, il ferait nuit à midi.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Attention, si c'est MinGW alors ça veut dire qu'il utilise la CRT de Microsoft, et pas forcément la dernière version: Il faudra vérifier qu'elle supporte bien "%llu", car les vieilles versions ne supportent que "%I64u" à la place.
    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.

  9. #9
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Version 4.4.1 !

    J'installe CB avec MW, du coup j'utilise bien le MW fournit par CB même s'il est possible de n'installer que l'éditeur on est d'accord.
    Maintenant, je n'ai plus de warning, alors à vous tous pour votre aide !

    Cordialement.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  10. #10
    Membre expérimenté Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Points : 1 372
    Points
    1 372
    Par défaut
    @ gangsoleil

    GCC 4.1.2 ?
    Oui, c'est un peu normal qu'avec un compilo qui a déjà plusieurs années (la version 4.1 de gcc date un peu, il me semble), l'option soit encore nécessaire !
    Toutefois, je confirme qu'avec GCC 4.7.2, ici dans Code::Blocks sous Linux, sans option spécifique, je n'ai eu aucun souci :

    -------------- Clean: Release in test ---------------

    Cleaned "test - Release"

    -------------- Build: Release in test ---------------

    gcc -Wextra -Wall -O2 -c main.c -o main.o
    g++ -o test main.o -s
    Output size is 3,23 KB
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 0 warnings

  11. #11
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Je vais télécharger la dernière version alors parce qu'en faite ça marche pas.
    Il me met option invalide mais cache les warning je n'avais pas fait gaffe.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  12. #12
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    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 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    Il me met option invalide mais cache les warning je n'avais pas fait gaffe.
    Tu n'as pas besoin de changer de compilateur, simplement il faut que tu apprennes a le configurer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -Wextra -O2 -std=C99
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  13. #13
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    J'ai beau avoir installé la dernière version de gcc, j'obtiens toujours l'erreur.
    Je tourne sous windows.
    Je mets l'option dans project>build options>other options.
    J'ai toujours le droit à options invalides. =(
    Suis-je au bon endroit ?
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  14. #14
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Avec I64u ou I64d cela passe sans option. ENfin je crois.

    En revanche, je ne comprends pas pourquoi cette fonction me renvoie toujours 1.

    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
    unsigned long long int LIMITS_ULLONG(unsigned long long int value)
    {
        if ( 0 <= value && value <= ULLONG_MAX )
            return TRUE;
     
        return FALSE;
    }
     
    unsigned long long int LIMITS_LLONG(long long int value)
    {
        if ( LLONG_MIN <= value && value <= LLONG_MAX )
            return TRUE;
     
        return FALSE;
    }
    Si je mets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%I64u", LIMITS_LLONG(LLONG_MAX)); // Me renvoie 1 :: normal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%I64u", LIMITS_LLONG(LLONG_MAX*10)); // Me renvoie 1 :: pas normal
    Qu'elle est mon erreur ? Merci encore.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Même s'il existait un type long long long, tes fonctions n'acceptent que des long long, donc dans tous les cas la valeur est tronquée avant le test, qui est donc toujours vrai.
    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.

  16. #16
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Oui c'est ce dont je me doutais, car quand j'affichais la valeur, il m'en mettait une autre.
    Il n'y a donc pas moyen de tester si la valeur n'est pas hors limite ?
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À ma connaissance, non, à moins peut-être de jouer avec les flottants, mais ce n'est pas précis. Pour détecter une overflow, je ferais plutôt ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int mulu_ofl(unsigned long long *pRet, unsigned long long a, unsigned long long b)
    {
    	*pRet = a * b;
    	if(*pRet / a) != b)
    		return -1;
    	if(*pRet / b) != a)
    		return -1;
    	return 0;
    }
    Ça marche pour la multiplication, mais pas vraiment pour l'addition; là il faudrait plutôt tester les signes des opérandes et du résultat (et en non-signé, vérifier que le résultat est supérieur à chacune des opérandes).
    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.

  18. #18
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Okay merci, en tous cas le compilo me détecte l'overflow si je mets un verbose plus important sur les warning. Si je mets LLONG_MAX+1 pour un long long int, le compilo me sort un overflow. Peut être qu'il est possible d'aller lire le FLAG en question quelque part si le compilo le fait.

    Cdt.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    Okay merci, en tous cas le compilo me détecte l'overflow si je mets un verbose plus important sur les warning. Si je mets LLONG_MAX+1 pour un long long int, le compilo me sort un overflow. Peut être qu'il est possible d'aller lire le FLAG en question quelque part si le compilo le fait.
    LLONG_MAX+1, c'est sur des valeurs connues à la compilation, donc c'est facile à voir pour le compilo.

    Je ne saisis pas pourquoi en ayant la dernière version de GCC, llu ne passe pas alors que I64d/u oui.
    Comme je l'ai dit, c'est parce que MinGW utilise la vieille MSVCRT.DLL de Microsoft (avec Visual 6!), et non pas la libc de gcc.
    Pour la même raison, il ne faut pas faire un printf() d'un long double, parce que la définition de long double diffère d'un compilo à l'autre.
    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.

  20. #20
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Oui pardon, désolé pour la répétition, je m'en suis rendu compte après avoir posté.

    Merci pour les précisions et l'aide apportée. Bonne journée.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. unsigned long long int -> char*
    Par Kaluza dans le forum Langage
    Réponses: 2
    Dernier message: 28/05/2011, 03h12
  2. unsigned long long int
    Par salseropom dans le forum C
    Réponses: 10
    Dernier message: 21/12/2006, 22h43
  3. décallage sur long long int
    Par trax44 dans le forum C
    Réponses: 9
    Dernier message: 26/02/2006, 11h41
  4. Réponses: 6
    Dernier message: 06/12/2005, 16h54
  5. [Transtypage] Long en int
    Par Bugmaster dans le forum Langage
    Réponses: 2
    Dernier message: 20/09/2004, 09h05

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