Monthly Archive for septembre, 2007
... J'adore quand mes copines m'envoient des trucs débiles par mail !
Des ppt humoristiques, des photos de bôgosskituent ou des petits mots sympas.
Rien de tel pour mettre un sourire niais sur mes lèvres (qui dure assez longtemps en général)
Merci les filles (si vous me lisez)
Utopia St Siméon, Pl Camille Jullian
Vernissage Lundi 15 Octobre à 19h
à Bordeaux
J'y serai et si vous êtes de la région, n'hésitez pas à venir, ça vaut le détour.
Ah, et pour s'y rendre : Prendre la rue ste catherine direction place de la Victoire. Une fois arrivé à la place st projet (après la FNAC), tourner à gauche (rue de la merci), la place camille jullian et le cinema sont au bout de la rue.
Le C++ est un langage gérant les exceptions depuis la version de 1990.
Malheureusement, il manque une fonctionnalité très pratique que l'on trouve dans la plupart des langages de haut niveau, et qui est la clause finally.
Une première solution consiste à faire ceci :
void function() { try { /* Function content */ } catch(...) { /* Finally */ throw; } }
Différents problèmes résultent.
Tout d'abord, ça n'est pas réellement équivalent au finally dans le sens où ça ne sera exécuté que si une exception est lancée, ce qui ne sera pas le cas dans le cas d'un retour dans le bloc try.
En outre, avec gdb par exemple, si une exception est lancée et n'est pas captuée par la suite, il sera impossible de récupérer cet objet, car il retournera au throw de ce catch, et donc il sera impossible de savoir où se trouve l'objet en question. (enfin peut être que si, mais je n'ai pas trouvé)
Solution
La solution consiste à utiliser une variable locale. En effet, les variables locales sont détruites lors du départ d'une fonction, que ça soit par un retour ou par saut due à une exception.
void function() { class Finally { public: ~Finally() { /* Finally */ } }; Finally finally; /* Instructions */ }
L'inconvénient est que c'est relativement chiant à écrire, et pas très élégant. En outre on perd l'interaction avec les variables locales car la fonction dans la classe ne peut pas accéder.
En effet, j'obtiens sinon l'erreur suivante :
m_show.cpp: In destructor ‘Client::m_show()::Finally::~Finally()’: m_show.cpp:270: error: use of ‘auto’ variable from containing function m_show.cpp:262: error: ‘TWRWTable* Table’ declared here
Les "auto" variables sont tout simplement les variables locales. Le mot-clef auto est implicite lors de la déclaration. Le problème réside dans le fait que je ne peux accéder à une variable "auto" d'un bloc suppérieur.
Ma première solution qui me vient à l'esprit est de la passer en argument :
TWRWTable* Table = new TWRWTable(t); class Finally { TWRWTable* table; public: Finally(TWRWTable* t) : table(t) {} ~Finally() { delete table; } }; Finally finally(Table);
Solution encore moins élégante, mais qui a l'avantage de marcher.
Généralisation
On constate qu'en général on utilise les finally pour détruire des objets alloués sur le tas dynamiquement.
L'idée de faire une classe générique réutilisable vient donc naturellement à l'esprit.
template<typename T> class Deleter { T* p; Deleter(const Deleter<T>&); Deleter<T>& operator=(const Deleter<T>&); public: explicit Deleter(T* _p) : p(_p) {} ~Deleter() { delete p; } };
On peut maintenant écrire :
void function(int t) { TWRWTable* Table = new TWRWTable(t); Deleter<TWRWTable> d(Table); /* Instructions */ }
Ce qui simplifie grandement la vie. Et pour des finally plus complexes, on peut toujours réutiliser une classe localement définie.
P.S.: Voici un exemple de ce que la lib boost utilise[ra] (je sais pas si ça a été inclus depuis, je n'ai jamais voulu utiliser cette bibliothèque) : scope_exit.
Il ne s'agit en fait pas d'un test à proprement parler, tels que les tests de QI, mais je vais juste décrire un phénomène qui montre une belle bêtise. Cependant ne pensez pas que si vous n'en faites pas partis, vous êtes intelligents. C'est juste que dans le cas contraire vous êtes définitivement irrécupérables.
Les personnes qui :
- pensent que 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 sont des chiffres et ne peuvent pas être des nombres, que ces derniers commencent par 10,
- pensent qu'un mot doit être composé de deux caractères minimum pour être qualifié comme tel, et que sinon ça reste une lettre
- pensent que "q" == 'q' (en C)
- pensent que 5 fait partis de N mais pas de Z
sont des gros cons qui n'ont rien compris au principe des ensembles.
Bonjour,
Vous connaissez sans doute comme moi l'offre de N9uf Telecom concernant le téléchargement légal de musique "gratuitement". Le principe revient en gros à une licence globale, tous les mois est inclus dans le forfait une somme qui sera reversée aux majors.
Jusque là on peut considérer que c'est une offre intéressante, la licence globale étant un meilleurs solution que DADVSI (même si pas parfaite, car après il faut voir comment est fait la distribution des gains).
Cependant, ça aurait été trop beau. J'ai lu dans l'Ordinateur Individuel, que je qualifierai plus tard, qu'en fait, les musiques téléchargées sont DRMisées, c'est à dire qu'une protection propriétaire Microsoft régule l'utilisation que l'on peut faire de ce fichier. Le détail le plus important est qu'il est nécessaire d'utiliser Windows Media Player pour lire ces fichiers, ou d'autres lecteurs "certifiés". Ce qui implique, bien sur, l'impossibilité de lire ces fichiers sous les systèmes d'exploitations ne possédant pas un de ces lecteurs, notamment Linux.
Apparemment, en l'occurence, il ne sera possible de copier le fichier que sur trois machines, ainsi que sur les lecteurs portables "MP3", moyennant une réactivation tous les mois. Bien sur, une fois l'abonnement à N9uf Telecom terminé, ces fichiers deviennent impossibles à écouter.
Je pense donc qu'il faut boycotter au maximum cette offre, car au final ce n'est que des paillettes pour les yeux et ça incite à entrer dans le jeu des DRM. Le gros risque est que ça devienne banal.
Pour la petite anecdote, j'étais cet après midi à l'hôpital pour une consultation, et biensûr le monsieur en blouse blanche (et la jeune infirmière très mignonne au passage) m'a pris plus d'une demi heure en retard. Le rapport ? C'est que je trouve inadmissible qu'il y ait ainsi des retards, mais surtout que ça soit banal, personne ne s'en plaint vraiment (à part comme moi gueuler après et emmerder les autres, mais pas pour faire avancer les choses (à mon avis on devrait tous se mettre à refuser de payer si le retard est supérieur à un quart d'heure, mais bon c'est trop tard)).
Concernant l'article de l'Ordinateur Individuel, que j'ai trouvé favorable à cette offre, je dois avouer avoir été très déçu.
Lorsque j'étais petit, je lisais régulièrement ce mensuel, et c'est vrai que ça me plaisait pas mal. J'ai arrêté de le lire il y a cinq ou six ans, plus ou moins lors de mon passage à Linux, et je n'ai pas réaccroché avec.
Déjà on peut constater que la taille du magazine en lui même a été divisée par deux. La rubrique "Trucs et Astuces" que j'aimais bien, a perdu son volume. Les astuces n'ont aucun intérêt, il n'y en a plus concernant la programmation (même si ça restait simple), etc. Il y a globalement moins d'articles, et la qualité est médiocre.
Mais le plus choquant, c'est quand même le parti pris. Dans l'article sur l'offre de 9, ils sont clairement favorables, n'exposent que vaguement le fait qu'on ne pourra pas lire la musique sur MacOS X (et ne parlent même pas de Linux, ils ne doivent même pas savoir que ça existe). Dans un truc et astuce, ils expliquent comme vérifier que votre version de Windows Vista n'est pas crackée..
Ce magazine est clairement destinée aux "décideurs pressés", et donc je vous invite à l'acheter en masse pour remplir votre stock de papier toilette.







Commentaires récents