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 :

Comportement étrange compilation 32/64 bits


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Par défaut Comportement étrange compilation 32/64 bits
    Bonjour,

    J'ai une sortie différente selon que je compile sous environnement 32 bits ou sous environnement 64 bits.

    Soit la fonction suivante :

    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
     
    void write(char *file, int team)
    {
    	int fd;
    	char* buffer = (char*)malloc(sizeof(char)*256) ;
    	memset(buffer,0,256) ;
     
    	if ((fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0744)) == -1) {
        fprintf (stderr, "Erreur en ouverture.\n") ;
        exit(0) ;
    	}
    	else
    	{
    		printf("PID :%d Equipe :%d\n", getpid(), team);
    		snprintf (buffer, sizeof(buffer)+1,"%d\n%d\n", getpid(), team); 
    		printf("Buffer : %s Sizeofbuffer : %d\n", buffer, sizeof(buffer)+1);
    		write(fd, buffer, strlen(buffer)); 
    		free(buffer) ; 
    		close (fd) ; 
                    printf("Ecriture réussie sur le fichier %s\n", file);
    	}
    }
    Le fichier créé porte le nom G500. J'y inscrit le numéro du PID et un numéro d'équipe.

    Sous 32 bits, la sortie est la suivante :

    PID :7931 Equipe :22
    Buffer : 7931 Sizeofbuffer : 5
    Ecriture réussie sur le fichier /tmp/G500
    $ cat /tmp/F0678
    7931ubuntu@ubuntu~/Projet$

    La compilation se passe sans erreur mais la taille du buffer ne permet pas d'écrire les 2 données. Seule la taille du PID est inscrite dans le fichier.

    Sous 64 bits, la sortie est la suivante :

    Buffer : 19624
    22 Sizeofbuffer : 9
    Ecriture réussie sur le fichier /tmp/F0255$ cat /tmp/F0255
    19624
    22ubuntu@ubuntu~/Projet$

    La compilation génère cette erreur sur la ligne : snprintf (buffer...
    attention : format ‘%d’ expects type ‘int’, but argument 3 has type ‘long unsigned int’

    Merci pour vos contributions et votre regard éclairé.

  2. #2
    Expert confirmé
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	char* buffer = (char*)malloc(sizeof(char)*256) ;
    ....
                 snprintf (buffer, sizeof(buffer)+1,...
    sizeof buffer donne la taille en bytes de la variable buffer.
    buffer est un pointeur (sur char) donc on obtient la taille d'un pointeur sur char qui est pour toi sur 32 bits 4 et sur 64 bits 8. Cette valeur n'a rien à voir avec la taille allouée par le malloc (256).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Par défaut
    Merci bien pour ce complément d'infos mais j'ai le même soucis avec ce code :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <signal.h>
    #include <string.h>
    #include <time.h>
    #include <ctype.h>
     
    #define SIZE 1024
    #define BUF 256
     
    int main(int argc, char **argv)
    {
      int pfd[2];
      int nread;
      int number, n;
      int pid;
      char buf[SIZE];
     
      if (pipe(pfd) == -1)
      {
        perror("pipe failed");
        exit(1);
      }
      if ((pid = fork()) < 0)
      {
        perror("fork failed");
        exit(2);
      }
     
      if (pid == 0)
      {
        /* child */
        close(pfd[1]);
        while ((nread = read(pfd[0], buf, SIZE)) != 0)
         printf("Number %s\n", buf);
        close(pfd[0]);
      } else {
        /* parent */
        close(pfd[0]);
     
        for (n = 0; n < 5; n++)
       	{
       		number = (rand() % 999) + 1;
       		snprintf (buf, BUF,"%d", number);
       		write(pfd[1], buf, strlen(buf)+1);  		
       	}
        close(pfd[1]);
      }
      exit(0);
    }
    Sous l'architecture 64, ma sortie est :

    Number 479
    Number 665
    Number 154
    Number 269
    Number 501

    Sous l'architecture 32, ma sortie est :

    Number 479

    Je ne comprends pas.

Discussions similaires

  1. [AppleScript] Comportement étrange des "if" juste après compilation
    Par Flore22 dans le forum AppleScript
    Réponses: 0
    Dernier message: 23/04/2010, 08h48
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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