1

Je complète le préprocesseur Azur en ce moment en ajoutant le support de #define,#ifdef, etc.

Je me demande comment implémenter efficacement la recherche par dichotomie.

Pour l'instant je compare avec strcmp (donc je compare la chaîne d'index X de la liste avec la chaîne recherchée), et je décide si je dois "monter" ou "descendre" dans la liste triée en fonction du signe de la valeur renvoyée par strcmp...

Y'a pas une astuce plus efficace que repartir du début des chaînes à chaque fois pour déterminer la "direction" à prendre ?
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

2

Je v te résumer ce qu'il y a ds la bible du C là dessus.

on considere 2 fn principales :
install(s, t) qui enregistre le nom s et sa valeur de remplacement ds une table
lookup(s) qui recherche la chaine ds la table, et qui transmet un pointeur sur S, ou alors NULL si not found.

On utilise un algo de type 'hash'
=> le nom est transformé en un entier qui sert d'index ds le tableau. (un element du tableau pointe sur le debut d'une chaine de blocs possedant la meme valeur de type hash. (ou NULL s'il n'existe aucun nom ac cette valeur 'hash')

un bloc est defini comme suit :
struct nlist {
     char      *name ;                                 //pointe sur le nom
     char      *def ;                                  //pointe sur la valuer de remplacement.
     struct    nlist *next ;                           //pointe sur le prochain bloc.
}





hash : en fait, il fait la somme des valeurs des octets de la chaine et la retourne apres l'avoir ramenée à la taille du tableau.
hash(s)
char *s
{
     int hashval;

     for (hashval = 0 ; *s != '' ; )
          hashval += *s++;
     return(hashval % HASHSIZE)                        //hashsize c la taille du tableau  ;)
}



pratik non ?
ça permet de diminuer pas mal le temps de recherche smile


voyons maintenant lookup :
struct nlist *lookup(s)
char *s ;
{
     struct nlist *np ;
     
     for (np = hashtab[hash(s)] ; np != NULL ; np = np->next)         //cherche de bloc en bloc, jusqu'à la fin de la chaine de blocs.
          if (strcmp(s, np->name) == 0)
               return(np) ;                                           //trouvé :)
     return(NULL) ;                                                   //fin de chaine de bloc atteinte et pas trouvé => on transmet NULL
}





et la fonction install :
(si le nom à installer est déjà present, install remplace la definition par la nouvelle)
struct nlist *install(name, def)
char *name, *def ;
{
     struct nlist *np, *lookup() ;
     char *strsave(), alloc() ;
     int hashval() ;
     
     if ((np = lookup(name)) == NULL) {                               //si pas encore défini
          np = (struct nlist *) alloc(sizeof(*np)) ;                  //reserve de la mem d'une maniere ou d'une autre
          if (np == NULL)
               return(NULL) ;                                         //pas assez de place.
          if ((np->name = strsave(name)) == NULL)                     //recopie la chaine à l'endroit que alloc à indiqué
               return(NULL) ;                                         //pas assez de place.
          hashval = hash(np->name) ;                                  //génère l'index du tableau (ie la valeur de type hash correspondant au nom)
          np->next = hashtab[hashval] ;                               //met l'ancien pointeur ds next. (qui pointait vers le debut de la chaine de bloc avt qu'on ne remete ce bloc en plus). #attention# pour que ça fonctionne bien, je pense qu'il faudrait verifier que le tableau est bien initialisé avec des NULL au debut. Sinon en fin de chaine de bloc on risque d'avoir next qui contient n'importe quoi au lieu de NULL (ce qui ferait que la fin de chaine ne serait pas detectée ;))
          hashtab[hashval] = np ;                                     //actualise le pointeur d'origine de chaine.
     } else    //deja defini
          free(np-def) ;                                              //free previous def
     if ((np->def = strsave(def)) == NULL)
          return(NULL) ;
     return(np) ;
}






voilà smile
bon, les fn ne sont pas de moi, mais les commentaires, si. donc i se peut qu'il y ait des conneries, mais je ne pense pas.
[edit]Edité par Pen^2 le 19-01-2002 à 15:35:27[/edit]

3

le gris c pas super sad
on voit rien
[edit]Edité par gugusg le 19-01-2002 à 15:15:41[/edit]
En préretraitre

4

La source de ces fonct c'est quoi ? (ou en obtenir d'autres, + simples, pr apprendre ?)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

>gugusg
g mis en bleu foncé. c vrai que c mieux.

>Bob 64
c issu de "Le language C" par BW Kernighan et DM Ritchie.

6

Une liste chaînée?! C'est le genre de choses à ne pas toucher si on programme sur calculatrice!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

7

pkoi donc ?

8

évidemment il ne faut pas utiliser un tableau static, mais sinon, je vois pas le pb confus

9

- Le nombre de handles est limité.
- Ça prend de la place. (Tout bloc alloué avec malloc commence toujours par 18 octets utilisés par AMS - pour HeapAlloc, ce sont 16 octets.)
- Il ne faut pas oublier de tout désallouer, vu que AMS ne libère pas automatiquement les handles. C'est possible, mais c'est relativement compliqué.
[edit]Edité par Kevin Kofler le 19-01-2002 à 19:11:41[/edit]
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

10

Pen² : love
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

11

Donc en fait, en deux mots, il faut faire un checksum de chaque entrée de la liste de chaînes, et de la chaîne rechechée.
Pour rechercher cette chaîne, on compare son checksum avec ceux des autres chaînes (cette recherche de checksums est faite par dichotomie ?).
Quand on a trouvé, on peut chercher la bonne chaîne parmi celles ayant le bon checksum (ainsi on a bien diminué le temps de recherche en s'"orientant" grâce au classement par checksums).

J'ai pigé le principe ?
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

12

>- Le nombre de handles est limité.
>- Ça prend de la place. (Tout bloc alloué avec malloc commence toujours par 18 octets utilisés par AMS - pour HeapAlloc, ce sont 16 octets.)
Soit, mais c pour un compilateur, il n'y a pas de milliards de #define ou #ifdef etc.
De plus, rien ne t'empeche d'allouer un gros bloc mem, et ensuite de faire ta propre allocation dedans. (et de le gerer de la meme maniere qu'une pile, c pas dûr je pense)

>- Il ne faut pas oublier de tout désallouer, vu que AMS ne libère pas automatiquement les handles. C'est possible, mais c'est relativement compliqué.
bof, en codant proprement ça devrait aller wink (surtout si on alloue juste un bloc mem wink)

13

>Donc en fait, en deux mots, il faut faire un checksum de chaque entrée de la liste de chaînes, et de la chaîne rechechée.
vi smile

>Pour rechercher cette chaîne, on compare son checksum avec ceux des autres chaînes (cette recherche de checksums est faite par dichotomie ?).

Tu n'a pas besoin de chercher, puisque ce que tu apelles le checksum est l'index du tableau de pointeurs qui commence la chaine de blocs
Imaginons que hashval=2
=> hashtab[2] est l'adresse du premier bloc de ta chaine smile
(le prochain bloc est à l'adresse np->next)

>Quand on a trouvé, on peut chercher la bonne chaîne parmi celles ayant le bon checksum (ainsi on a bien diminué le temps de recherche en s'"orientant" grâce au classement par checksums).
vi

>J'ai pigé le principe ?
ba.. vi. smile
[edit]Edité par Pen^2 le 20-01-2002 à 11:02:35[/edit]

14

ton tableau, tu le defini comme ça :
struct nlist *hashtab[HASHSIZE]

15

Oui, pour la gestion customizée de la mémoire, heureusement que je ne vous ai pas attendu roll

Pen² : mille fois merci tu es <tu sais> oui
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

16

>Oui, pour la gestion customizée de la mémoire, heureusement que je ne vous ai pas attendu

Héhé ouais.. Kevin a parfaitement raison.
AS, CC et SC ont tous leur propre gestionnaire de mémoire, sans ça c'est meme pas la peine... smile
So much code to write, so little time.

17

ben oui !

C'est même la prremière chose à laquelle j'ai réfléchit quand j'ai commencé le compilo.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

18

bref liste chainées rulez qd meme on-calc tonguetonguetongue
j'aaavv raison tonguetongue

(heuresement d'ailleurs parce que ça m'aurrait fait chier de taper tout ça pour rien roll)

19

Le gros inconvénient c'est que la recherche par dichotomie parmi les chaînes aux bons checksums est impossible sad
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

20

oui, enfin bon il n'y a qd meme pas énormement de chaines qui ont la même hashvalue wink
(sauf si tu fais un tableu de pointeurs tres petit)

21

Ton algo me plaît énormément Pen² : je vais pouvoir fusionner la table des symboles du parser avec celle du préprocesseur, grâce à la gestion en pile possible avec ta méthode (alors qu'avant les deux étaient séparées : le LIFO est incompatible avec la dichotomie) => MERCCIIIIIIIIIIIII cool
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

22

J'ai fixé la taille de ma table de hachage à 512 éléments, tu en penses quoi ?
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

23

>Ton algo me plaît énormément Pen²[...] => MERCCIIIIIIIIIIIII
ba de rien smile

>J'ai fixé la taille de ma table de hachage à 512 éléments, tu en penses quoi ?
honnetement, je sais pas. g jamais utilisé cet algo. faudrait tester ac plusieurs sources pour avoir une taille moyenne interressante.
desolé. sad

24

arf soit pas désolé tu m'a appris quelque chose de formidable smile
Azur rulleeezzzz-un-peu-plus grâce à toi !
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

25

lovelovelovelove

26

Moi aussi je t'aime love
(amicalement I precise au cas où grin)
Sainte Marie mère de Dieu
Priez pour nous pauvres pêcheurs
Maintenant et à l'heure de notre mort

Amen.

27

mdr grin

28

mdr aussi smile
:D

29

youhou !
v utiliser &plusmn; cet algo pour tiler mes niveaux !
huhu, héhé, hoho triso


thx de m'avoir fait commenter ces lignes Thibaut, j aurrai plus pensé si je ne l'av pas fait
top

30

Attention : la fonction de hashing conseillée dans les premiers posts (additionner puis prendre le nombre modulo le nombre d'entrées dans la table) n'est pas du tout idéale.

Pour une analyse de différentes fonctions de hashing :
http://burtleburtle.net/bob/hash/evahash.html
http://burtleburtle.net/bob/hash/doobs.html

A part ça, pour économiser de la mémoire, on peut utiliser un tableau de n entrées (je pense que tu le fais déjà) alloué au démarrage du programme, et utiliser des indices (taille short ou char) au lieu de pointeurs.