03 juin 2011

Fonction de recherche avec table de hachage

J'ai modifié la fonctions gnu hsearch_r pour permettre la suppression d'enregistrements et j'ai ajouté une fonction qui permet d'agrandir la table. Le paquet hashsearch.tar.gz est ici: http://sourceforge.net/projects/openbotamsr/files/utilities/ hashsearch_r comme hsearch_r permet d'ajouter une entrée, de rechercher une entrée, de modifier les données d'une entrée; mais permet en plus de supprimer une entrée (retval->key=NULL) : extern int hashsearch_r (HENTRY __item, ACTION __action, HENTRY **__retval, struct hsearch_data... [Lire la suite]
Posté par InPhilly à 23:16 - - Commentaires [0] - Permalien [#]

21 mai 2011

Un complément à hdestroy_r pour libérer la mémoire.

Le problème de hdestroy_r, c'est qu'il ne libére pas la mémoire qui a été allouée pour y stocker les clés et les données ( comme par exemple: entry.key = strdup(motcle); entry.data = strdup(donnee); ). Une première solution est de créer une table qui contiendra les clés et les données, et ainsi de ne fournir à entry.key et entry.data que les pointeurs sur cette table, ainsi: entry.key=key_tab[i]; entry.data=data_tab[i];  Une deuxième solution est d'exploiter la structure hsearch_data pour accéder... [Lire la suite]
Posté par InPhilly à 19:42 - - Commentaires [0] - Permalien [#]
18 mai 2011

hcreate_r hsearch_r hdestroy_

hcreate_r hsearch_r hdestroy_r sont les fonctions réentrantes de hcreate hsearc hdestroy. Elles sont interessantes car elles permettent de créer plusieurs tables de hachage. hcreate hsearc hdestroy sont faciles à utiliser et d'ailleurs on trouve facilement un exemple sur internet. hcreate_r hsearch_r hdestroy_r sont plus compliqué et les exemples sont difficiles à trouver. Alors comme j'ai un peu "galeré" voici ce que j'ai trouvé: 1 - #define _GNU_SOURCE doit être au tout début!  #define... [Lire la suite]
Posté par InPhilly à 18:35 - - Commentaires [0] - Permalien [#]
01 janvier 2010

Segmentation Fault

Je vous apprendrai rien de nouveau avec ce post surtout si vous avez un peu l'habitude de développer en C/C++.Voilà le message que j'ai en horreur, le laconique "Segmentation Fault" qui précède l'arrêt du programme. C'est un message qui véhicule bien peu d'information, mais qui laisse présager un problème de pointeur ou d'array, comme c'est le cas la plupart du temps. Mais, où faut-il chercher dans le code?La solution directe est de relancer le programme sous valgrind,  et en pratique j'utilise la commande suivante: ... [Lire la suite]
Posté par InPhilly à 16:24 - - Commentaires [0] - Permalien [#]
17 août 2009

GTK lasso et selection rectangulaire

J'ai cherché un exemple de code capable de créer un lasso façon gimp. Pas facile! Finalement je me suis contenté d'une sélection rectangulaire assez rustique mais qui remplit bien son role, avec peu de lignes de code et sans appel à un lib particulière.  Le principe est simple, on inverse la couleur de la zone sélectionnée, et on reinverse exactement la même zone lorsque que le pointeur se déplace, et bien sûr, on inverse la nouvelle zone sélectionnée.  L'explication peut paraître obscure, il suffit de jetter un coup d'oeil... [Lire la suite]
Posté par InPhilly à 00:29 - - Commentaires [0] - Permalien [#]
05 juillet 2009

gtk+ avec c et python

Depuis une dizaine de jours, je participe à un projet de logiciel de transfert des photos en vidéo. J'utilisais dvd-slideshows, assez rustique avec son interface texte, mais malgré tout puissant, puisqu'il intégre le fameux effet "Ken Burns". Malheureusement, depuis que je suis passé à Xubuntu 9.04 il ne fonctionne plus. Alors j'ai décidé d'essayer Imagination. Un logiciel tout récent, puisqu'il n'a même pas un an, encore très incomplet, en particulier KenBurns et l'inclusion de textes (titre et sous-titres) ne sont pas... [Lire la suite]
Posté par InPhilly à 05:28 - - Commentaires [0] - Permalien [#]

25 janvier 2009

SoundEx Anglais / Français

L'algorithme SoundEx permet de faire une recherche pseudo-phonétique. C'est un algorithme ancien qui donne beaucoup de trop de faux positifs, mais il a l'avantage d'être simple et rapide.  Je poste ici le code en c d'un soundex que j'ai trouvé sur le web. Je l'ai modifier pour qu'il accepte le codage anglais ou français et permette de définir la longueur de la clé.  En rappel, le codage standard est une lettre en majuscule (la première du mot) et 3 chiffres décimaux. Le code source est ici: soundex.c #include... [Lire la suite]
Posté par InPhilly à 05:18 - - Commentaires [0] - Permalien [#]
23 janvier 2009

Levenshtein distance

La Levenshtein distance est un classique de la programmation. Elle est utile pour comparer la similarité de deux chaines de caractères.  Son défaut majeur est le temps de calcul (deux boucles imbriquées). Le code source:  levenshtein_distance /*------------- functions ------------*/void errmalloc(char *msg) {  printf("\nError memory allocation - %s\n",msg);  exit(EXIT_FAILURE); int minimum(int a,int b,int c) {/*Gets the minimum of three values*/  int min=a;  if(b<min) min=b; ... [Lire la suite]
Posté par InPhilly à 16:47 - - Commentaires [0] - Permalien [#]
20 janvier 2009

Fonctions de manipulation des chaines avec allocation dynamique de la mémoire

Voici une série de fonctions d'affectation de chaîne, de concaténation, d'insertion, de substitution... qui offrent l'avantage d'allouer automatiquement la mémoire qui est nécessaire. Le programme à télécharger (fonctions et exemples) est ici: dynamic.c Listes des fonctions disponibles: /*retourne la lg de l'element ou 0 en fin de liste,retourne l'element extrait et l'adresse de l'element suivantdelimiter devra contenir le caractere qui delimite chaque element*/int foreachstrdyn(char **element,char **pointeur,char... [Lire la suite]
Posté par InPhilly à 02:43 - - Commentaires [0] - Permalien [#]
19 janvier 2009

Suite foreach, strip, replace

Voici la suite de mon dernier post avec les fonctions: /*retourne la lg de l'element ou 0 en fin de liste,retourne l'element extrait et l'adresse de l'element suivantdelimiter devra contenir le caractere qui delimite chaque element*/int foreachstr(char *element,char **pointeur,char *delimiter); /*idem foreachstr mais la variable element est dynamiquebeaucoup plus lent - utile si on ne connait pas la taille max des elements*/int foreachstrdyn(char **element,char **pointeur,char *delimiter); /*Supprime les caracteres definis... [Lire la suite]
Posté par InPhilly à 04:09 - - Commentaires [0] - Permalien [#]