Problème de While

Résolu
Lestat_2070 Messages postés 71 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 5 mars 2007 - 19 mai 2005 à 15:49
fjxokt Messages postés 840 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 25 février 2009 - 21 mai 2005 à 19:04
Bonjour,

J'ai un petit problème de boucle while, sur dans un de mes scripts:

<hr size="2" width="100%">SCRIPT:

On *:start:{ .timerldirc 1 2 getcnct }

alias getcnct {

set %i 1

while (%i <= $gettok($readini($scriptdirultra.ini,serv,networks),0,44)) {

echo -ta server: $gettok($_ini2(serv,networks),%i,44)

set %a $gettok($_ini2(serv,networks),%i,44)

server $iif(%i == 1,,-m) $gettok($_ini2(serv,networks),%i,44)

inc %i

}

}



on *:connect:{ .timerldsrv 1 3 gtsrv }

alias gtsrv {

set %d $gettok($readini($scriptdirultra.ini,serv,networks),0,44)

inc %d

if (%d == %i) {

set %i 1

set %b 1

while (%i <= $gettok($readini($scriptdirultra.ini,serv,networks),0,44)) {

while (%b <=
$gettok($readini($scriptdirultra.ini,serv,. $+
$gettok($readini($scriptdirultra.ini,serv,networks),%i,44)),0,44)) {

inc %b

}

inc %i

}

}

}

<hr size="2" width="100%">FICHIER .INI:

[serv]

networks=127.0.0.1:1000,irc.ff.st,ircSuper

.127.0.0.1:1000=#test01,#test02,#test03

.irc.ff.st=#test04,#test05

.ircSuper=#test06

<hr size="2" width="100%">Vous l'avez surement compris, il s'agit d'un auto-join multiserver/multichannel.

Le tout est composé de 2 while, grossièrement: irc va joindre les
channels du 1er server, du second...etc.. après s'etre connecté à tout
les servers de la liste (je précise parce que mon code n'est pas
vraiment "beau" et optimisé)

Donc ici, d'après ce que j'ai pu tester, seule le 2nd while s'execute:
le 1er while est "zappé"; quand je tente d'enlever le "inc %i" (il se
trouve a la fin), mIRC freeze: normal car la boucle ne peux se
terminer, mais anormal car: si l'incrémenteur de %i est là, rien ne se
passe.

Voilà donc mon problème de while, j'avais pensé que ca vennait du
multiple accèss au fichier .ini, mais dans ce cas pourquoi seul le 2nd
while se lance? Dans ce cas, comment faire?



Merci d'avance

12 réponses

fjxokt Messages postés 840 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 25 février 2009 1
19 mai 2005 à 19:36
les hash tables c'est pas compliqué (c'est meme tres simple)



tu crée une hash table de 1000 items (le max on s'en fout)

hmake -s ajoin 1000



tu ajoute a ta hash table l'item correspondant a un serveur

hadd -s ajoin irc.server.1 #salut #cool #blabla

si t'a d'autres serveurs pas de probleme c'est le meme principe

hadd -s ajoin irc.server.2 #delire #cfacile



pr finir tu sauvegarde ta table pr pouvoir la
reouvrir qd tu lancera ton script (il faut sauvegarder la table des que
on rajoute quelque chose dedans, sauf si ca n'est que temporaire)

hsave -s ajoin ajoin.hash



pr savoir combien de servers tu as au total, c'est $hget(ajoin,0)

pour avoir le nom de ton premier server, c'est $hget(ajoin,1).item

pour avoir ta liste de chan pour le server 1, c'est $hget(ajoin,1).data

ensuite pr avoir les chans un par un tu utilise un gettok(liste,%var,32) avec une boucle ou tu inc %var



si tu en a fini avec ta table, tu libere la mémoire qui lui etait alouée

hfree -s ajoin



lors du demarrage de mirc pr recuperer ta table tu la charges (apres l'avoir crée )

hmake -s ajoin 1000

hload -s ajoin ajoin.hash



alors c'est facile non ?
3
fjxokt Messages postés 840 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 25 février 2009 1
19 mai 2005 à 19:40
une autre chose, lorsque tu utilise des variables pr faire des boucles, utilise des /var (comme dit plus haut)

sinon essaye ça



var %i 1

while (%i <= $gettok($readini($scriptdirultra.ini,serv,networks),0,44)) {

var %b 1


while (%b <= $gettok($readini($scriptdirultra.ini,serv,. $+
$gettok($readini($scriptdirultra.ini,serv,networks),%i,44)),0,44)) {



inc %b

}

inc %i

}
3
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
19 mai 2005 à 16:27
J'ai pas vu le probleme mais deja met des /var au lieu des /set

server $iif(%i == 1,,-m)

y'a pas une virgule en trop dans le $iif ?
0
Lestat_2070 Messages postés 71 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 5 mars 2007
19 mai 2005 à 16:43
@wims:

Pour les /var au lieu des /set, ca ne change pas grand chose, mais bon c'est un détail (merci de me l'avoir fait remarqué).

Pour le $iif(%i == 1,,-m), non il n'y a pas une virgule en trop: $iif(comparaison,true,false);
j'ai rien mis entre les deux virgules pour, tout simplement, ne rien
renvoyer, ca peux paraitre un peu stupide de ma part; mais le but ici,
était d'ouvrir dans une nouvelle fenetre tout les serveurs, sauf le
premier.

Merci pour ta réponse
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
19 mai 2005 à 17:37
Oui j'ai bien compris mais dans ce cas peux etre que l'erreur vien de la. essaye plutot : $iif(%i != 1,-m)
0
Lestat_2070 Messages postés 71 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 5 mars 2007
19 mai 2005 à 17:51
@wims:

Hélàs, comme je l'imaginais, l'erreur ne viens pas de là, mais bel et
bien de la boucle while, j'en suis sur; mais de là à savoir ce qu'il se
passe...

En tout cas, merci wims pour cette petite optimisation pour mon $iif
0
fjxokt Messages postés 840 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 25 février 2009 1
19 mai 2005 à 18:46
bon j'ai pas trop regardé ton code (juste un truc tu parles des while de quel alias: gtsrv ou getcnct ?)

mais je trouve pas que la maniere dont tu utilise ton fichier ini soit tres pratique

perso utilise les hashtables, met en item le server et en data les
channels, separés par un token, ce sera plus rapide et (je trouve) plus
propre
0
Lestat_2070 Messages postés 71 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 5 mars 2007
19 mai 2005 à 19:07
@fjxokt:

Dans le 1er post, je parlais du gtsrv, car c'est le seul à proposer deux whiles l'un dans l'autre.

Hum, les hashtables... seulement, je ne les maitrise pas ...
à vrai dire, j'ai rien compris quand j'ai vu des tutos ou des sources
les utilisant. Aussi, si je les utilise, je pourais ramener tout ca
dans mon .ini ?

Enfin, je suis d'accord avec toi, c'est pas du tout optimisé... et
c'est sans doute normal que ca ne marche pas du tout. Je ne sais pas
trop. Comment devrais je coder ca ?

Merci pour vos réponses
0
Lestat_2070 Messages postés 71 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 5 mars 2007
19 mai 2005 à 19:09
@fjxokt:


Dans le 1er post, je parlais du gtsrv, car c'est le seul à proposer deux whiles l'un dans l'autre.


Hum, les hashtables... seulement, je ne les maitrise pas ...
à vrai dire, j'ai rien compris quand j'ai vu des tutos ou des sources
les utilisant. Aussi, si je les utilise, je pourais ramener tout ca
dans mon .ini ?


Enfin, je suis d'accord avec toi, c'est pas du tout optimisé... et
c'est sans doute normal que ca ne marche pas du tout. Je ne sais pas
trop. Comment devrais je coder ca ?


Merci pour vos réponses
0
Lestat_2070 Messages postés 71 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 5 mars 2007
19 mai 2005 à 21:05
@fjxokt:

Merci pour ce mini tuto ,
ca va m'être bien utile. Je valide ta réponse en "acceptée". Le petit
problème restant est que je dois changer mes 2 combo (server et chan,
et un jour ajouter le mode +k et rafistoler ce mode $network), et avoir
2 files (le ini avec deja la configuration de l'addon (~1300 l)) au
lieu d'un seul. Mais bon, je bosserai là dessus vendredi soir et ce
weekend; parce que ce soir j'ai plus trop le temps. Encore merci pour
vos réponses !

Si quelqu'un me trouve une solution pour le code en début, de page, je suis toujours prenneur
0
Lestat_2070 Messages postés 71 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 5 mars 2007
21 mai 2005 à 11:42
@fjxokt:

Woaouu !!!

Désolé, je n'avais pas vu le "var %b 1" qui était déplacé !

En fait, c'étais ca qui bloquais le script: logique, en fait, puisque si on ne met pas var %b 1
juste après le 1er while (qui liste les servers), l'autre while ne
pourra pas joindre les channels quand %i sera égal à 2, puisque %b sera
supérieur au nombre de chans pour le server suivant. Vraiment, MERCI fjxokt,
j'ai cherché pendant plusieurs jours, parce que j'étais sûr de mes
whiles; comme quoi faut véritablement tout vérifier quand un script ne
donne pas le résultat souhaité :]

Je vais quand même tenter du côté des hash tables, ca semble plus
rapide que tout mes accèss au .ini avec des lignes trop longues

byebye ^^
0
fjxokt Messages postés 840 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 25 février 2009 1
21 mai 2005 à 19:04
de rien lol
0
Rejoignez-nous