Logo du forum
 

Forum TTH-News

| Inscription | | Recherche | | FAQ | | Accueil | | Liste des membres |
| Calendrier |
 
Vous n'êtes pas identifié! [Connexion] ou [Inscription] Forum » Programmation » [C / C++ / C#] » Compilation 32/64 bits
Login Mot de passe

1 visiteurs sur ce topic (0 membre(s), 1 invité(s) )


Auteur
Sujet : Compilation 32/64 bits
zorgh
Master
Membre # 7668

 Avatar du membre
Lieu : FRANCE

Messages :
869 (0.16 par jour)


Score :

Message du 07-05-2009 @ 19:16      Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   


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 :


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é.
----------
Toshiba M30X-125 Intel Centrino PM 1,7 Ghz - 1 Go DDR - DD 60 Go - 15,4"W TFT - Ati Radeon 9700
- Haut de page -
nuts
Vétéran
Membre # 1869

 Avatar du membre
Lieu : Alsace

Messages :
11289 (1.91 par jour)


Score :

Message du 08-05-2009 @ 22:40   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

et si justement tu mets dse unsigned int a la place de simple int ca corrige pas?
----------
PC: Phenom 2 X2 3.2GHz@3.7GHz, 10Go ddr, caviar 500Go sata, Radeon 7790 GHz Edition, Win10 pro 64bits
Station Silicon Graphics Octane R10000 250MHz, 384Mo de Ram, 8.5Go SCSI, IRIX 6.5.30
Netbook Acer AspireOne Intel atom n270 1.6GHz, 1Go de RAM; 160Go, Arch 32bits
Xbox360 Gamertag "xylphute"
- Haut de page -
zorgh
Master
Membre # 7668

 Avatar du membre
Lieu : FRANCE

Messages :
869 (0.16 par jour)


Score :

Message du 08-05-2009 @ 22:46   Site personnel   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Oui cela corrige l'alerte.

J'ai le même soucis avec un autre code selon l'architecture 32 ou 64 bits :

Code :


#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.
----------
Toshiba M30X-125 Intel Centrino PM 1,7 Ghz - 1 Go DDR - DD 60 Go - 15,4"W TFT - Ati Radeon 9700
- Haut de page -


Aller dans le forum :  

Plan du forum | Contacter l'administrateur

Powered by SoulBB 3.0.1
© Soulmanto, 2003-2010

Valid XHTML 1.0 Transitional

Page générée en 0.038 secondes