En effet, j'avais mal compris. :oops:Citation:
Envoyé par Ksempac
Version imprimable
En effet, j'avais mal compris. :oops:Citation:
Envoyé par Ksempac
oula je peut pas faire ce sacrilège, ce sens n'est pas "possible"Citation:
Envoyé par koala01
ben en partie... C'est la raison que l'on peut codé du C dans du code C++Citation:
Envoyé par koala01
Sinon t'as bien résumé le problème.
Ce que je n'arrive pas a comprendre totalement est la raison de vouloir absolument tout enlever du C dans le C++. En premier, vu les réponses, on fait du C avec du C++ (même minime). Le C fournie de super méthode qui ne sont pas en C++, comme le sscanf exemple
va recopier correctement avec les espaces le path. Je suis bien sur d'accord sur le fait que se n'ai pas securisé. je n'ai pas trop d'équivalence en C++Code:
1
2
3 std::string s("path : c:/bal blabla/azeazaze/"); char path[1024]; ssacnf(s.c_str()," %*s %*s %[\t]",path);
autre exemple sprintf
Code:
1
2
3
4 char ligne[1024]; int a=1; float b[5] = {1.f,5.f,8.f,9.f,2.f}; sprintf(ligne,"% 5d %f % 5.3f %05.6f %f%f",a,b[0],b[1],b[2],b[3],b[4]);
par touvé mieux pour formaté des ligne d'un fichier
autre exemple, interfacé des code fortran avec du c++, on utilisera plustot en premier lieu du C.
Les sscanf et sprintf sont avantageusement remplacés par les flux stringstream. Tu as aussi boost.format, qui fournit un équivalent plus typé à sprintf.
Pas toujour vrai.Citation:
Envoyé par Ksempac
Par exemple le vector, l'operateut [] n'est absolument pas obligé de faire de vérification (dans VC2005 il ont décidé que oui...). Justement pour être proche des performance d'un tableau dynamic en C. La aussi faut savoir ce que l'on fait.
stringstream : j'ai pas trouve de super equivalence avec kes fluxCitation:
Envoyé par Laurent Gomila
boost.format : faut vraiment que je me mette a boost. Ils ont l'aire d'avoir fait plein de super chose
Les stringstream (cf la FAQ) permettent de manipuler des chaînes par le biais de ... flux :)
C'est plus pratique encore que sscanf/sprintf. Et de plus ça utilise le modèle de flux très pratique et très répandu désormais dans les bibliothèques C++.
boost.format est une excellente bibliothèque qui permet à la *printf-like de formater des chaînes.
Oui, vraiment, vas jeter un coup d'oeil à boost ;)
Tu aurais un exemple que tu as du mal à transposer avec les flux ?Citation:
stringstream : j'ai pas trouve de super equivalence avec kes flux
L'utilisation de boost devient de plus en plus inévitable ;)Citation:
boost.format : faut vraiment que je me mette a boost. Ils ont l'aire d'avoir fait plein de super chose
std::vector ne fait pas systématiquement ce genre de vérifications, tout comme le programmeur ne les ferait pas avec un tableau brut. Par contre il permet de les faire si nécessaire (via la fonction at()).Citation:
Par exemple le vector, l'operateut [] n'est absolument pas obligé de faire de vérification (dans VC2005 il ont décidé que oui...). Justement pour être proche des performance d'un tableau dynamic en C. La aussi faut savoir ce que l'on fait.
Par contre, std::vector implémente correctement les différentes opérations que tu auras à faire sur un tableau, opérations qui seraient inévitablement buggées si tu devais les gérer toi-même avec un tableau brut.
De plus, étant encapsulé dans une classe, on peut éviter les débordements et compagnie grâce au "catching" d'exceptions (out_of_range, ...).
On peut donc contrôler ce que l'on fait, éviter (ou du moins limiter) les erreurs, sans se soucier de redimensionner le tableau etc, tout en s'en servant comme un tableau brut. Que vois-tu comme ombre au tableau ?
Ben dans visual 2005 si :cry: (c'etait un autre post). j'ai reussi a les viré avec les option de compilation, mais je trouve pas sa propre.Citation:
Envoyé par Laurent Gomila
Sinon c'est ce que je voulais dire un contenaire (comme vector) n'est pas forcement obligé de tout faire. Donc faut faire attention
C'est une spécificité de la STL de Visual C++ 8 en mode debug. Dans la norme, il est indiqué que [] ne fait pas de vérif, et que at() le fait.Citation:
Ben dans visual 2005 si (c'etait un autre post)
Ce qu'il ne fait pas c'est ce que tu n'aurais de toute façon pas fait non plus avec un tableau brut. Donc faut pas plus faire attention qu'avec ce dernier.Citation:
Sinon c'est ce que je voulais dire un contenaire (comme vector) n'est pas forcement obligé de tout faire. Donc faut faire attention
Fait quand meme une verif en release :cry: pour l'enlever faut mettre _SECURE_SCL=0 dans les options du préprocesseur.Citation:
Envoyé par Laurent Gomila
Exactement, c'était juste pour présicer :lol:Citation:
Envoyé par Laurent Gomila
On dirait bien que tu as raison. C'est tout de même étonnant, je me demande même si ce n'est pas en contradiction avec la norme.Citation:
Fait quand meme une verif en release :cry: pour l'enlever faut mettre _SECURE_SCL=0 dans les options du préprocesseur
Pourquoi? Ca m'a l'air de ne changer le comportement que pour des comportements indefinis.Citation:
Envoyé par Laurent Gomila
A ce que je sais ça l'est. La norme spécifie que seule la fonction at() doit vérifier, et pas []. Je vais vérifier.
En faite la norme ne spécifie rien sur le fonctionnement de [], mais par principe d'efficacité elle devrait ne rien faire "Exceptional C++ Style 40 New Engineering Puzzles, Programming Problems, and Solutions" chapitre 1 "Uses and Abuses of vector"Citation:
Envoyé par Alp
C'est vrai que professionnellement, les choix sont ceux d'une équipe, voire même ceux de l'entreprise. Evidement quand on travaille sur un logiciel propriétaire (il faut bien vivre) il n'est pas possible d'incorporer des élément en GPL dedans.
Ensuite certain choix sont simplement des contraintes techniques, on a rarement la chance de travailler sur un projet 'from scratch' et alors il faut gérer l'existant, et donc oui on fait du C++ ou l'utilisation de la STL est interdit par exemple... sachant qu'en plus ca passe très mal de Dll en Dll...
Le C++ est du C++, je ne vois pas la différence d'avec les n versions de Java...Citation:
Envoyé par Mongaulois
Faux. D'ailleurs, même les compilateurs usuels ne sont pas forcément capables de compiler le C99 (j'ai eu un souci comme ça où je devais compiler une bibliothèque avec ICC en mode c99, mais je ne pouvais pas ajouter l'option --std=c99)Code:C'est la raison que l'on peut codé du C dans du code C++
Si mes souvenirs sont bons, c'est désactivable. Tu as /GS enclenché ?Code:Par exemple le vector, l'operateut [] n'est absolument pas obligé de faire de vérification (dans VC2005 il ont décidé que oui...). Justement pour être proche des performance d'un tableau dynamic en C. La aussi faut savoir ce que l'on fait.
Pas tout à fait. Dans la norme, il est dit que mal utiliser [] est un comportement indéfini. Qu'un compilateur a donc le droit droit de définir comme il le veut. Par exemple en le définissant comme faisant une validation dans des contextes où les performances ne sont pas primordiales. Et définir intelligemment des comportements indéfinis est un critère important de la qualité d'implémentation d'un compilateur.Citation:
Envoyé par Laurent Gomila
Par contre, le comportement quand on utilise at incorrectement est défini.
Pour ma part, je dirais que ce que j'évite principalement, c'est d'utiliser la bibliothèque standard du C quand des remplaçants C++ existent (soit en standard, soit en C++), ainsi que tout système d'allocation de ressource non géré par une classe (en particulier la mémoire, ce qui fait que j'ai assez peu d'utilisation directe de pointeurs).
Autre point que j'évite : Les macros, dans les cas où elles peuvent se remplacer par des constantes ou des fonctions (éventuellement inline).
java est du java c'est pas la même chose pour le C++, C++ et un peu du C; Même si il ne faudrait pasCitation:
Envoyé par Miles
Y as bien sur une limite a tout cela. C++ n'est qu'en patie du C. Mais dire qu'ils sont totalement différent et un peu trop rapide. Je suis d'accord qu'il faut au maximum les séparer. Ce qui n'est pas toujours facile. Par exemple les struct peuvent être aligné en C++ et non en C(du moins il me semble) ce qui peut poser de grave problème d'interfacage entre du C et du C++...Citation:
Envoyé par Miles
Si je voulais allez plus loin je pourrai presque dire que la STL est la pour comblé cette ensemble existant entre le C et le C++, mais ca peut partir loin.
Je pense que l'histoire est trop proche entre le C++ et le C pour que ces deux langage soit totalement distinct. Ce qui pose les problème de ce post. Maintenant, une prochaine version du C++ est en cours, et a l'air de remettre à plat pas mal de ces problèmes :D et c'est pour cette raison que j'essaie de me remettre à niveau; Pour ne pas être largué. Je trouve que la conception du C++ as beaucoup évolué.