OVH Cloud OVH Cloud

memcpy et char

50 réponses
Avatar
Alain CROS
Bonjour.

J'ai écrit une fonction qui remplace la virgule par un point dans une chaine de caractères pour ensuite permettre de faire un
calcul.
Pour copier une chaine dans une autre chaine, j'utilise memcpy.
Est ce nécessaire d'écrire
memcpy(ch, c, sizeof(char) * taille);
ou bien je peux me contenter d'écrire
memcpy(ch, c, taille);

Toutes critiques sur la fonction seront les bienvenues.

Merci.

Alain CROS

#include <string.h>

int convstrnum(int taille, char *c)
/* Remplace, dans une chaine de caractères représentant un chiffre,
la virgule par un point.
Retourne :
la position de ce point dans la chaine (base 1).
0 si pas de point.
-1 si pas un chiffre (la chaine reste inchangée).
*/
{
int i = 1, j = 0, k = 0;
char ch[taille + 1];
char *pch = ch;
memcpy(ch, c, sizeof(char) * taille);
ch[taille] = '\0';
while(*pch != '\0')
{
if((*pch < '0') || (*pch > '9'))
switch(*pch)
{
case '.':
j = (++k == 2) ? -1 : j;
break;
case ',':
*pch-- = '.';
j = i--;
break;
default:
j = -1;
}
if(j == -1)
break;
*pch++;
i++;
}
if(j != -1)
memcpy(c, ch, sizeof(char) * taille);
return(j);
}

10 réponses

1 2 3 4 5
Avatar
Charlie Gordon
"Harpo" wrote in message
news:43371c8c$0$17210$
Emmanuel Delahaye wrote:

Il suffit d'utiliser un index basé en 0 comme il se doit et
c'est tout.


Bien sûr, moi aussi je pense que les gens qui comptent à partir de 1
méritent le bûcher, nous ne saurions admettre cette hérésie et elle
doit être combattue toutes affaires cessantes.
Cependant, et pour me faire l'avocat du diable, Alain a une bonne raison
d'avoir choisi cette interface et, si elle n'est pas la meilleure
possible, elle est au moins raisonnée.


Quelle est-donc cette bonne raison qui nous échappe ?

--
Chqrlie.


Avatar
Charlie Gordon
"Harpo" wrote in message
news:433735bd$0$1717$
Alain CROS wrote:


int convstrnum(int taille, char *c)


Il y a comme qui dirait un sérieux progrès, mais je l'ai simplement lu
en diagonale.

2 ou 3 trucs :

Essaye de donner des noms encore plus parlant à tes variables,
personnellement trouver le nom des variables et autres identifieurs me
prend environ 50% du temps de l'écriture du code, et encore c'est quand
c'est un jour où j'ai de l'imagination. Bien que je pense que ce temps
soit excessif, je ne pense pas qu'il soit perdu.


Il est important effectivement de nommer les variables correctement.
i est un nom correct pour l'indice d'une boucle simple
loopIndex est un nom débile pour cette variable.

Tu écris des trucs comme :
if ( blqh )
blurb ;


Je n'ai pas vu Alain séparer les parenthèses des expressions de test avec des
espaces, ou pire encore les point-virgule de fin d'instruction... quel style
horrible.

il est très rare que cela se justifie
écris plutôt :
if ( blqh )
{
blurb ;
}


non, c'est sans doute moins risqué, mais ce n'est pas plus lisible.

Si tu ne comprends pas pourquoi, un jour tu comprendras.
Où alors :
if ( blqh ) {
blurb ;
}


ça éventuellement, sans les espaces inutiles, ni l'accent d'ailleurs :-)
C'est d'ailleurs le style de K&R pour les blocs non triviaux

Je crois d'ailleurs que je vais revenir à ce style.


faites ce que je dis, je m'y mets bientôt ;-)

Le style d'écriture est très important, cela donne une cohérence.
J'essaye de me conformer à peu près aux standards ci-dessous.
http://www.gnu.org/prep/standards/standards.html
sauf lorsque je considère que mon idée est meilleure et que j'ai de
bonnes raisons de penser qu'elle l'est,


Justement, les conventions GNU sont encore différentes en ce qui concerne
l'exemple que tu donnes.
Leur convention pour le positionnement des accolades est horrible.

le principal est qu'un même
style soit utilisé dans un projet, au minimum dans un fichier source.


indéniablement !

--
Chqrlie.


Avatar
Charlie Gordon
"Harpo" wrote in message
news:43373889$0$27405$
Charlie Gordon wrote:

Cependant, et pour me faire l'avocat du diable, Alain a une bonne
raison d'avoir choisi cette interface et, si elle n'est pas la
meilleure possible, elle est au moins raisonnée.


Quelle est-donc cette bonne raison qui nous échappe ?


Si 0 doit indiquer que la fonction s'est bien déroulée sans avoir
modifié la chaîne, O ne peut pas désigner l'offset de la virgule
transformée en point. Il n'est pas spécifié qu'un nombre ne peut
commencer par une virgule.
La valeur de retour 0 serait ambigue.
Bien que cela soit d'une élégance douteuse, passer la position à la
place de l'offset se justifie.


Je cite Alain CROS:

/* Remplace, dans une chaine de caractères représentant un chiffre,
la virgule par un point.
Retourne :
la position de ce point dans la chaine (base 1).
0 si pas de point.
-1 si pas un chiffre (la chaine reste inchangée).
*/

0 veut simplement dire "pas de point" et implicitement, chaine correcte.
La documentation d'Alain mentionne cela en second, on peut donc supposer que
l'objectif principal de cette fonction est de retourner la position du point.
Dès lors, les 2 autres résultats possibles doivent effectivement être cohérents
avec la séantique principale. Tordre la sémantique principale en prenant la
base 1 et en appelant cela abusivement "position" est une mauvaise solution,
peut-être le fruit d'une expérience dans d'autres langages.

--
Chqrlie.



Avatar
Charlie Gordon
"Harpo" wrote in message
news:43373889$0$27405$

Ton fuseau horaire est mal réglé, cela trouble les serveurs de news et certains
de leurs clients ;-)

Path:
writer!fr.colt.net!colt.net!newsfeed.icl.net!proxad.net!193.252.118.146.MISMATCH
!news.wanadoo.fr!news.wanadoo.fr!not-for-mail
Message-ID: <43373889$0$27405$
From: Harpo
Subject: Re: memcpy et char
Newsgroups: fr.comp.lang.c
Date: Mon, 26 Sep 2005 01:52:22 -0400
References: <4333e995$0$17469$
<4335b780$0$5400$
<4336f07f$0$18817$

<43371c8c$0$17210$ <dh79us$skj$
Organization: ARG ; Association pour la Rehabilitation du Goto
User-Agent: KNode/0.8.2
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8Bit
Lines: 15
NNTP-Posting-Date: 26 Sep 2005 01:53:45 CEST
NNTP-Posting-Host: 83.195.26.119
X-Trace: 1127692425 news.wanadoo.fr 27405 83.195.26.119:32842
X-Complaints-To:
Xref: writer fr.comp.lang.c:86708
Avatar
Harpo
Emmanuel Delahaye wrote:

Pourquoi est-ce aussi compliqué avec des +1 et des -1 dans tous les
sens.


Ou vois-tu des +1 et des -1 dans tous les sens ?

Il suffit d'utiliser un index basé en 0 comme il se doit et
c'est tout.


Bien sûr, moi aussi je pense que les gens qui comptent à partir de 1
méritent le bûcher, nous ne saurions admettre cette hérésie et elle
doit être combattue toutes affaires cessantes.
Cependant, et pour me faire l'avocat du diable, Alain a une bonne raison
d'avoir choisi cette interface et, si elle n'est pas la meilleure
possible, elle est au moins raisonnée.

Avatar
Harpo
Alain CROS wrote:


int convstrnum(int taille, char *c)


Il y a comme qui dirait un sérieux progrès, mais je l'ai simplement lu
en diagonale.

2 ou 3 trucs :

Essaye de donner des noms encore plus parlant à tes variables,
personnellement trouver le nom des variables et autres identifieurs me
prend environ 50% du temps de l'écriture du code, et encore c'est quand
c'est un jour où j'ai de l'imagination. Bien que je pense que ce temps
soit excessif, je ne pense pas qu'il soit perdu.

Tu écris des trucs comme :
if ( blqh )
blurb ;

il est très rare que cela se justifie
écris plutôt :
if ( blqh )
{
blurb ;
}

Si tu ne comprends pas pourquoi, un jour tu comprendras.
Où alors :
if ( blqh ) {
blurb ;
}

Je crois d'ailleurs que je vais revenir à ce style.

Le style d'écriture est très important, cela donne une cohérence.
J'essaye de me conformer à peu près aux standards ci-dessous.
http://www.gnu.org/prep/standards/standards.html
sauf lorsque je considère que mon idée est meilleure et que j'ai de
bonnes raisons de penser qu'elle l'est, le principal est qu'un même
style soit utilisé dans un projet, au minimum dans un fichier source.

Avatar
Harpo
Charlie Gordon wrote:

Cependant, et pour me faire l'avocat du diable, Alain a une bonne
raison d'avoir choisi cette interface et, si elle n'est pas la
meilleure possible, elle est au moins raisonnée.


Quelle est-donc cette bonne raison qui nous échappe ?


Si 0 doit indiquer que la fonction s'est bien déroulée sans avoir
modifié la chaîne, O ne peut pas désigner l'offset de la virgule
transformée en point. Il n'est pas spécifié qu'un nombre ne peut
commencer par une virgule.
La valeur de retour 0 serait ambigue.
Bien que cela soit d'une élégance douteuse, passer la position à la
place de l'offset se justifie.


Avatar
Pierre Habouzit
Charlie Gordon wrote:

Justement, les conventions GNU sont encore différentes en ce qui concerne
l'exemple que tu donnes.
Leur convention pour le positionnement des accolades est horrible.


comment ? tu n'aimes pas :

if (blah)
{
gerbons_ensemble();
}

(ok, je connais la sortie)
--
·O· Pierre Habouzit
··O
OOO http://www.madism.org

Avatar
Pierre Habouzit
Faudra regarder si leurs pretentions en termes d'optimisations sont
justifiees. Ils citent essentiellement gcc comme reference, qui n'est pas
super fort en optimisations, surtout au niveau du code generé pour des
architectures particulieres, alors qu'on peut imaginer qu'un compilateur
produit par intel n'a que cela comme objectif.



à priori, les gentoo-istes et autres accros du réchauffement climatique par
CPU montrent que pour des applis particulières (typiquement calculatoires)
icc fait du meilleur travail, et avec des résultats sensiblement meilleurs
(un gain de l'ordre de 5 à 10% si mes souvenirs sont bons).

Pour des applis que j'appelerais "de la vraie vie" (ie un tableur, un
traitement de texte et autres applis avec des cycles de calculs courts dans
le temps) la différence est ultra minime.

Quant à ce qui est de gcc, pas mal de monde s'accorde à dire que gcc4.1
(encore non paru) devrait vraiment améliorer les choses -- j'en sais rien à
vrai dire.

Et puis de toute facon, le "combat" d'optimisation de code C compilé est
complètement obsolète et réservé à des vieux barbus (j'ai rien contreles
vieux barbus). Là où les compilateurs se battent aujourd'hui, c'est plutôt
sur le plan de tenter de compiler du C++ (1) rapidement (2) vers du code
pas trop inefficace. Et là dessus, gcc a encore bien du travail.

<private>
Et puis de toute facon, plus personne ne fait du C, ni même de C++
aujourd'hui. Quelle idée, maintenant il y a Java !!!
</private

--
·O· Pierre Habouzit
··O
OOO http://www.madism.org

Avatar
Pierre Habouzit
Faudra regarder si leurs pretentions en termes d'optimisations sont
justifiees. Ils citent essentiellement gcc comme reference, qui n'est pas
super fort en optimisations, surtout au niveau du code generé pour des
architectures particulieres, alors qu'on peut imaginer qu'un compilateur
produit par intel n'a que cela comme objectif.



à priori, les gentoo-istes et autres accros du réchauffement climatique par
CPU montrent que pour des applis particulières (typiquement calculatoires)
icc fait du meilleur travail, et avec des résultats sensiblement meilleurs
(un gain de l'ordre de 5 à 10% si mes souvenirs sont bons).

Pour des applis que j'appelerais "de la vraie vie" (ie un tableur, un
traitement de texte et autres applis avec des cycles de calculs courts dans
le temps) la différence est ultra minime.

Quant à ce qui est de gcc, pas mal de monde s'accorde à dire que gcc4.1
(encore non paru) devrait vraiment améliorer les choses -- j'en sais rien à
vrai dire.

Et puis de toute facon, le "combat" d'optimisation de code C compilé est
complètement obsolète et réservé à des vieux barbus (j'ai rien contreles
vieux barbus). Là où les compilateurs se battent aujourd'hui, c'est plutôt
sur le plan de tenter de compiler du C++ (1) rapidement (2) vers du code
pas trop inefficace. Et là dessus, gcc a encore bien du travail.

<private>
Et puis de toute facon, plus personne ne fait du C, ni même de C++
aujourd'hui. Quelle idée, maintenant il y a Java !!!
</private>

--
·O· Pierre Habouzit
··O
OOO http://www.madism.org

1 2 3 4 5