Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/08/2006, à 11:19

Prince

Portabilité d'un code

Bonjour,

je voudrais savoir si ce code est portable et si ce n'est pas le cas, pourquoi ?

Merci

int g(unsigned int n, char *res){
  if (n>9) return 1;
  *res='0'+n;
  return 0;
}

#2 Le 28/08/2006, à 13:26

azertyman

Re : Portabilité d'un code

à partir du moment où tu utilises pas de bibliothèque ou de fonctions propre à un environnement, tout code C est (normalement) portable.
Venir nous demander si le code est portable n'est pas la bonne solution :
- as-tu constaté qu'il ne l'était pas
- quelles erreurs de compilation/execution as-tu eu ? sous quelle plateforme ?

C'est si tu nous fournit ces éléments que nous te répondrons, nous ne sommes pas là pour faire les tests à ta place.

Au passage, que doit faire ce code ? D'après ce que comprend, si n>9, il retournera 1 et retournera également 0 : j'ai l'impression que ce n'est pas correct (mais cette erreur est portable wink)

Hors ligne

#3 Le 28/08/2006, à 13:34

lunique

Re : Portabilité d'un code

A partir du moment où une fonction croise un return, elle s'arrete.
Cette fonction sert a transformer un entier en son caractere equivalent. Je crois qu'il y a des bibliotheques standart qui existent pour ce genre de conversion.

Hors ligne

#4 Le 28/08/2006, à 13:36

Riicooo

Re : Portabilité d'un code

@Prince : oui il est portable !

@azertyman : le caractere res sera modifié ! c'est un pointeur, j'imagine que la fonction g a pour but de modifier "res" en lui donnant comme valeur, le caractère n ième après '0' dans le code ASCII, pour n de 0 à 8, res vaut 1 à 9, et pour n = 9, je ne sais pas...

Hors ligne

#5 Le 28/08/2006, à 14:16

yohann

Re : Portabilité d'un code

pour n=0 il renvoie 0 (les code ascii de 0 +0 = le code ascii de 0)
pour n= 9 il renvoi 9 car il ne passe pas le test du if qui dit si n strictement supérieur à 9 ....
donc 9 renvoi 9.
pour n = 10 la fonction renvoie 1 (on peut imagine que c'est un code d'erreur)
bref je crois que la seule faute de ce code est une erreur de convention: en général on renvoi 1 qd tout ce déroule ss pb et 0 en cas de couillage.


j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Hors ligne

#6 Le 28/08/2006, à 14:21

Balkoth

Re : Portabilité d'un code

yohann a écrit :

bref je crois que la seule faute de ce code est une erreur de convention: en général on renvoi 1 qd tout ce déroule ss pb et 0 en cas de couillage.

C'est le contraire : par convention on renvoie 0 quand tout c'est bien passé, et on renvoie une autre valeur pour signifier une erreur.

Hors ligne

#7 Le 28/08/2006, à 14:29

yohann

Re : Portabilité d'un code

ok je suis pas expert donc je m'incline, mais pour moi 0 faux et 1 vrai donc 0 pas bon 1 vrai, mes profs me montraient toujours la fonction main de cpp qui se termine par return 1 mais sont humains ils peuvent se planter (ça m'étonnerais pas trop d'ailleur qd je repense à d'autre chose qu'ils m'ont dit...)

Donc ce code est portable et ne comprte aucune erreur.

@azertyman: un code peut ne pas être portable sans pour autant faire appel a des bibliothèques, exemple: un main qui ne retourne rien compile avec Windows et Visual c++ mais retournera une erreur sous un systeme unix (j'ai pas vérifié mais c'est mes profs qui me disait de toujours retourner quelque chose dans le main pour cette raison)


j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Hors ligne

#8 Le 28/08/2006, à 14:42

Prince

Re : Portabilité d'un code

Salut,

je me pose cette question car il me semble que la fonction est correcte lorsqu'on utilise le code ASCII mais ça ne l'est plus lorsqu'on utilise le code EBCDIC.
En ASCII, les lettres sont contigues et pas en EBCDIC.
vous confirmez que le code est portable ?

#9 Le 28/08/2006, à 20:29

Bouazza

Re : Portabilité d'un code

Si tu utilises while(*ptr_chaine!=0) au lieu de strlen , le code va être portables vers toutes les architechtures !

Hors ligne

#10 Le 28/08/2006, à 20:31

Bouazza

Re : Portabilité d'un code

et puis , *res='0'+n; sert à quoi ? si c'est pour convertir un int en un char représentant le même int , je te conseille de faire *res='%'+n; .

Hors ligne

#11 Le 28/08/2006, à 21:32

Visu@lSt@tion

Re : Portabilité d'un code

Perso je trouverais le code portable et plus propre si il était comme ca :

int g(unsigned int n, char *res)
{
	short sTmp;

	if(n>9)
	{
		sTmp=1;
	}
	else
	{
		*res=30+(char)n;
		sTmp=0;
	}

 	return sTmp;
}

Au moins tu évites les caractères spéciaux au début et tu tiens compte du fait que un char c'est automatiquement 1 octet. roll

@ Edit : En ASCII, le code est sur 7bits pour les caractères et en EBSCII sur 8 et c'est le bit de poids fort qui est actif pour le EBSCII.

Dernière modification par Visu@lSt@tion (Le 28/08/2006, à 21:36)


[ Site Web - Serveur Perso ]
[ Windows Xp Pro,Windows Serveur 2003, Gentoo 2006.1, Ubuntu 7.04 (Apache2, Php 5 & MySQL5||ORACLE) ]
[ "Un interface chaise clavier défaillant est équivalent à un ordinateur vérolé à la base !" ]

Hors ligne

#12 Le 28/08/2006, à 21:40

coffee

Re : Portabilité d'un code

yohann a écrit :

@azertyman: un code peut ne pas être portable sans pour autant faire appel a des bibliothèques, exemple: un main qui ne retourne rien compile avec Windows et Visual c++ mais retournera une erreur sous un systeme unix (j'ai pas vérifié mais c'est mes profs qui me disait de toujours retourner quelque chose dans le main pour cette raison)

yohann, j'ai l'impression que tu confonds "laxisme du compilateur" et portabilité.

exemple:

int main(void)
{
     printf("hello");
     return 0;
}

marchera bien sous windows ou linux (ou n'importe quel autre OS)

void main(void)
{
     printf("hello");
}

marchera bien sous windows ou linux (ou n'importe quel autre OS), la valeur par défaut retourné peut être:
- 0
- La valeur de retour de la dernière fonction du programme
- une valeur aléatoire (peut-etre, jamais vu mais bon...)

int main(void)
{
     printf("hello");
}

là ça se complique, on attend une valeur de retour mais il n'y en a pas.
Visual C++ va considérer que la fonction renvoit 0 (on peut lui demander d'etre plus strict)
gcc signale l'erreur et arrete la compilation (on doit pouvoir lui demander d'etre moins strict)
etc...

Le "truc", c'est que sous un système unix, on aime bien savoir si son appli a marché ou a planter lamentablement. C'est plus par philosophie que par nécessité technique.

Tant que tu as un compilateur, ton langage est portable wink, le tout est d'avoir des bibliothèques porté.

@Bouazza string.h est une bibliothèque de base du langage C...

@Prince ton code marchera, il fera ce que tu lui a demandé de faire, après si tu as pas gérés le changement de table de codage de caractères, c'est un autre problème selon moi.


Nom d'un tupperware habillé en streetware mangeant de la confiture de pouère et qui se dite où est-ce que je suis ouère !
Tiens mon blog
Les blagues sous forme de fausses aides sont susceptible de ban (ex: rm)

Hors ligne

#13 Le 29/08/2006, à 11:21

yohann

Re : Portabilité d'un code

merci pour les précision coffe, en effet je confondais, c'est plus clair maintenant


j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Hors ligne

#14 Le 29/08/2006, à 14:12

Bouazza

Re : Portabilité d'un code

coffee a écrit :

@Bouazza string.h est une bibliothèque de base du langage C...

Mais il y a des compilateurs minimalistes qui n'ont pas de librairie standard , et si on dit portable , on doit aussi penser à ces compilateurs , et puis , utiliser while(*ptr_chaine!='\0') permettra d'économiser une boucle et d'améliorer les performances de quelques millisecondes à quelques secondes (sur des vieux AT par exemple ... ) .

Hors ligne

#15 Le 31/08/2006, à 10:51

lunique

Re : Portabilité d'un code

Je vais peut etre dire une connerie mais il me semble que la portabilité ne se pose pas au niveau du compilateur mais au niveau du systeme non ? Car meme si un compilateur minimaliste n'installle pas par defauts les librairies, suffit de les installer et il arrivera a faire les liens non ?

P.S. Elle est où la boucle qu'on economise avec while(*ptr_chaine!='\0') ?

Hors ligne

#16 Le 31/08/2006, à 15:19

coffee

Re : Portabilité d'un code

@lunique: Pour rester poli: Dans Ta Chaine lol

Bon sinon, si le compilateur est pas glop, tout ce que tu économiseras, c'est un appel de fonctions selon moi vu que c'est la définition de la fonction strlen...


Nom d'un tupperware habillé en streetware mangeant de la confiture de pouère et qui se dite où est-ce que je suis ouère !
Tiens mon blog
Les blagues sous forme de fausses aides sont susceptible de ban (ex: rm)

Hors ligne