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 :

uint64_t long long LLONG_MAX sur windows10


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut uint64_t long long LLONG_MAX sur windows10
    Bonjour à tous,

    Sur Unix ça fonctionne, sur windows ............... j'ai cherché pas mal partout...............
    Il y a des warnings mais ça fonctionne.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    /* aloc.c  K&R  SE page 101*/
    /*
     * x86_64-pc-cygwin-gcc-7.3.0.exe  -Wall -Werror -pedantic -ansi  -m64 -std=c99  aloc.c  -o aloc.exe
     *
     * Elle demande au compilateur d’utiliser le standard c99,
     * par défaut gcc compile en gnu89 qui est simplement du c89 avec quelque extensions comme les commentaires à la C++,
     * la définition de variable au milieu du code ou encore les « compound litterals », etc…
     *
     * 2.0 to the power of 64.0 is 18446744073709551616.0
     * LLONG_MAX                n = 9223372036854775807
     * sizeof *alloc=8
     * *allocp=0
     * allocp=4299190272       n=10    allocp=4299190282       pointeur sur=4299190272
     * allocp=4299190282       n=20    allocp=4299190302       pointeur sur=4299190282
     * allocp=4299190302       n=30    allocp=4299190332       pointeur sur=4299190302
     * allocp=4299190332       n=40    allocp=4299190372       pointeur sur=4299190332
     */
     
    #define __STDC_FORMAT_MACROS
    #include <inttypes.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <limits.h>
    #include <math.h>
     
     
    #define ALLOCSIZE 100			/* size of available space */
     
    static char  allocbuf [ALLOCSIZE];	/* storage for alloc */
    static char  *allocp = allocbuf;	 /* //next free position  -std=c99 */
     
    char   *alloc(int n)			/* return pointer to n charracters */
    {
      if (allocbuf + ALLOCSIZE - allocp >= n)	/* it fits */
        {
        printf("\nallocp=%"PRId64"\tn=%d\t", (uint64_t)allocp, n);
        allocp += n;
        printf("allocp=%"PRId64"\t",  (uint64_t)allocp );
        return allocp - n;		/* old p */
        }
      else				/* not enough room */
        {
        return 0;
        }
    }
     
     
    int main(int argc, char *argv[])
    {
      int  i = 0;
      uint64_t  retournee;
      uint64_t n = LLONG_MAX;
      double x = 2.0, y = 64.0, z;
      z = pow( x, y );
     
      printf( "\n%.1f to the power of %.1f is %.1f\n", x, y, z );
      printf ("LLONG_MAX                n = %"PRId64"\n", n);
      printf("sizeof *alloc=%"PRId64" \n", sizeof (char *));
      printf("*allocp=%"PRId64" \n",  (uint64_t)*allocp);
     
      while ((i += 10) < ALLOCSIZE)
        {
        retournee =  (uint64_t) alloc(i);
        if(retournee != 0)
          {
          printf("pointeur sur=%"PRId64" \n",  retournee);
          }
        /* system("pause"); */
        }
      return 0;
    }
     
     
    void afree(char *p)   /* free storage pointed to by p  */
    {
      if(p >= allocbuf && p < allocbuf + ALLOCSIZE)
        {
        allocp = p;
        }
    }
    J'ai essayé avec x86_64-w64-mingw32-gcc-8.1.0.exe , ce n'est pas mieux.

    Sur développez, il y avait une discussion sérieuse attribuant l'impossibilité à MSVCRT.dll utilisé par gnu.

    https://www.developpez.net/forums/d1...f/#post7102636


    Qu'est-ce à dire , il faut mettre une dll à jour? Où la trouvé?


    Ouf!

    JPD

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    C'est quoi la question? Où est le problème? Quels sont les warnings? Il est sûr que Msvcrt.dll de 1998 peut poser un problème avec des types plus récent mais mingw ne l'utilise certainement plus. Le titre n'aide pas.

  3. #3
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,
    ma boule de cristal me parle d'un header stdint.h et d'une macro UINT64_MAX … et de plein de choses du même genre … mais ce n'est qu'une boule de cristal.

  4. #4
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    J'ai essayé des headers toutes les possibilités de printf : %d %u %llu %ll %lld %"PRId64" %"I64d" %\"I64\"d %"I64"d etc

    rien ne va.



    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
     
     x86_64-w64-mingw32-gcc-6.4.0.exe  -Wall -Werror -pedantic -ansi  -m64 -std=c99  aloc.c  -o aloc.exe  aloc.c: Dans la fonction «*alloc*»:
    aloc.c:27:45: error: format «*%d*» attend un argument de type «*int*» mais l'argument 2 a le type «*long long int[-Werror=format=]
         printf("allocbuf + ALLOCSIZE - allocp  %d\n", (allocbuf + ALLOCSIZE - allocp)); /* ajout▒ par jp */
                                                 ^
    aloc.c:27:45: error: format «*%d*» attend un argument de type «*int*» mais l'argument 2 a le type «*long long int[-Werror=format=]
    aloc.c:28:23: error: format «*%d*» attend un argument de type «*int*» mais l'argument 2 a le type «*char **» [-Werror=format=]
         printf("allocbuf %d\n", (allocbuf));
                           ^
    aloc.c:28:23: error: format «*%d*» attend un argument de type «*int*» mais l'argument 2 a le type «*char **» [-Werror=format=]
    aloc.c:29:23: error: format «*%d*» attend un argument de type «*int*» mais l'argument 2 a le type «*char **» [-Werror=format=]
         printf("allocp   %d\n", (allocp));
                           ^
    aloc.c:29:23: error: format «*%d*» attend un argument de type «*int*» mais l'argument 2 a le type «*char **» [-Werror=format=]
    cc1 : tous les avertissements sont traités comme des erreurs

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Je commence peut-être à comprendre la question.
    Est-ce "comment afficher un pointeur et un long long avec printf?"? La doc indique %p pour le pointeur et %lld ou %llu ou %llx pour les long long.
    Et un long long n'est pas la même chose qu'un uint_32, il peut être plus grand ou plus petit.

  6. #6
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    %lld ou %llu ou %llx

    Ne fonctionnent pas.


    JPD

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

Discussions similaires

  1. [X10-FMX]Mon application est trop long a demarrer sur IOS
    Par mario9 dans le forum Composants FMX
    Réponses: 3
    Dernier message: 14/11/2015, 09h05
  2. décallage sur long long int
    Par trax44 dans le forum C
    Réponses: 9
    Dernier message: 26/02/2006, 11h41
  3. comment afficher un long long ?
    Par HRS dans le forum C
    Réponses: 2
    Dernier message: 14/02/2006, 02h05
  4. Réponses: 6
    Dernier message: 06/12/2005, 16h54
  5. DBLink et types LONG/LONG RAW
    Par bchristo dans le forum Administration
    Réponses: 7
    Dernier message: 28/04/2004, 12h46

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