Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Un exemple de cast utile sans pointeur

53 réponses
Avatar
Marc Boyer
Je me permets de vous demander un brin d'aide, encore.

Je cherche un exemple simple où la conversion par
cast est nécessaire. Je trouve rien sans devoir
introduire des pointeurs...

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

10 réponses

1 2 3 4 5
Avatar
Marc Boyer
Jean-Marc Bourguet wrote:
Marc Boyer writes:
Jean-Marc Bourguet wrote:
Autre chose exemple (dans la veine unsigned):

char c;
if (isprint((unsigned char) c)) {

}

Si on ne caste pas, on risque d'avoir la mauvaise reponse pour 'ÿ' si
char est signe.


J'avoue ne pas m'attarder sur le caractère signé ou non de char.


Des que tu utilises isXXXX, il faut caster en non signe sinon il y a
un conflit avec le fait que ces fonctions sont definies aussi pour
EOF.


Je présente pas les isXXX ;-)

De meme, il faut faire attention a ne pas stocker le resultat de
getch dans un char avant d'avoir comparer avec EOF.


D'ou l'usage de feof ;-)

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(



Avatar
Jean-Marc Bourguet
Marc Boyer writes:

Jean-Marc Bourguet wrote:
Marc Boyer writes:
Jean-Marc Bourguet wrote:
Autre chose exemple (dans la veine unsigned):

char c;
if (isprint((unsigned char) c)) {

}

Si on ne caste pas, on risque d'avoir la mauvaise reponse pour 'ÿ' si
char est signe.


J'avoue ne pas m'attarder sur le caractère signé ou non de char.


Des que tu utilises isXXXX, il faut caster en non signe sinon il y a
un conflit avec le fait que ces fonctions sont definies aussi pour
EOF.


Je présente pas les isXXX ;-)

De meme, il faut faire attention a ne pas stocker le resultat de
getch dans un char avant d'avoir comparer avec EOF.


D'ou l'usage de feof ;-)


Tu n'enseignes donc pas a faire de la gestion d'erreur sur le resultat
des E/S?

De plus je ne suis pas sur que c'est garanti avec getc/getchar
(pourquoi diable ai-je ecrit getch, j'ai plus utilise curses depuis
des annees?) et c'est une technique qui ne fonctionne pas avec les
autres fonctions d'entree (par exemple fgets). La technique classique
en C (comme en C++), c'est de tester si l'operation d'IO c'est bien
passee et ensuite de tester si c'est du a une erreur ou la fin de
fichier.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org




Avatar
Antoine Leca
En , Jean-Marc Bourguet va escriure:
Autre chose exemple (dans la veine unsigned):

char c;
if (isprint((unsigned char) c)) {

}

Si on ne caste pas, on risque d'avoir la mauvaise reponse pour 'ÿ' si
char est signe.


Tu m'expliquera comment ton code permet d'éviter cela...
À vue de nez, quand par hasard EOF aboutit dans c, tu vas
justement tester les propriétés de 'ÿ'...

En l'occurrence, la chose à ne pas faire (et à ne pas surtout pas
enseigner), c'est

char c;

À remplacer par

int c;

Merci d'avance pour le 'ÿ'!

Là où tu as raison, c'est que c'est un cas d'utilisation des transtypages:
si tu as déclaré ton c comme int, le jour où tu vas extraire un caractère
d'une chaîne, là il va falloir transtyper:

char *p;

c = (unsigned char) *p++;


Justement pour que le isprint() marche comme il faut...


Antoine

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Marc Boyer wrote:

Je me permets de vous demander un brin d'aide, encore.

Je cherche un exemple simple où la conversion par
cast est nécessaire. Je trouve rien sans devoir
introduire des pointeurs...

Marc Boyer


Pour printf():

#include <stdio.h>

int x = 1234;

printf ("%ldn", (long) x);

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Marc Boyer wrote:

Voui, mais là, j'aurais pas encore présenté size_t...
Je pense faire size_t avec l'allocation dynamique.


Dommage. size_t est le bon type pour un indice.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Benoit Dejean
Le Tue, 17 Feb 2004 15:14:24 +0000, Marc Boyer a écrit :

Je me permets de vous demander un brin d'aide, encore.

ce n'est pas tout a fait en rapport, mais voici ma petite perle

journalière à propos des cast

struct rdv
{
time_t, dateDebut, dateFin;
char nom[100];
};

(int)rdvTmp = malloc(sizeof(rdvTmp->dateDebut)*2+100);

bon, outre le fait que l'argument de malloc est problématique, j'ai
demandé à cet étudiant

« mais pourquoi ce cast (affreux, merci gcc) de l-value ? »

réponse:
« warning: initialization makes pointer from integer without a cast »

:D

Avatar
Horst Kraemer
On 17 Feb 2004 15:14:24 GMT, Marc Boyer
wrote:

Je me permets de vous demander un brin d'aide, encore.

Je cherche un exemple simple où la conversion par
cast est nécessaire. Je trouve rien sans devoir
introduire des pointeurs...


unsigned u1 = 65535;
unsigned u2 = <?>;

unsigned long ul = (unsigned long)u1 * u2 ;


[ La norme ne garantit pas qu'un nombre >2^16-1e535 peut être
représenté par un unsigned. Elle garantit cependant que tout nombre
non négatif <2^32 peut être représenté par un unsigned long ].

--
Horst

Avatar
Marc Boyer
Jean-Marc Bourguet wrote:
Marc Boyer writes:

Jean-Marc Bourguet wrote:
Marc Boyer writes:
Jean-Marc Bourguet wrote:
Autre chose exemple (dans la veine unsigned):

char c;
if (isprint((unsigned char) c)) {

}

Si on ne caste pas, on risque d'avoir la mauvaise reponse pour 'ÿ' si
char est signe.


J'avoue ne pas m'attarder sur le caractère signé ou non de char.


Des que tu utilises isXXXX, il faut caster en non signe sinon il y a
un conflit avec le fait que ces fonctions sont definies aussi pour
EOF.


Je présente pas les isXXX ;-)

De meme, il faut faire attention a ne pas stocker le resultat de
getch dans un char avant d'avoir comparer avec EOF.


D'ou l'usage de feof ;-)


Tu n'enseignes donc pas a faire de la gestion d'erreur sur le resultat
des E/S?


Non. D'ailleurs, je ne leur montre même pas le prototype
de getchar, juste le nom de la fonction et man.
Un cours, c'est un subtil équilibre entre ce qu'il faut
expliquer et ce qu'il pourront comprendre seul en lisant les
docs. J'ai fait le choix de ne pas consacrer de temps aux
merde^Wsubtilités des E/S standart en C.
Je leur parle de robustesse "en général", je m'attarde
un peu sur *scanf, fgets et leurs amies.
Mais voilà, j'ai pas 20h devant moi...

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(





Avatar
Marc Boyer
Emmanuel Delahaye wrote:
In 'fr.comp.lang.c', Marc Boyer wrote:

Je me permets de vous demander un brin d'aide, encore.

Je cherche un exemple simple où la conversion par
cast est nécessaire. Je trouve rien sans devoir
introduire des pointeurs...

Marc Boyer


Pour printf():

#include <stdio.h>

int x = 1234;

printf ("%ldn", (long) x);


Pourquoi imprimer un long quand on a un int ?
C'est juste pour l'exemple où il y a une raison qui
m'échappe.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
Marc Boyer
Emmanuel Delahaye wrote:
In 'fr.comp.lang.c', Marc Boyer wrote:

Voui, mais là, j'aurais pas encore présenté size_t...
Je pense faire size_t avec l'allocation dynamique.


Dommage. size_t est le bon type pour un indice.


Voui, peut-être mais:

1) c'est un typedef, et pas un type de base, et ça me pose
problème dans l'enchainement des parties du cours (d'ailleurs,
K&R2d n'en parle pas avant le premier tiers de son livre)

2) ça demande une attention certaine chaque fois qu'on
écrit une boucle décroissante jusqu'à 0

3) ça complique toutes les interractions avec les signés

Donc, size_t, on attendra 15 jours avant de leur en
parler.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


1 2 3 4 5