Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2338 connectés 

  FORUM HardWare.fr
  Programmation
  C

  portabilité architecture 32 bits

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

portabilité architecture 32 bits

n°720287
cyrca
Posté le 10-05-2004 à 10:30:06  profilanswer
 

Bonjour,
    je viens solliciter votre aide à propos de deux progammes en C pour lesquels les questions suivantes me sont posées:
en supposant une architecture 32 bits, ce code est-il portable ?
fonctionne-t-il ? si oui que donne-t-il en sortie ?
 
Voici les deux codes:
1/
#include <stdio.h>
int main(void)
 {
         char toto[5]="12345";
         long *x;
         x=(long *) toto;
         printf("=> %lX\n", *x);
         x=(long *) (toto+1);
         printf("=> %lX\n", *x);
         return 0;
 }
 
2/
int main(void)
{
        char toto[256];
        long x=0x31323334;
        memcpy(toto, (char *) &x, sizeof(x));
        toto[4]='\0';
        printf("=> %s\n", toto);
        return 0;
}
 
Je vous remercie d'avance pour votre aide précieuse

mood
Publicité
Posté le 10-05-2004 à 10:30:06  profilanswer
 

n°720296
BENB
100% Lux.
Posté le 10-05-2004 à 10:35:51  profilanswer
 

C'est un devoir que tu veux nous faire faire...
 
Juste des indices :  
dans quel ordre range-t-on le octets
et mefie toit des seg-faults...

n°720298
cyrca
Posté le 10-05-2004 à 10:38:27  profilanswer
 

eh bien pour tout dire ce n'est pas un devoir, mais un questionnaire auxquel je dois répondre pour trouver un job...

n°720302
cyrca
Posté le 10-05-2004 à 10:40:51  profilanswer
 

mais merci pour les indices!

n°720452
Taz
bisounours-codeur
Posté le 10-05-2004 à 12:19:48  profilanswer
 

char toto[5]="12345";  
 
boum ....
 
memcpy(toto, (char *) &x, sizeof(x));
 
cast inutile,
sizeof x et non pas sizeof(x)
 
sinon ce n'est absolument pas portables

n°720484
Kyle_Katar​n
Posté le 10-05-2004 à 12:46:38  profilanswer
 

Taz, juste par curiosité, tu peux me dire pourquoi
"sizeof x et non pas sizeof(x)" ?
 

n°720493
cyrca
Posté le 10-05-2004 à 12:51:56  profilanswer
 

Merci TAZ,
je vais essayer d'interpréter ton "boum".
Pour quelle raison ces codes ne sont pas portables?

n°720496
Taz
bisounours-codeur
Posté le 10-05-2004 à 12:52:28  profilanswer
 

pour lever une ambiguité
la notation parenthésée est nécessaire pour distinguer un nom de type d'une variable
 
alors autant ne pas s'embrouiller  ... j'en entends déjà dire que sans parenthèse ça fait pas propre ... mais sizeof est un opérateur, pas une fonction.
 
surtout que tu peux avoir une variable avec le meme identificateur qu'un type


Message édité par Taz le 10-05-2004 à 12:58:49
n°720497
blackgodde​ss
vive le troll !
Posté le 10-05-2004 à 12:52:48  profilanswer
 

bin ca devrait tourner sur les architectures 32 bits je crois, par contre les résultats affichés dépendent de l'endian de la machine ...


---------------
-( BlackGoddess )-
n°720516
Taz
bisounours-codeur
Posté le 10-05-2004 à 13:00:36  profilanswer
 

non. problème d'alignement, problème de boutisme.
 
le résultat dépend de l'architecture ? donc non portable. le fait de pouvoir être compilé et exécuté sans dégat apparent ne prouve pas que quelque chose est portable.

mood
Publicité
Posté le 10-05-2004 à 13:00:36  profilanswer
 

n°720521
blackgodde​ss
vive le troll !
Posté le 10-05-2004 à 13:04:42  profilanswer
 

oui, la portabilité est que sur toutes les architectures les résultats soit les mêmes, ce qui sera pas le cas.
 
le boutisme = endian en anglais je crois ?
 
sinon pour l'alignement, je vois pas réellement le pb ?
un alignement de 4 veut dire par exemple que la :
char toto[5]="12345";
chaque char sera mis tous les 4 octets en mémoire ?


---------------
-( BlackGoddess )-
n°720528
Taz
bisounours-codeur
Posté le 10-05-2004 à 13:09:59  profilanswer
 

lis les voyages de gulliver en français

n°720560
djdie
L'heure, c'est l'heure.
Posté le 10-05-2004 à 13:41:25  profilanswer
 

Taz a écrit :

char toto[5]="12345";  
 
boum ....

Non pas boum, le 0 final de l'initialiseur est ignoré. Ca ferait boum si toto était utilisé plus loin dans un contexte où on attend une chaine de caractères, mais ce n'est pas le cas.

n°720579
Taz
bisounours-codeur
Posté le 10-05-2004 à 13:53:53  profilanswer
 

si ça fait boom. tu as une chaine invalide. le contexte induit une sémantique textuelle. c'est une erreur en C++ d'ailleurs. pour lever toute ambiguité, utiliser {1, 2, 3, 4, 5}

n°720590
djdie
L'heure, c'est l'heure.
Posté le 10-05-2004 à 14:01:41  profilanswer
 

Non en C c'est correct, en C++ je ne sais pas mais ce n'est pas la question :-). Exemple tiré directement du standard C99:

Code :
  1. char t[3] = "abc";
  2. is identical to:
  3. char t[] = {'a', 'b', 'c'};

(6.7.8.32)
 
(ajouté): bien sûr ici toto est initialisé avec {'1','2','3','4','5'} et non {1,2,3,4,5}...


Message édité par djdie le 10-05-2004 à 14:04:08
n°720616
Taz
bisounours-codeur
Posté le 10-05-2004 à 14:36:42  profilanswer
 

mais j'amais di le contraire ... je diste juste que c'est une pratique à risque qui aurait du être banni

n°720648
djdie
L'heure, c'est l'heure.
Posté le 10-05-2004 à 14:55:56  profilanswer
 

ah ben par 'boom' je pensais que tu disais qu'il y avait une erreur dans le code :o

n°720662
HelloWorld
Salut tout le monde!
Posté le 10-05-2004 à 15:06:05  profilanswer
 

char toto[5]="12345";  
printf(toto);
 
Ca fait boom.
 
=> char toto[6]="12345";


Message édité par HelloWorld le 10-05-2004 à 15:06:44
n°720876
djdie
L'heure, c'est l'heure.
Posté le 10-05-2004 à 16:35:33  profilanswer
 

Evidemment, d'ou ce que j'ai écrit : "Ca ferait boum si toto était utilisé plus loin dans un contexte où on attend une chaine de caractères, mais ce n'est pas le cas."


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  portabilité architecture 32 bits

 

Sujets relatifs
question d'architecture de projet python + wxPython[Question] MySQL / C++ / portabilité
[DirectX 9] Où est passé le mode 10 bits par composante ?champs de bits, need help
portabilité windows/Linux du code[PHP] entiers 64 bits ??
[Client/serveur] Architecture qui me parait looooourde ![architecture] appli-web
[Divers] Utilisation d'une architecture LDAP - Commentairesjava est -il valable si on utilise pas sa portabilité ??
Plus de sujets relatifs à : portabilité architecture 32 bits


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)