Devblog - Greg

Aller au contenu | Aller au menu | Aller à la recherche

jeudi, juillet 1 2010

Trop de générique tue le générique

J'ai eu un collègue (pour ne pas dire supérieur) dont le maitre mot était "il faut que tout soit le plus générique possible". Ce n'est pas faux... Mais ce n'est pas forcément toujours vrai non plus, car ça suppose bien souvent qu'on accepte de perde au niveau des performances... Je vais vous donner un exemple de code d'affichage utilisé un peu partout au boulot et qui finalement a bien perdu à être générique...

Lire la suite...

samedi, juin 19 2010

Taiwanais : jamais 2 sans 3

Bon, on s'en doutait, le Tawainais allait encore faire des siennes ^^ En regardant toujours une partie du code, je suis tombé sur une façon que je trouve assez originale pour écrire un fichier XML... Ca se décompose en 2 parties :

1. Tout en haut du fichier de sources, on trouve la déclaration des chaines de caractères. Pour des questions évidentes je mets n'importe quoi dans les balises, ce n'est pas important ^^

char line1[] = "<balise1 val=\"%i\">\n";
char line2[] = "    <balise2.....>\n";
char line3[] = "        plein de blabla\n";
char line4[] = "    </balise2.....>a\n";
...
...
char line12[]  = "</balise1>\n";

Donc ça c'est pour l'ouverture des festivités. Bon, il aurait pu faire un vrai tableau plutôt que de numéroter les variables, mais pourquoi pas ^^

2. Le code d'écriture à proprement parler. Là il a fait une chose que je trouve particulièrement intéressante... A noter que pour une fois je n'ai pas renommé les variables puisque de toute façon on ne peut pas savoir à quoi elles correspondent ^^

void writeXML(...)
{
	char buffer[256];
	FILE *f;
	
	un peu de code d'init, ouverture du fichier, etc... 
	ça met des variables à certaines valeurs
	
	
	// Write XML file
	memset(buffer, 0, 256);
	sprintf(buffer, line1, val1);
	fwrite(buffer, 1, strlen(buffer), f);
	
	memset(buffer, 0, 256);
	sprintf(buffer, line2, val2);
	fwrite(buffer, 1, strlen(buffer), f);
    
	memset(buffer, 0, 256);
	sprintf(buffer, line3, val3a, val3b);
	fwrite(buffer, 1, strlen(buffer), f);
    
	...
	...
	
	memset(buffer, 0, 256);
	sprintf(buffer, line12, val12);
	fwrite(buffer, 1, strlen(buffer), f);
}

Pour des questions de lisibilité je n'ai pas mis tout le code, bien entendu, mais on comprend bien le principe ^^ Je ne vous ferez pas l'affront de signaler ce que je trouve choquant (et il y a plusieurs choses "originales" ^^).

mercredi, juin 16 2010

Le retour du Taiwanais...

Je viens de me rappeler d'un autre bout de code "mystique" aperçu dans les sources ^^ Cette fois-ci ce n'était pas gênant car c'était dans une partie du code qu'on n'utilise pas, mais bon...

En gros, vous avez une classe tableau (ou liste ou je sais pas ce que c'était, mais bon, en gros des données quoi ^^). Avec une belle fonction pour ajouter des choses dedans (à la suite). Jusque là, rien de spécial me direz-vous... Sauf qu'à la fin de la fonction d'ajout, on trouve ça :

void MyClass::add(...) {
    ... // Add to array
    size++;

    // Seems to slow down and bug when there's to much data
   if (size > 230)
        size = 230;
}

On n'a jamais compris pourquoi la limite est à 230, mais bon ^^

Code au rabais ?

Un taiwanais, ça coute pas cher. Mais est-ce que c'est bon ?

Je ne vais pas faire de généralités, mais j'ai trouvé un truc pas mal dans le code tout à l'heure (copié/collé d'un truc "pro" fait à Taiwan...). En fait c'était un bout de code pour convertir un double en 2 ints (un pour la partie entière, un pour la partie décimale). Donc en gros, on obtient le code suivant :

int p, d;
double val = XXX;
p = (int)val;
val = val - p;
while(val < 1) val *= 10;
d = val;

Bizarrement de temps en temps ça bloque le programme... (on notera que la récupération de la partie décimale est aussi super bien pensée... genre 1.01 renvoie 1, tout comme 1.1 et 1.0001 (entre autres...) ^^)