alors si je reprend bien en c je peut faire une fonction de type void* et faire return UnString et le recuperer!
alors si je reprend bien en c je peut faire une fonction de type void* et faire return UnString et le recuperer!
Ma vision n'etait pas celle d'un programmeur C++, mais celle de la theorie des types: j'etais en train d'expliquer pourquoi c'etait un trou dans le systeme de type. Le but d'un systeme de type c'est de ne pas permettre ce genre d'erreur, quite a interdire des operations valides (c'est pourquoi il y a generalement moyen de contourner le systeme de type, avec des casts par exemple).Envoyé par Trap D
Ce n'est pas un type de fonction. Tu peux faire une fonction qui retourne un void*,Envoyé par jerem2000
dans un double*. Oui... maintenant, l'effet est potentiellement desastreux. Si tu recuperes dans un char*, ca ira mieux.et faire return UnString et le recuperer!
Et ?Envoyé par jerem2000
http://emmanuel-delahaye.developpez....tes.htm#malloc
Pourquoi tu compiles en C++ ? Tu écris en C ou en C++ ? Parce que ici, c'est le forum C. Alors décide toi.Envoyé par jerem2000
Le C et le C++ sont des langages différents.
http://david.tribble.com/text/cdiffs.htm
je compile en c++ et jecrit en c++ et jai besoin de cette fonction malloc!
En tout cas, c'est pratique et simple. Evidemment, il faut être réveillé, car le C, c'est pas le Pascal... C'est un vrai langage de geeks... On travaille sans filets... Si on aime pas le C, les alternatives ne manquent pas...Envoyé par Jean-Marc.Bourguet
Ah ? De mémoire, en C, la conversion T* <-> void* est garantie par la norme. Faut que je vérifie ?Envoyé par Jean-Marc.Bourguet
Tu ne confonds pas avec const ?Envoyé par Jean-Marc.Bourguet
void, je ne sais même pas si ça existe en C++. Alors void * ...
"C'est un langage pour les hommes, les vrais ceux qui ne font pas d'erreurs... "Envoyé par Emmanuel Delahaye
C'est un genre de discours qui ne m'interpelle pas. Je suis faillible, je fais des erreurs. Les gens autour de moi en font aussi. On travaille plus efficacement quand le compilateur les signale avant qu'elles ne se signalent elles-même par des erreurs de fonctionnement.
Etre limite et ne pas pouvoir contourner le système de type quand c'est nécessaire m'embête tout comme avec des trous dans le systeme de type.
T* -> void* -> T* est garanti. Mais U* -> void* -> T* pas. Donc void* -> T* n'est pas garanti en general.Envoyé par Emmanuel Delahaye
Non, mais je me trompais. Apres vérifications, void a bien ete introduit en C avant que C++ ne commence. Et void* a ete introduit dans les deux langages a peu pres en même temps.Envoyé par Emmanuel Delahaye
Ben oui, c'est ce que je dis, il faut savoir ce qu'on fait...Envoyé par Jean-Marc.Bourguet
Heureux es-tu de ne jamais te tromper et d'avoir des collegues aussi infaillibles que toi... mes collegues et moi sommes plus humains et nous constatons regulierement que nous ne savons pas toujours ce que nous faisons. Nous nous demandons aussi -- parfois a tord, parfois a raison -- si nos predecesseurs savaient ce qu'ils faisaient.Envoyé par Emmanuel Delahaye
Ca ne me derange pas de signaler que je pense avoir bien considere la situation quand je tape dans des choses potentiellement dangereuses... A peu pres le seul endroit ou devoir caster un void* serait genant, c'est en tant que retour de malloc et realloc, et ca ne m'embeterait pas plus que cela.
Je ne suis pas pour changer la situation en C -- je ne suis pas tres loin de la position de B. Stroustrup qui trouve que l'augmentation de la compatibilite en C et C++ est une raison suffisante pour changer la regle en C++ -- mais on ne me fera pas dire qu'elle est une bonne chose en soi.
Avec conversion implicite:Envoyé par Jean-Marc.Bourguet
Avec conversion explicite:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void *pv = NULL; const void *pcv = NULL; int *pi; const int *pci; pi = pv; //OK pci = pv; //OK pci = pv; //Signale une erreur de compil pci = pcv; //OK
Tu comprends maintenant l'intéret de la conversion implicite de void* ? Moins de risque de perte de const
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void *pv = NULL; const void *pcv = NULL; int *pi; const int *pci; pi = (int *)pv; //OK pci = (const int *)pv; //OK pci = (int *)pv; //Ça compile, mais c'est pas OK! Perte du const sans warning! pci = (const int *)pcv; //OK
cast et typecast sont des démons...Envoyé par Médinoc
Ben oui.
Heureusement qu'en C on peut s'en passer plus facilement qu'en C++...
Ah... tu veux dire que le trou introduit par la conversion implicite void* vers T* n'est pas aussi gros qu'il aurait pu l'être, même s'il n'est pas sûr quant au type, il l'est quant à la quantification.Envoyé par Médinoc
Il faut admettre que le C accorde une grande importance à const. Il permetet interdit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 char const* p1; char p2; p2 = strchr(p1, 'x'); *p2 = 'y';
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 char const* const* const* p1; char const*** p2; p1 = p2;
strchr() est un problème connu, corrigé par le C++ sous forme de surcharge de la fonction.
Personnellement, quand j'ai affaire à une fonction de ce style, j'en déclare deux versions avec des noms différents et puis basta...
Une autre chose que le C refuse (pourquoi??) et que le C++ accepte, c'est ceci:
Par contre, les deux refusent:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char ** pps; char const * const * pcpcs = pps;
Pour des raisons que j'avais mis du temps à comprendre. En fait, en modifiant *ppcs, on pourrait mettre des const char * dedans, qui seraient alors accessibles en écriture par pps...
Code : Sélectionner tout - Visualiser dans une fenêtre à part char const ** ppcs = pps;
Enfin, justement, ce n'est pas parce que le C a des bugs de const-correctness qu'il faut pinailler sur quelque chose qui est enfin bien fait dans ce sens!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager