Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2311 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Auteur Sujet :

cauchemare de strings...

n°836780
nithril
Posté le 30-08-2004 à 16:17:51  profilanswer
 

Reprise du message précédent :

DocMaboul a écrit :


S'il y en a qui veulent continuer à troller là-dessus, qu'ils envoient leurs remarques aux développeurs du kernel de linux ou de gcc: leur code moisi/pourri/caca en est truffé et je suis sûr qu'ils seront ravis de recevoir vos lumières avisées sur le comment du pourquoi d'un code est correct ou non.


 
s'il utilise des char* c'est pas etonnant qu'il y ait des failles de securité par overflow  :whistle:  
 
char* zTagada = new char[strlen(zPouet)]; //et merde un bug  :na:


Message édité par nithril le 30-08-2004 à 16:18:37
mood
Publicité
Posté le 30-08-2004 à 16:17:51  profilanswer
 

n°836991
chrisbk
-
Posté le 30-08-2004 à 19:03:11  profilanswer
 

Nithril a écrit :

s'il utilise des char* c'est pas etonnant qu'il y ait des failles de securité par overflow  :whistle:  
 
char* zTagada = new char[strlen(zPouet)]; //et merde un bug  :na:


 
Tiens, t'utilises les std::string entre temps, toi ? [:petrus75]

n°837173
el muchach​o
Comfortably Numb
Posté le 30-08-2004 à 22:48:04  profilanswer
 

DocMaboul a écrit :

Bon, je ne nie pas l'intérêt des structures/objets strings mais affirmer que le char*, c'est pourri/moisi/caca, c'est complètement niaiseux. S'il y en a qui veulent continuer à troller là-dessus, qu'ils envoient leurs remarques aux développeurs du kernel de linux ou de gcc: leur code moisi/pourri/caca en est truffé et je suis sûr qu'ils seront ravis de recevoir vos lumières avisées sur le comment du pourquoi d'un code est correct ou non.


 
Mauvais exemple : les développeurs du noyau, ils ont le temps et les moyens qu'il faut pour réécrire et débugger complètement leur code, c'est à dire tout le temps nécessaire pour un produit de qualité. Quand à ceux de gcc, outre qu'ils ont les mêmes facilités, ils utilisent un GC.
Quand à tes progrmmmeurs, si en plus d'être débutants tu leur conseillais du char* à tout va, pas étonnant que le projet ait explosé les délais.  
Perso, j'utilise les char* là où je n'ai pas le choix, et à des endroits très localisés, mais dès que possible, je store/transmets les chaines de caractère sous forme de string, c'est bcp plus propre.


Message édité par el muchacho le 30-08-2004 à 23:04:22

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°837185
Taz
bisounours-codeur
Posté le 30-08-2004 à 23:05:56  profilanswer
 

merci el muchacho

n°837338
HelloWorld
Salut tout le monde!
Posté le 31-08-2004 à 02:48:02  profilanswer
 

Tout simplement c'est des projets en C, et là y'a pas débat y'a rien d'autre. Donne nous un projet sérieux en C++ qui utilise les char * à la place d'une classe string, et on n'en reparlera.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°837342
docmaboul
Posté le 31-08-2004 à 03:46:26  profilanswer
 

HelloWorld a écrit :

Tout simplement c'est des projets en C, et là y'a pas débat y'a rien d'autre. Donne nous un projet sérieux en C++ qui utilise les char * à la place d'une classe string, et on n'en reparlera.


 
Vous n'allez pas me dire que ces mecs sont infoutus de se faire des structures string avec les fonctions qui vont bien. Tout ce qu'on peut faire en C++, on peut aussi le faire en C, même si c'est parfois compliqué.

n°837343
docmaboul
Posté le 31-08-2004 à 04:06:49  profilanswer
 

el mariachi a écrit :

Mauvais exemple : les développeurs du noyau, ils ont le temps et les moyens qu'il faut pour réécrire et débugger complètement leur code, c'est à dire tout le temps nécessaire pour un produit de qualité. Quand à ceux de gcc, outre qu'ils ont les mêmes facilités, ils utilisent un GC.


 
Bref, si je comprends bien, les programmeurs open-source sont des masos qui choisissent volontairement de perdre leur temps à utiliser des nids à bugs alors qu'ils pourraient utiliser leur temps à optimiser leurs algos. C'est fou ce que le monde comporte comme programmeurs idiots qui n'ont manifestement rien de mieux à faire que de gaspiller leur temps :heink:
 
Je viens de jeter un coup d'oeil au source de mysql. Au milieu de milliers de char*, je tombe là-dessus:

Code :
  1. class String
  2. {
  3.   char *Ptr; /* Ave, Satanas! */


 
Plus loin, il y a du free, du malloc, du realloc, du memcpy dans l'implémentation de la classe. Beurk, encore des idiots finis qui font du C en C++... :pfff: Il faudrait qu'ils songent sérieusement à venir prendre des cours de programmation sur ce forum.

n°837359
el muchach​o
Comfortably Numb
Posté le 31-08-2004 à 08:09:00  profilanswer
 

Encore une fois, ton premier exemple est un mauvais exemple :
les programmeurs d'OS utilisent à bon droit le C, puisque ce langage est le meilleur langage pour la programmation bas niveau. Et pour cause, il a été créé justement pour ça, pour écrire Unix. Une fois qu'on fait du C, on fait forcément du char *. Mais si on choisit un langage donné, c'est qu'on estime que sa puissance et ses fonctionnalités sont bien adaptées à ses besoins. Je peux donc te retourner ta remarque et supposer que les milliers de langages qui existent ont été créés en pure perte alors qu'on peut tout faire en C (voire en asm). C'est fou ce que les programmeurs peuvent gaspiller comme temps CPU... seulement voila, on dit souvent que le "programmer cycle" coûte plus cher que le "computer cycle". Tout est question de choix. Si le "programmer cycle ne coûte rien (à part de la sueur et le risque de ne jamais aller au bout si on entreprend un projet au-dessus de ses moyens), comme en open source, on peut tout faire au niveau le plus bas si ça nous chante. Dans le cas contraire, il est bien évident qu'il faut minimiser les risques.
Des exemples, on peut en trouver dans tous les domaines. Si Emacs est tjrs utilisé et tjrs en développement 20 ans après la version 0, c'est uniquement dû au fait qu'il est écrit à 90% en Lisp et non en C. Faire des modifs complexes de code en Lisp est infiniment plus simple qu'en C, comme en témoignent tous les major-modes de l'éditeur. Pourtant, Stallman n'est pas le dernier des programmeurs, mais il continue à bosser dessus alors que si Emacs avait été écrit en C, ce monstre aurait probablement été depuis longtemps abandonné éu profit de ses innnombrables concurrents.
 
Ton deuxième exemple est plutôt un bon exemple, puisque si les auteurs de MySQL écrivent une classe String, cela démontre bien qu'ils ont bien l'intention de l'utiliser, et de limiter au maximum l'utilisation de char*.
Dans une BD, où les chaînes de caractère sont un type fondamental, le choix d'une classe String bien adaptée est une évidence. Dans une BD, s'encombrer de char* aurait été une source de difficultés intarissable. Je suppose que dans le domaine de la BD, une classe String spécifique est nécessaire (pour des raisons de stockage et de recherche rapide, entre autres, je suppose). En l'occurence, après avoir écrit une classe String de qualité, ils ont pu se concentrer sur la qualité des algorithmes qui font la rapidité de la base.


Message édité par el muchacho le 31-08-2004 à 08:23:12

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°837587
nithril
Posté le 31-08-2004 à 11:14:36  profilanswer
 

Je pense pouvoir dire sans me tromper que derriere toutes class string ya un tableau de caractères
... ou alors il y a un truc que l'on ne m'aurait pas dit :??: (Mulder?)
 
 

Citation :

Bref, si je comprends bien, les programmeurs open-source sont des masos qui choisissent volontairement de perdre leur temps à utiliser des nids à bugs alors qu'ils pourraient utiliser leur temps à optimiser leurs algos


 
prend pas ton cas pour une généralité, tous les programmeurs opensource n'utilisent pas que le C


Message édité par nithril le 31-08-2004 à 11:14:51
n°837600
HelloWorld
Salut tout le monde!
Posté le 31-08-2004 à 11:21:15  profilanswer
 

DocMaboul a écrit :

Tout ce qu'on peut faire en C++, on peut aussi le faire en C, même si c'est parfois compliqué.


Bah bah bah. Le C c'est nul. Tout ce qu'on peut faire en C on peut le faire en assembleur, même si c'est parfois compliqué. Et c'est bien plus rapide.  

Citation :

Bref, si je comprends bien, les programmeurs open-source sont des masos qui choisissent volontairement de perdre leur temps à utiliser des nids à bugs alors qu'ils pourraient utiliser leur temps à optimiser leurs algos. C'est fou ce que le monde comporte comme programmeurs idiots qui n'ont manifestement rien de mieux à faire que de gaspiller leur temps :heink:


KDE, wxWidgets, QT, ... ils utilisent une classe string.

Citation :

Je viens de jeter un coup d'oeil au source de mysql. Au milieu de milliers de char*, je tombe là-dessus:  
[...]
Plus loin, il y a du free, du malloc, du realloc, du memcpy dans l'implémentation de la classe


L-A-M-E-N-T-A-B-L-E
t'aurais simplement pu dire qu'on était des bouzes parce que std::string utilise en interne des char *, et que new utilise malloc etc...
Moi j'arrête là, on arrivera à rien avec toi.
Au passage, pour ta remarque sur les idiots, c'est aussi valable dans l'autre sens "les mecs qui ont créé le C++, il faudrait qu'ils songent sérieusement à venir prendre des cours de programmation avec DocMaboul."
Tu aimes le C ? Tu aimes les char * ? Ben jette un oeil aux sources de FLEX. FLEX, c'est en C, c'est hyper rapide, ça utilise à font les char *, ouai super !
Oui mais FLEX, à mon avis, il gagne haut la main l'IOCCC (http://www.ioccc.org/)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 31-08-2004 à 11:21:15  profilanswer
 

n°837738
docmaboul
Posté le 31-08-2004 à 12:56:51  profilanswer
 

HelloWorld a écrit :

Bah bah bah. Le C c'est nul. Tout ce qu'on peut faire en C on peut le faire en assembleur, même si c'est parfois compliqué. Et c'est bien plus rapide.


 
Prout prout prout. Ce que vous dites est vrai mais je n'ai jamais dit que le C++, c'est nul.
 

Citation :

L-A-M-E-N-T-A-B-L-E


 
Je vous retourne le compliment. Ecrire une fonction de quatre lignes avec des char* en y foutant déjà un gros bug, effectivement, c'est "L-A-M-E-N-T-A-B-L-E" et j'aurai dû me dire que vous n'aviez pas les compétences requises pour les utiliser et encore moins pour les critiquer.
 

Citation :

t'aurais simplement pu dire qu'on était des bouzes parce que std::string utilise en interne des char *, et que new utilise malloc etc...


 
Je me suis déjà moqué gentiment de taz avec les appels au runtime C dans la stl, oui.
 

Citation :

Moi j'arrête là, on arrivera à rien avec toi.


 
Bon débarras. Vous êtes d'une mauvaise foi consternante.
 

Citation :

Au passage, pour ta remarque sur les idiots, c'est aussi valable dans l'autre sens "les mecs qui ont créé le C++, il faudrait qu'ils songent sérieusement à venir prendre des cours de programmation avec DocMaboul."


 
Ca m'étonnerait fort que les mecs qui codent la stl déblatèrent autant de conneries.


Message édité par docmaboul le 31-08-2004 à 12:57:05
n°837773
docmaboul
Posté le 31-08-2004 à 13:19:59  profilanswer
 

el muchacho a écrit :

Encore une fois, ton premier exemple est un mauvais exemple :
les programmeurs d'OS utilisent à bon droit le C, puisque ce langage est le meilleur langage pour la programmation bas niveau. Et pour cause, il a été créé justement pour ça, pour écrire Unix. Une fois qu'on fait du C, on fait forcément du char *. Mais si on choisit un langage donné, c'est qu'on estime que sa puissance et ses fonctionnalités sont bien adaptées à ses besoins. Je peux donc te retourner ta remarque et supposer que les milliers de langages qui existent ont été créés en pure perte alors qu'on peut tout faire en C (voire en asm). C'est fou ce que les programmeurs peuvent gaspiller comme temps CPU... seulement voila, on dit souvent que le "programmer cycle" coûte plus cher que le "computer cycle". Tout est question de choix. Si le "programmer cycle ne coûte rien (à part de la sueur et le risque de ne jamais aller au bout si on entreprend un projet au-dessus de ses moyens), comme en open source, on peut tout faire au niveau le plus bas si ça nous chante. Dans le cas contraire, il est bien évident qu'il faut minimiser les risques.


 
Là, je suis tout à fait d'accord avec vous, enfin presque, mais ce n'est pas exactement ce que vous disiez précedemment sur les char*. Auparavant, j'ai lu une critique des char*, pas de l'utilisation qui en est faite ou non dans un contexte donné (je préfère cette version d'ailleurs). Après, il arrive qu'on se fasse une ou plusieurs structures string en C, mais pas pour les mêmes raisons qu'en C++.
 

Citation :

Des exemples, on peut en trouver dans tous les domaines. Si Emacs est tjrs utilisé et tjrs en développement 20 ans après la version 0, c'est uniquement dû au fait qu'il est écrit à 90% en Lisp et non en C. Faire des modifs complexes de code en Lisp est infiniment plus simple qu'en C, comme en témoignent tous les major-modes de l'éditeur. Pourtant, Stallman n'est pas le dernier des programmeurs, mais il continue à bosser dessus alors que si Emacs avait été écrit en C, ce monstre aurait probablement été depuis longtemps abandonné éu profit de ses innnombrables concurrents.


 
Là, c'est quand même un exemple un peu particulier.
 

Citation :

Ton deuxième exemple est plutôt un bon exemple, puisque si les auteurs de MySQL écrivent une classe String, cela démontre bien qu'ils ont bien l'intention de l'utiliser, et de limiter au maximum l'utilisation de char*.


 
Ca, je n'en sais rien. Pour l'instant, grep me retourne 15 000 lignes de C contenant char* ou char * et 1800 de C++ contenant String (source de mysql-4.1)
 

Citation :

En l'occurence, après avoir écrit une classe String de qualité, ils ont pu se concentrer sur la qualité des algorithmes qui font la rapidité de la base.


 
Je ne pense pas, enfin, pas pour l'instant.

n°837807
HelloWorld
Salut tout le monde!
Posté le 31-08-2004 à 13:37:46  profilanswer
 

Puisque nous n'avons pas les compétences pour juger les char *, laissons faire ceux qui les ont :
http://www.microsoft.com/france/ms [...] 02004.html


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°837854
docmaboul
Posté le 31-08-2004 à 14:28:49  profilanswer
 

HelloWorld a écrit :

Puisque nous n'avons pas les compétences pour juger les char *, laissons faire ceux qui les ont :
http://www.microsoft.com/france/ms [...] 02004.html


 

Mais ici aussi se cache un autre bogue tout aussi difficile à résoudre. Si la longueur du tampon de destination est exactement la même que celle du tampon source, de nombreuses fonctions n ne terminent pas par un null le tampon de destination et l'appel à strlen(szTarget) risque alors de renvoyer une chaîne plus longue que la chaîne cible car il n'existe aucun caractère de fin '\0'. Les choses se sont donc nettement plus problématiques !


 
C'est justement le bug que l'on trouvait dans votre fonction :D Après, faut-il réinventer le runtime C pour éviter la possibilité que ces bugs puissent exister, j'ai comme un (gros) doute. Qualifier ça de nettement plus problématique, pour moi c'est vendre sa camelote et rien de plus.

n°837905
HelloWorld
Salut tout le monde!
Posté le 31-08-2004 à 15:11:10  profilanswer
 

Pas grand chose à voir, (histoire qu'on retire quelque chose d'intéressant de ce topic), mais je viens d'apprendre et de vérifier que la STL de VC 7 contient un petit buffer de 16 octets pour stocker les petites string sans faire d'alloc.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°838047
gilou
Modosaurus Rex
Posté le 31-08-2004 à 16:41:07  profilanswer
 

DocMaboul a écrit :

Bon, el mariachi a bien résumé la position des pro-strings en qualifiant de nid à bugs le char*. Pour moi, ce sont les langages C/C++ qui sont des nids à bugs si j'adopte cette vision. Alors on peut tortiller du cul et se dire que, bon, on va faire sauter:
- tous les appels au runtime C
- tous les appels système
- tous ce qui ressemble d'un peu trop près à un pointeur
- tout ce qui est gestion mémoire
- ...
 
mais avec ce qui reste au final, je ne vois pas où se trouve l'intérêt de faire du C/C++. Autant programmer une machine à laver.


En clair ca veut dire qu'en dehors du C# managed, point de salut? [:chacal_one333]
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°838072
nithril
Posté le 31-08-2004 à 16:50:58  profilanswer
 

DocMaboul a écrit :


C'est justement le bug que l'on trouvait dans votre fonction :D Après, faut-il réinventer le runtime C pour éviter la possibilité que ces bugs puissent exister, j'ai comme un (gros) doute.  


 
Il me semble que microsoft souhaite en arriver la :)


Message édité par nithril le 31-08-2004 à 16:51:24
n°838465
el muchach​o
Comfortably Numb
Posté le 01-09-2004 à 00:26:10  profilanswer
 

DocMaboul a écrit :

Là, je suis tout à fait d'accord avec vous, enfin presque, mais ce n'est pas exactement ce que vous disiez précedemment sur les char*. Auparavant, j'ai lu une critique des char*, pas de l'utilisation qui en est faite ou non dans un contexte donné (je préfère cette version d'ailleurs). Après, il arrive qu'on se fasse une ou plusieurs structures string en C, mais pas pour les mêmes raisons qu'en C++.


 
Ben si. L'expérience montre que les buffer overflows sont source d'une grande quantité de bugs et de la moitié des failles de sécurité.
 
Exemple :  
"We've delayed products such as Windows Server 2003 for nine months because of security issues," says Howard, whose job is to foster expertise among Microsoft programmers"
http://www.nwfusion.com/news/2004/0419codereview.html
 
Vraiment, le char *, c'est la plaie du C, si la classe string a été une priorité pour les créateurs de C++ (c'est pratiquement la première classe étudiée dans le Stroustrup), ce n'est pas pour rien. Alors pourquoi se passer de cette facilité ?


Message édité par el muchacho le 01-09-2004 à 00:39:43

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°838469
Taz
bisounours-codeur
Posté le 01-09-2004 à 00:34:43  profilanswer
 

si la règle du "on ne paie que pour ce qu'on utilise" ne s'était pas appliquée dans ce cas présent, on l'aurait notre type de base string :/

n°838470
chrisbk
-
Posté le 01-09-2004 à 00:38:23  profilanswer
 

Taz a écrit :

si la règle du "on ne paie que pour ce qu'on utilise" ne s'était pas appliquée dans ce cas présent, on l'aurait notre type de base string :/


 
tiens, ca a rien a faire dans ce topic, mais bon, je vais pas en faire un neuf rien que pour ca, pis le char *, on a tout dit dessus, je pense.
Bref, observe plutot et donne moi ton fin avis
 
 

Code :
  1. class A
  2. {
  3. virtual void truc()=0;
  4. }
  5. class B
  6. {
  7. virtual void truc()=0;
  8. }
  9. class C : public A,B
  10. {
  11. virtual void truc()=0;
  12. }
  13. ..
  14. C *truc = getPtrFromAlienInvader();
  15. truc->truc(); //Compilo rale, appel ambigu
  16. truc->A::truc(); // Compile passe, mais pas link. Ce con de compilo essaye de faire un link statique, alors que moi je veux qu'il fasse l'appel a travers la VTable.


 
tu vois comment faire pour que ca passe ? (nan, on peut rien changer au nom des fonctions / tronche des classes :o)
(pis non on caste pas en A non plus :o )


Message édité par chrisbk le 01-09-2004 à 00:40:48
n°838472
Taz
bisounours-codeur
Posté le 01-09-2004 à 00:43:17  profilanswer
 

virtual void truc()=0;
 
quoi ? truc() est virtual pure dans C ? donc je comprends pas ...

n°838474
chrisbk
-
Posté le 01-09-2004 à 00:45:25  profilanswer
 

Taz a écrit :

virtual void truc()=0;
 
quoi ? truc() est virtual pure dans C ? donc je comprends pas ...


 
y'a pas a comprendre, truc est virtuelle pure partout [:petrus75]

n°838475
Taz
bisounours-codeur
Posté le 01-09-2004 à 00:47:01  profilanswer
 

bah alors ou est le problème ?

n°838476
chrisbk
-
Posté le 01-09-2004 à 00:48:19  profilanswer
 

Taz a écrit :

bah alors ou est le problème ?


 
ben le probleme il est que mon supair compilo, soit il rale a cause d'appel ambigu, soit il veut linké en static. Et heuh, le corps de la fonction n'est pas (et ne peut pas etre) accessible au compilo au moment de la compilation.
 
Donc, j'ai l'air d'un con
 

n°838480
Taz
bisounours-codeur
Posté le 01-09-2004 à 00:54:20  profilanswer
 

Code :
  1. #ifndef gbjdkbwcxklbjdfwklbjdfkbjdfgbdfqjgbdf
  2. #define gbjdkbwcxklbjdfwklbjdfkbjdfgbdfqjgbdf
  3. class A
  4. {
  5. public:
  6.   virtual void truc() = 0;
  7.   virtual ~A() { }
  8. };
  9. class B
  10. {
  11. public:
  12.   virtual void truc() = 0;
  13.   virtual ~B() { }
  14. };
  15. class C : public A, B
  16. {
  17. public:
  18.   virtual void truc() = 0;
  19.   virtual ~C() { }
  20. };
  21. C * getPtrFromAlienInvader();
  22. #endif // gbjdkbwcxklbjdfwklbjdfkbjdfgbdfqjgbdf


 

Code :
  1. #include "et.hpp"
  2. #include <iostream>
  3. class D : public C
  4. {
  5. public:
  6.   virtual void truc() { }
  7.   virtual ~D() { std::cout << "Poum\n"; }
  8. };
  9. C * getPtrFromAlienInvader()
  10. {
  11.   static D d = D();
  12.   return &d;
  13. }


 

Code :
  1. #include "et.hpp"
  2. int main()
  3. {
  4.   getPtrFromAlienInvader()->truc();
  5. }

compile nickel avec mes gcc 2.95, 3.3 et 3.4

n°838484
chrisbk
-
Posté le 01-09-2004 à 00:59:40  profilanswer
 

Mäyrde, désolé, erreur dans l'énoncé [:petrus75]
 
 

Code :
  1. class A
  2. {
  3. public:
  4.    virtual void truc() = 0;
  5.    virtual ~A() { }
  6. };
  7. class B
  8. {
  9. public:
  10.    virtual void truc() = 0;
  11.    virtual ~B() { }
  12. };
  13. class C : public A, B
  14. {
  15. };
  16. C * getPtr()
  17. {
  18. return (C*)NULL;
  19. }
  20. void main()
  21. {
  22.    C * truc = getPtr();
  23.    truc->truc();
  24. }


 

Citation :


e:\code\trash\prout2\prout2.cpp(90) : error C2385: ambiguous access of 'truc' in 'C'
        could be the 'truc' in base 'A::truc'
        or the 'truc' in base 'B::truc'


 
 
vala [:petrus75]
 
 
et avec  
 
 

Code :
  1. truc->A::truc();


 

Citation :


prout2.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall A::truc(void)" (?truc@A@@UAEXXZ) referenced in function _main


Message édité par chrisbk le 01-09-2004 à 01:02:09
n°838488
Taz
bisounours-codeur
Posté le 01-09-2004 à 01:08:24  profilanswer
 

oui et alors ? tu vois quelque part une implémentation de truc() ?

n°838489
HelloWorld
Salut tout le monde!
Posté le 01-09-2004 à 01:10:23  profilanswer
 

Pour tout dire sur string et char *, faut rajouter que y'a un cas où string ne doit pas être employé : lors d'un catch ( std::bad_alloc & ).
std::string fait en effet une allocation, et si y'a eu bad_alloc juste avant... (idem pas de string dans std::exception)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°838490
chrisbk
-
Posté le 01-09-2004 à 01:11:59  profilanswer
 

Taz a écrit :

oui et alors ? tu vois quelque part une implémentation de truc() ?


 
Mais c'est pas son probleme au compilo, je veux qu'il fasse l'appel a travers la v-table [:sisicaivrai]

n°838491
Taz
bisounours-codeur
Posté le 01-09-2004 à 01:14:36  profilanswer
 

ok, je vois l'erreur. je comprends pas trop que le compilateur gueule pas d'ailleurs. l'opérateur de portée :: implique une recherche dans le référentiel lexical de la classe. ici ça foire au link ... ça aurait du péter avant. la solutioon à ton problème c'est tout simplement que truc soit un A*

n°838492
chrisbk
-
Posté le 01-09-2004 à 01:17:34  profilanswer
 

moué [:petrus75]. Jkiff pas trop mais bon. Y fait chier, franchement, quoi, une vtable c pas fait pour les ienchs [:petrus75]
 
bref, toussa pour dire que les char *, c'est caca

n°838493
Taz
bisounours-codeur
Posté le 01-09-2004 à 01:20:48  profilanswer
 

quoi tu kiff pas trop ? moi je trouve ça carrémennent plus esthétique

n°838501
docmaboul
Posté le 01-09-2004 à 02:48:08  profilanswer
 

Taz a écrit :

ok, je vois l'erreur. je comprends pas trop que le compilateur gueule pas d'ailleurs. l'opérateur de portée :: implique une recherche dans le référentiel lexical de la classe. ici ça foire au link ... ça aurait du péter avant. la solutioon à ton problème c'est tout simplement que truc soit un A*


 
Ben, c'est pas si étonnant à mon sens. Il doit juste vérifier que la classe C implémente les virtuelles pures lors d'une instanciation d'un objet de cette classe. Comme il n'y en a pas, il ne gueule pas sur la déclaration foireuse de la classe puisque n'ayant pas d'objet, il n'a pas de vtable à construire pour cette classe.


Message édité par docmaboul le 01-09-2004 à 02:56:49
n°838711
Lam's
Profil: bas.
Posté le 01-09-2004 à 13:32:17  profilanswer
 

chrisbk a écrit :

moué [:petrus75]. Jkiff pas trop mais bon. Y fait chier, franchement, quoi, une vtable c pas fait pour les ienchs [:petrus75]
 
bref, toussa pour dire que les char *, c'est caca


 
Bonjour, je vais m'incruster dans votre discussion, si ça ne vous dérange pas.
 
En fait, la classe string est loin d'être parfaite: celle que l'on trouve dans la plupart des implémentations de STL a plusieurs problèmes:
 
1. Elle ne fait pas de reference-counting.  
En l'occurence, avec:  
std::string a ("toto" );
std::string b = a;
On a 2 copies de la chaîne ici. Ce ne serait pas le cas si on copiait (et stockait) des char *.
 
2. Elle n'est pas du tout adaptée à un mix ansi-unicode. La plupart des "gros" projets doivent à un moment ou un autre passer à de l'unicode pour pouvoir vivre joyeusement tout autour du monde. Or, std::wstring n'a pas de format défini (c'est de l'UCS-16 sous Visual Studio/Windows, et de l'UTF-32 sous Forte/Solaris), et c'est une galère sans nom que d'utiliser iconv avec la STL.
 
3. std::string n'est pas du tout thread-safe lors de la concaténation (puisque le buffer peut être déplacé à tout moment).
 
 
Donc, il n'est pas choquant pour les gros projets d'utiliser ses propres classes de gestion de strings, plutôt que de réutiliser celles de la STL.
 
Maintenant, pour un projet de taille moyenne, std::string est probablement la meilleure solution. Il faut juste se souvenir de tout passer par référence. :-)
 
Quand aux projets OSS, ils utilisent du C, parce que beaucoup de "hackers" se méfient du C++ en raison de son histoire un peu houleuse (peu portable jusqu'à récemment, compile 2 fois plus lentement, génére de gros exécutables, les compilos ne sont pas disponibles pour tous les unix, etc, etc.). Et les projets qui bénéficieraient de l'utilisation de C++ sont tous faits en Java de nos jours...
 
--pas de sig.

n°838744
HelloWorld
Salut tout le monde!
Posté le 01-09-2004 à 13:55:50  profilanswer
 

D'abord, std::string ou classe string custom, pas de pblm. std::string a le mérite d'exister, mais elle ne peut pas sattisfaire tout le monde.  
1. ça dépend des STL (celle de VC++ 6 fait du COW & ref. count.) mais normalement elle ne doit pas car le standard ne le permet pas (=> celle de VC++ 7 ne le fait plus).
Le faire avec des char * est pas évident, faut associer à ton char * un compteur... => quand faire le delete ?
2 c'est plutot wcahr_t qui est visé. Une autre classe string unicode va forcément faire un choix, et vu ce que tu viens de dire, ce choix sera adapté ou non à certains compilos. Je ne vois pas trop la spécificité de wstring là dedans.
3. char * non plus ;) et c'est spécifique à chaque implémentation de la STL, mais en général c'est pas le cas. Si on réfléchit c'est normal : le C++ standard ne permet pas de créer des thread, alors... Mais il me semble que pas mal d'implémentations sont + ou - thread safe
http://www.dinkumware.com/libcpp.html
http://www.mvps.org/vcfaq/lang/8.htm
http://www.sgi.com/tech/stl/thread_safety.html


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°838747
Taz
bisounours-codeur
Posté le 01-09-2004 à 13:58:51  profilanswer
 

1) c'est un point de vue
2) tu peux ranger ce que tu veux dans tes std::basic_string
3) peut être que je n'ai pas envie de payer pour ça comme je paie en Java quand j'écris "a" + a + "b" + ...

n°838761
Lam's
Profil: bas.
Posté le 01-09-2004 à 14:18:10  profilanswer
 

HelloWorld a écrit :

D'abord, std::string ou classe string custom, pas de pblm. std::string a le mérite d'exister, mais elle ne peut pas sattisfaire tout le monde.  


 
Bon, on est globalement d'accord, mais quitte à enc*ler les mouches... :D  
 
Déjà, la classe string est un ajout tardif à la stl, ce qui est bien dommage. Sans parler des mappings CORBA qui ne l'utilisent pas du tout, etc. Bref, c'est un peu une classe désavouée, ce qui est bien triste vu ses capacités. Mais ça aurait pu être pire, elle aurait pu finir comme les shared-pointers et autres hash-maps...
 
Il me semble que la STL recommendait en fait de faire du COW (copy on write),mais devant les gros problèmes d'aliasing, a préféré jeter l'éponge, comme quasiment toutes les implémentations. Mais je me trompe sans doute...
 
Pour ce qui est de char et wchar_t, c'est implicitement ce que je voulais dire: il n'existe aucun mécanisme (façon java) te permettant de manipuler un type (une classe) unique sans faire de préconception sur son contenu.
std::wstring s = getInputFromXML();
size_t l = s.size();
Ca ne marchera pas si tu n'a pas converti ton entrée vers le type correct de wchar_t. J'aurais aimé une classe qui contienne la chaîne, ainsi que la représentation (8 bits/16 bits, etc.) de la chaîne si nécessaire, avec tout ce qui faut pour convertir d'une représentation à l'autre.
 
Pour ce qui est de la thread-safety, c'est un long débat, et on ne vas pas rentrer dedans, mais grosso-modo, la STL de base n'offre effectivement de solution thread-safe au problème du "producteur-consommateur" que si tu utilises les std::list. Or, une liste de char, c'est un peu abrupt, non ? :)  

n°838765
Taz
bisounours-codeur
Posté le 01-09-2004 à 14:21:13  profilanswer
 

... y aucune notion de thread dans STL alors qu'est-ce que tu veux ...

n°838843
HelloWorld
Salut tout le monde!
Posté le 01-09-2004 à 16:34:53  profilanswer
 

Pour le COW, l'explication que j'ai lu a plusieurs endroits c'est que c'est en contradiction avec le standard. Je t'avoue que je suis pas allé vérifier :)
Pour la conversion string <-> wstring je suis d'accord, ca serait cool d'avoir une conversion facile. D'un autre côté mixer les 2 n'est généralement pas une bonne idée, mais y'a tjrs des cas où...
Au lieu de convertir ton type en wchar_t pour pouvoir utiliser wstring, tu peux tout simplement faire ton propre basic_string< ton_type, ...>.
Pour les thread, le débat devrait plutot porter sur le langage que sur la STL. Si C++ permettait de créer des thread il serait aberrant que la STL ne gère pas ça. Mais comme c'est plutot l'inverse...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°838962
Lam's
Profil: bas.
Posté le 01-09-2004 à 17:40:51  profilanswer
 

Taz a écrit :

... y aucune notion de thread dans STL alors qu'est-ce que tu veux ...


Bon, déjà pour recadrer mon message initial: certes, char* c'est caca, mais il peut y avoir des fois où on en a besoin pour des usages délicats.  
 
 
Maintenant, le C++ et la STL ne définissent rien au sujet des threads, mais le C++ ne définit pas non plus comment on exécute un programme, où s'affiche (ou ne s'affiche pas) cin, cout et cerr, et définit par contre très bien le mot-clé export qui n'est pourtant pas reconnu par les compilos (à part par EDG/Comeau, et encore...). Ca ne nous empêche pas de faire des programmes qui affichent "Hello World".
 
Le gros problème du C++ à mon sens, c'est qu'on n'a pas su fédérer de  
mouvement de standardisation d'un environnement et de librairies communes aux OS modernes (Windows, Unixes, PDAs, et autres systèmes posix).  
 
Donc, on n'a rien sur le graphisme, les fenêtres, les signaux, les sockets, la mémoire partagée, les threads, les systèmes de fichiers, etc.  Et c'est frustrant, puisque ça cause des gros problèmes de portabilité, alors même que c'est le souci de portabilité qui est au coeur du langage C++.
 
Donc, moi je vote pour une librairie STL2 qui définisse tout ça, en se basant sur Boost, Loki, GLut, Ace, etc. Hé, si le monde Java y arrive, ça doit ête possible pour le C++, non ? (attention, cette phrase est peut-être un troll :) ).
 

n°838976
Taz
bisounours-codeur
Posté le 01-09-2004 à 17:48:14  profilanswer
 

'on ne paie que pour ce qu'on utilise' c'est tout ...
 
Boost c'est une chose, mais le reste, c'est du délire.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4

Aller à :
Ajouter une réponse
 

Sujets relatifs
comparaison de stringsrecherche de strings
Les dessous des Strings.[Script Visual Basic] Recherches de strings basiques
Encore une fonction sur les Strings....Operation sur des strings
[vba] cherche une commande pour un eoperation sur les strings[C, C++] faire un array dynamique de strings...
[VBA] manipulation des stringsC# Help ! opération sur les strings
Plus de sujets relatifs à : cauchemare de strings...


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)