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 :

Les "long long int"


Sujet :

C

  1. #1
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut Les "long long int"
    Salut!

    Dans le header "limits.h" on trouve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #if	!defined(__STRICT_ANSI__) && defined(__GNUC__)
     
    #define LONG_LONG_MAX	9223372036854775807LL
    #define LONG_LONG_MIN	(-LONG_LONG_MAX-1)
     
    #define ULONG_LONG_MAX	(2ULL * LONG_LONG_MAX + 1)
     
    /* ISO C9x macro names */
    #define LLONG_MAX LONG_LONG_MAX
    #define LLONG_MIN LONG_LONG_MIN
    #define ULLONG_MAX ULONG_LONG_MAX
    Or sous Windows XP avec DevC++, donc avec gcc, l'appel à ces constantes est impossible, donc une des conditions n'est pas valide, c'est "__STRICT_ANSI__", qui est définie.
    De plus le formateur "%ll" n'est pas reconnu.

    En revanche la déclaration d'un "long long int n" ne pose pas de problème et "sizeof n*CHAR_BIT" renvoie bien 64.

    Que peut on en conclure quand à l'utilisation des "long long int" dans ce contexte?

    Merci de vos réponses.

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Que peut on en conclure quand à l'utilisation des "long long int" dans ce contexte?
    Juste que la compilation ne devrait pas se faire ! Pense à bien paramètrer le compilateur.

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Pense à bien paramètrer le compilateur.
    Pourtant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -std=c99
    -O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int
    -Werror-implicit-function-declaration -Wmain -Wparentheses -Wsequence-point
    -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized
    -Wunknown-pragmas -Wfloat-equal -Wundef -Wshadow -Wpointer-arith
    -Wbad-function-cast -Wwrite-strings -Wconversion -Wsign-compare
    -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes
    -Wmissing-declarations -Wmissing-noreturn -Wformat
    -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked
    -Wredundant-decls -Wnested-externs -Winline -Wlong-long
    -Wunreachable-code

  4. #4
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    C'est ton std=c99 qui fait que tu peux utiliser le type long long.

    On peux presque en conclure qu'il y a souci quelque par du coté de l'inclusion des fichiers d'en-tête... ou même de la version de ce même fichier d'entête puisque les lignes que tu donnes demandent de ne pas inclure les définitions si tu es ansi strict. (c99 est-il ansi strict?)

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Par défaut
    long long c'est pas la norme c99 ? si il me semble, tu doit alors avec ton compilo rajouter -std=c99

  6. #6
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    -std=c99
    -O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int
    -Werror-implicit-function-declaration -Wmain -Wparentheses -Wsequence-point
    -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized
    -Wunknown-pragmas -Wfloat-equal -Wundef -Wshadow -Wpointer-arith
    -Wbad-function-cast -Wwrite-strings -Wconversion -Wsign-compare
    -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes
    -Wmissing-declarations -Wmissing-noreturn -Wformat
    -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked
    -Wredundant-decls -Wnested-externs -Winline -Wlong-long
    -Wunreachable-code
    Un problème de vue ?

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par deck_bsd
    long long c'est pas la norme c99 ? si il me semble, tu doit alors avec ton compilo rajouter -std=c99
    un p'tit café peut être :
    Citation Envoyé par seriousme
    Citation Envoyé par PRomu@ld
    C'est ton qui fait que tu peux utiliser le type .

    On peux presque en conclure qu'il y a souci quelque par du coté de l'inclusion des fichiers d'en-tête... ou même de la version de ce même fichier d'entête puisque les lignes que tu donnes demandent de ne pas inclure les définitions si tu es ansi strict. (c99 est-il ansi strict?)
    Normalement ansi strict c'est l'option -ansi donc -std=c90 mais ce n'est qu'une supposition, faudrait essayer sans pour voir.

  8. #8
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    J'avais testé sans le "-std=c99" et ça passait comme même.
    Je viens de tester avec "-ansi" à la place de "-std=c99" et ç'est la même chose:
    pas de warning ni d'erreur mais le formateur "%ll" non reconnu.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par seriousme
    J'avais testé sans le "-std=c99" et ça passait comme même.
    Je viens de tester avec "-ansi" à la place de "-std=c99" et ç'est la même chose:
    pas de warning ni d'erreur mais le formateur "%ll" non reconnu.
    Le formateuir n'a rien à voir avec le compilateur, mais avec la bibliothèque C. Sur PC/Windows, c'est Microsoft qui régale, et ce n'est donc pas C99. (C'est pour ça que C99 sur PC/Windows, je demande à voir...[1])

    En attendant, tu peux remplacer "ll" par "I64" et ça marche.
    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 <limits.h>
     
    int main ()
    {
       long long n = LLONG_MAX;
     
       printf ("n = %I64d\n", n);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    n = 9223372036854775807
     
    Press ENTER to continue.
    ---------------------------
    [1] Néanmoins, il est possible que MinGW fournisse une DLL (et sa lib) pour faire du C99, mais alors il faudrait que les IDE (Code::Blocks etc.) en tiennent compte, ce qui ne semble pas être le cas par défaut. De plus, je ne sais pas trop comment ça se regle dans C::B...

  10. #10
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Bizarre que tu n'es pas de warning avec -ansi car tu ajoutes l'option -Wlong-long or long long n'est pas ansi.

    Perso, je suis toujours convaincu que ton compilateur a un soucis quelque par puisqu'il se contredit lui même ...

  11. #11
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par seriousme
    Salut!

    Dans le header "limits.h" on trouve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #if	!defined(__STRICT_ANSI__) && defined(__GNUC__)
     
    #define LONG_LONG_MAX	9223372036854775807LL
    #define LONG_LONG_MIN	(-LONG_LONG_MAX-1)
     
    #define ULONG_LONG_MAX	(2ULL * LONG_LONG_MAX + 1)
     
    /* ISO C9x macro names */
    #define LLONG_MAX LONG_LONG_MAX
    #define LLONG_MIN LONG_LONG_MIN
    #define ULLONG_MAX ULONG_LONG_MAX
    Or sous Windows XP avec DevC++, donc avec gcc, l'appel à ces constantes est impossible, donc une des conditions n'est pas valide, c'est "__STRICT_ANSI__", qui est définie.
    De plus le formateur "%ll" n'est pas reconnu.

    En revanche la déclaration d'un "long long int n" ne pose pas de problème et "sizeof n*CHAR_BIT" renvoie bien 64.

    Que peut on en conclure quand à l'utilisation des "long long int" dans ce contexte?

    Merci de vos réponses.
    Contrairement à ce que l'on peut penser __STRICT_ANSI__ n'est pas défini seulement pour -ansi, mais aussi pour -std=..., apparemment aussi si c'est c99 et pas seulement c89 ou c90.

    http://gcc.gnu.org/onlinedocs/gcc-4....defined-Macros

    C'est un problème de ton implémentation (Hou la bonne blague) => Dev-C++ utilise MinGW => implémentation de gcc pas prête pour C99. Avec djgpp ou cygwin, ces macros sont correctement définies.

    A+

  12. #12
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Et juste comme ça, est-ce qu'un -pedantic ne permettrait pas d'afficher les bon warning ?

  13. #13
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Emdel => En effet avec "%I64d" le nombre s'affiche sans problème.
    PRomu@ald => Là il indique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Warning] ISO C does not support the `I64' printf length modifier
    Foobar1329 => Je suis sous DevC++
    Donc c'est à ce niveau là qu'il y a un problème?

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Citation Envoyé par Foobar1329
    Hello,
    Contrairement à ce que l'on peut penser __STRICT_ANSI__ n'est pas défini seulement pour -ansi, mais aussi pour -std=..., apparemment aussi si c'est c99 et pas seulement c89 ou c90.
    Euh... La doc ne parle pas de __STDC__ ...
    Normalement, c'est cette macro-là qui est définie en C99...

    C'est un problème de ton implémentation (Hou la bonne blague) => Dev-C++ utilise MinGW => implémentation de gcc pas prête pour C99. Avec djgpp ou cygwin, ces macros sont correctement définies.
    A+
    Le GCC de Dev-C++ accepte -std=c99
    Edit : On peut plus faire un abus de langage, à présent... Pffff...
    Le problème, si j'ai bien compris, c'est que les long long sont disponibles mais leurs constantes n'apparaissent pas dans <limits.h> ?

    seriousme: Oui, c'est que les auteurs de mingW n'ont pas pensé à changer cela.
    On peut faire un bug report?
    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.

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par seriousme
    Emdel => En effet avec "%I64d" le nombre s'affiche sans problème.
    PRomu@ald => Là il indique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Warning] ISO C does not support the `I64' printf length modifier
    Foobar1329 => Je suis sous DevC++
    Donc c'est à ce niveau là qu'il y a un problème?
    Comme on se tue à le dire, Dev-C++, c'est vieux et non maintenu.

    Tu peux néanmoins mettre à jour les outils gnu (gcc et autres. Par exemple, j'ai gcc 3.4.2 sur mon Code::Blocks) avec le gestionnaire de DevPacks....

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Dev-C++ aussi a GCC 3.4.2...
    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.

  17. #17
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Le GCC de Dev-C++ est compatible C99 (en tout cas, il accepte -std=c99)
    Ca c'est une nouvelle ! gcc supporterait c99 (et en plus sous windows et dev-c++ !)

    Même la page officielle ne fait pas support complet du c99...

    http://gcc.gnu.org/c99status.html

    Citation:
    Foobar1329 a écrit :
    Hello,
    Contrairement à ce que l'on peut penser __STRICT_ANSI__ n'est pas défini seulement pour -ansi, mais aussi pour -std=..., apparemment aussi si c'est c99 et pas seulement c89 ou c90.

    Euh... La doc ne parle pas de __STDC__ ...
    Normalement, c'est cette macro-là qui est définie en C99...
    __STRICT_ANSI__ devrait être définie pour l'option -ansi. Le man est d'ailleur très explicite :

    The macro "__STRICT_ANSI__" is predefined when the -ansi option is used

  18. #18
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    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 <limits.h>
     
    int main ()
    {
       long long n = LLONG_MAX;
     
       printf ("n = %I64d\n", n);
       return 0;
    }
    Code testé sur un mac tout ce qu'il y a de plus standard :


    test.c: In function 'main':
    test.c:8: warning: format '%I64d' expects type 'int', but argument 2 has type 'long long int'
    Le résultat :
    n = I64d

  19. #19
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par PRomu@ld
    Code testé sur un mac tout ce qu'il y a de plus standard :

    J'ai pourtant bien expliqué que c'était pour PC/Windows...
    Citation Envoyé par -ed-
    Le formateuir n'a rien à voir avec le compilateur, mais avec la bibliothèque C. Sur PC/Windows, c'est Microsoft qui régale, et ce n'est donc pas C99. (C'est pour ça que C99 sur PC/Windows, je demande à voir...[1])

    En attendant, tu peux remplacer "ll" par "I64" et ça marche.

  20. #20
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    J'ai pourtant bien expliqué que c'était pour PC/Windows...
    Mais j'en suis conscient, c'est juste qu'ici (comme on le fait remarquer très souvent), nous sommes dans un forum C et donc pas sur un forum développement Windows ...


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. décallage sur long long int
    Par trax44 dans le forum C
    Réponses: 9
    Dernier message: 26/02/2006, 11h41
  2. MyISAM & les accès concurrentiels: le "miracle"
    Par twkjp dans le forum Outils
    Réponses: 3
    Dernier message: 09/09/2005, 17h02
  3. [cr 8.5] comment exploiter les données d'un "array"
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 12
    Dernier message: 09/06/2005, 14h03
  4. [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