portabilité architecture 32 bits

portabilité architecture 32 bits - C - Programmation

Marsh Posté le 10-05-2004 à 10:30:06    

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

Reply

Marsh Posté le 10-05-2004 à 10:30:06   

Reply

Marsh Posté le 10-05-2004 à 10:35:51    

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...

Reply

Marsh Posté le 10-05-2004 à 10:38:27    

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

Reply

Marsh Posté le 10-05-2004 à 10:40:51    

mais merci pour les indices!

Reply

Marsh Posté le 10-05-2004 à 12:19:48    

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

Reply

Marsh Posté le 10-05-2004 à 12:46:38    

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

Reply

Marsh Posté le 10-05-2004 à 12:51:56    

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

Reply

Marsh Posté le 10-05-2004 à 12:52:28    

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
Reply

Marsh Posté le 10-05-2004 à 12:52:48    

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 )-
Reply

Marsh Posté le 10-05-2004 à 13:00:36    

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.

Reply

Marsh Posté le 10-05-2004 à 13:00:36   

Reply

Marsh Posté le 10-05-2004 à 13:04:42    

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 )-
Reply

Marsh Posté le 10-05-2004 à 13:09:59    

lis les voyages de gulliver en français

Reply

Marsh Posté le 10-05-2004 à 13:41:25    

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.

Reply

Marsh Posté le 10-05-2004 à 13:53:53    

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}

Reply

Marsh Posté le 10-05-2004 à 14:01:41    

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
Reply

Marsh Posté le 10-05-2004 à 14:36:42    

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

Reply

Marsh Posté le 10-05-2004 à 14:55:56    

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

Reply

Marsh Posté le 10-05-2004 à 15:06:05    

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


Message édité par HelloWorld le 10-05-2004 à 15:06:44
Reply

Marsh Posté le 10-05-2004 à 16:35:33    

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."

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed