Probleme avec un mechant IF

Résolu
hisoka2501 Messages postés 264 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 7 juillet 2009 - 4 août 2006 à 13:43
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 - 7 août 2006 à 08:50
voila j'explique le probleme:

if ($calc($ctime - $gettok($hget(%table2,$gettok(%item,1,64)),8,32)) <= %max || !%max) && ((!$did(107).state  && %tok iswm $gettok(%data,1,1)) || $did(107).state)  {

ca c ma vilaine ligne qui foire donc:quand $did(107).state 0 ca va mais quand 1 ca marche pas
tout le reste est bonc apres les deux premiers && que je n'men sors plus
le bout de code:

 elseif ($did == 18) {
      bdid 18
      rdid 19
      if ($did(17)) {        var %fast 1 , %table wbs.xdcc.data , %table2 = wbs.xdcc.list        if ($wget(wbs.xdcc.show.only.time.less) 1) { var %max $did(79)  }
        hadd -m wbscfg Xdcc.lastsearch $did(17)
        wbssave wbscfg        var %tok $iif($did(107).state,$did(17),$+(*,$replace($strip($did(17)),$chr(95),*,$chr(32),*),*)) , %n  $hfind(%table,$iif($did(107).state,%tok,$+(*,%tok,*)),0,$iif($did(107).state,r,w)).data , %i = 1 , %smax = $wget(xdcc.size.val)      
        adid 30 0 0 %n
        if ($remove(%smax,-) !isnum) w.err Erreur: Format invalide
        else {
          var %smode = $wget(xdcc.size.mode)          if (%smode !4) var %smax $remove(%smax,-)
          while (%i <= %n) {            var %item $hfind(%table,$iif($did(107).state 1,%tok,$+(*,%tok,*)),%i,$iif($did(107).state == 1,r,w)).data , %data = $hget(%table,%item)
            if ($calc($ctime - $gettok($hget(%table2,$gettok(%item,1,64)),8,32)) <= %max || !%max) && ((!$did(107).state  && %tok iswm $gettok(%data,1,1)) || $did(107).state)  {              var %tsize $remove($gettok(%data,2,1),]) , %fsize $remove(%tsize,[,M,K,o,b)              if ($right(%tsize,1) K) var %fsize $calc(%fsize * 1024)              elseif ($right(%tsize,2) gb) var %fsize $calc(%fsize / 1024)
              if ((((!%smode)) || ((%smode == 1) && (%fsize <= %smax))) || (((%smode == 2) && (%fsize >= %smax))) || ((%smode == 3) && (%fsize == %smax)) || ((%smode == 4) && (%fsize >= $gettok(%smax,1,45)) && (%fsize <= $gettok(%smax,2,45))))  adid 19 $gettok(%item,1,64) $chr(9) $gettok(%item,2,64) $chr(9) $gettok(%data,1,1) $chr(9) $gettok(%data,2,1)       
            }
            idid 30 1 %i
            inc %i
          }
        }
      }
      edid 18
      halt
    }

( le halt en fin de code c'est pck le $did(18) c'est le bouton OK donc je ne veu pas fermer le dialog mais concerver ke fait que quand je fasse ENTER ca le clique )

je sais qu'il y a la beaucoup d'aliases que je n'ai pas expliqué mais les expliquer une a une prendrais beaucoup trop de place sur ce topic, toutefois je peu affirmer qu'aucune d'entre elle n'est en cause le probleme vient juste du IF cité en premier (de sa partie droite) mais je n'arrive pas a trouver la solution exacte, je souaite juste implementer la gestion des regex pour mon moteur de recherche xdcc :)

sinon j'aurais aussis une question auxiliaire:
sous mirc 6.2 est il possible de deplacer la switch bar via une commande ? genre: movebar left/top/right/down

merci d'avance :)

la mémoire ne peut etre définie mais elle definie l"humanitée (G.I.T.S)

14 réponses

hisoka2501 Messages postés 264 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 7 juillet 2009
4 août 2006 à 21:22
hum je vien de tomber sur qqch de tres intéressant:
($calc($ctime - $gettok($hget(%table2,$gettok(%item,1,64)),8,32)) <= %max) || (!%max)

le probleme vien de cette partie la dans le:
            if ((($calc($ctime - $gettok($hget(%table2,$gettok(%item,1,64)),8,32)) <= %max) || (!%max))) && (((!$did(107).state) && (%tok iswm $gettok(%data,1,1))) || ($did(107).state))  {

car quand j'ai desactivée le %max comme par magie ca a marché :/ pourtant je veux que ca mache malgres le max :$:$:$ raaa :/
je vien de comprendre le probleme
ca venais des resultats de la regex: le xdcc concerné était mis a jours il y a 21semaines la protection s'est donc mise en oeuvre ( pour pas se retrouver avec des packs de matieusalem) et du coup il filrtais :/
dsl du derangement je met le topic en repondus:$

la mémoire ne peut etre définie mais elle definie l"humanitée (G.I.T.S)
3
RCA ArKanis Messages postés 1287 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 21 février 2009
4 août 2006 à 14:01
quand tu as des problèmes avec des parenthèses, le mieux c'est de respecter le plus possible la syntaxe "normale"
càd : if (...) || (...) devient :
if ((...) || (...))

on a déjà testé quelques codes avec les deux formes, on en a déduit qu'elles ne sont pas tout le temps équivalentes

essaye de mettre ça :
if ((($calc($ctime - $gettok($hget(%table2,$gettok(%item,1,64)),8,32)) <= %max) || (!%max))) && (((!$did(107).state) && (%tok iswm $gettok(%data,1,1))) || ($did(107).state))  {

c'est moche ouais, mais ça a plus de chances de fonctionner :)
tu peux aussi essayer de mettre en variables quelques résultats, comme le $calc($ctime - $gettok($hget(%table2,$gettok(%item,1,64)),8,32))

Sinon :if ($wget(wbs.xdcc.show.only.time.less) 1) { var %max $did(79)  }
il me semble que quand il n'y a qu'une action, mettre les { } ralenti le code

assez dur à lire quand même ton code :p
0
hisoka2501 Messages postés 264 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 7 juillet 2009
4 août 2006 à 14:19
vi je sais je devais l'épurer de ce coté la pour les { }
metre des resusltats en variable ne me parais pas une bonne solution car cela risque de ralentir le code ( je suis a l'interieur d'une boucle pouvant depasser les 2000 iteration, sous mirc c'est beaucoup)

j'ai tenté de metre la ligne que tu m'a donné, ca me ramene au meme probleme, ca ne marche pas avec le regex, en mode normal ca marche mais pas en regex

j'ai meme réésayer de metre un echo sur %item et $gettok(%data,1) et rien:

%item = [Yoso]`OST`@1
$gettok(%data,1,1) = [Yoso] .hack Liminality - OST 1.zip

( la bdd est séparée en deux, une qui gere les listes et contenu des bots (Nb de paquets, derniere maj et tt) et l'autre qui continen tt les info des packs))

la mémoire ne peut etre définie mais elle definie l"humanitée (G.I.T.S)
0
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
4 août 2006 à 14:41
C'est illisible.. J'aimerais pas être le parser de conditions de mIRC.. :x


if ($calc($ctime - $gettok($hget(%table2,$gettok(%item,1,64)),8,32))
<= %max || !%max) && ((!$did(107).state  && %tok
iswm $gettok(%data,1,1)) || $did(107).state)  {


deviendrait, chez moi :


var %e1 = $hget(%table2,$gettok(%item,1,64))

var %e2 = $calc($ctime - $gettok(%e1,8,32))

var %c1 = $iif(%e3 <= %max,1,0)

var %c2 = $iif(!%max,1,0)
var %c3 = $iif(!$did(107).state,1,0)

var %c4 = $iif(%tok
iswm $gettok(%data,1,1),1,0)

if (  (%c1 || %c2) && ((%c3 && %c4) || !%c3)  ) { ... }


Je n'ai pas trop compris ou les regex intervenaient, je n'ai pas
décortiqué le code (trop dur à lire..), mais si je peux t'aider
n'hésite pas..

PaDa
0

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

Posez votre question
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
4 août 2006 à 14:43
Oups, %e2 pas %e3 dans le %c1, et possible que mIRC parse mal le %c4, à tester..
Le but n'étant pas d'écrire un code en un minimum de ligne... :x
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
4 août 2006 à 16:03
moi je ferai comme pada en mettant dans des variables en rajoutant le switch -s pour voir ce qui est bien "setté".
ensuite je mettrai un echo de la ligne du if sans les parentheses et le if qui suit.:

var %e1 = $hget(%table2,$gettok(%item,1,64))
var %e2 = $calc($ctime - $gettok(%e1,8,32))
var %c1 = $iif(%e2 <= %max,1,0)
var %c2 = $iif(!%max,1,0)
var %c3 = $iif(!$did(107).state,1,0)
var %c4 = $iif(%tok iswm $gettok(%data,1,1),1,0)
echo -a if ((  %c1 ou %c2 ) et si %c3 et %c4 ) ou si ! %c3 alors ca passe
if (((%c1 || %c2) && %c3 && %c4)) || (!%c3) { ... }

apres sinon, met tes conditions sur plusieurs lignes

if (%c1 || %c2) {
if (%c3 && %c4) echo -a ca passe
}
elseif (!%c3) echo -a ca passe aussi
else echo -a ca passe pas
}

bonne chance :(
0
hisoka2501 Messages postés 264 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 7 juillet 2009
4 août 2006 à 16:35
je sais deja ou ca plante moi :/
de plus un code crade et difficil a lire n'est pas forcement dur a executer pour mirc
declarer des tas de variables en revanches , au sein d'une boucle qui plus est pour perdre du temp inutilement je ne pourais guerre faire mieux :/
la seulle erreure apparement est dans la condition en elle meme mais bon
je vois ca tt a leur je suis trop OQP avec une aliace la :/

a savoir:
alias wexp.pos {
  ;retourne la Nieme position d'une écritrue abregée ex: $wexp.pos(8-20,2) retourne => 10
  if ($2) {    var %param $2 , %i 1 , %input = $1
    tokenize $asc(-) $1
    while ($gettok($1-,%i,32) < %param) inc %i
    return $calc($gettok($1-,%i,32) + %param -1 - $mgettok(%input,$calc(%i -1),32,2,45))
  }
}

($mgetttok() permet d'imbriquer proprement plein de gettok)

enfin je ne vais pas m'ecarter du sujet qui reste éviedment le meme :(
ma conditionele qui ne marche pas
é par pitiée arretez de me dire de declarer 3 tonnes de variables pour rien ca ne fera que ralentire le code monstrueusement

Je n'ai pas trop compris ou les regex intervenaient, je n'ai pas
décortiqué le code (trop dur à lire..), mais si je peux t'aider
n'hésite pas.. << dans le $hfind
var %item $hfind(%table,$iif($did(107).state 1,%tok,$+(*,%tok,*)),%i,$iif($did(107).state == 1,r,w)).data

la mémoire ne peut etre définie mais elle definie l"humanitée (G.I.T.S)
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
4 août 2006 à 16:49
La déclaration de variable sert a debugué le code et non a le ralentir, tu préferes savoir pourquoi le code marche pas et que ca aille moins vite pour l'instant ou que ca speed et que ca marche pas :) ?

La vilaine ligne retourne une erreur ? Tu es sur que tout les variables existent ?

pour la switchbar, non la commande n'existe pas malgré que cela ai été demandé
0
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
4 août 2006 à 17:09
Si t'es à la ms près.. change de langage :x

Les vars locales ca ralentit peanuts, par contre pour le parser mirc
grouper comme il faut 6-7 conditions je doute que ce soit si rapide que
ca.. Si j'ai le temps ce ouik end, j'essaierai de faire un ptit bench
pour voir :-)

Bref les codes crades, je trouve ca insupportable à maintenir et lire.. enfin c'est ta vie tu fais ce que tu veux ;-))

Syntaxiquement, mon code est correct et ne "plante" pas, à toi de voir ce que tu veux.


Pour le hfind, tu peux me montrer le genre de masque qui est passé en
argument ? La je vois que c'est des trucs dynamiques, c'est assez
lourdingue en regex, faut bien penser à échapper les métachar..

PaDa
0
hisoka2501 Messages postés 264 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 7 juillet 2009
4 août 2006 à 18:32
en regex c'est ce que l'utilisateur entre das $did(17) qui est pris en compte, pour ma part "hack" (pour [Yoso] .hack Liminality - OST 1.zip)

$regex([Yoso] .hack Liminality - OST 1.zip,hack) << ca retourne 1
pourtant ca ne passe pas dans la conditionele

la mémoire ne peut etre définie mais elle definie l"humanitée (G.I.T.S)
0
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
4 août 2006 à 20:16
Ok..

Je suppose que sans les $iif c'est pareil ? Et que %tok est ok ?
Bizarre quand même :/
PaDa
0
hisoka2501 Messages postés 264 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 7 juillet 2009
4 août 2006 à 21:01
j'ai tout vérifier :$ %tok = $did(17) cad ce que l'utilisateur entre, je vais re vérifier tout ca mais je suis sur de moi sur ce coup la :$

la mémoire ne peut etre définie mais elle definie l"humanitée (G.I.T.S)
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
4 août 2006 à 21:29
De toute facon en passant par les variables de Pada, c'etais assez clair que le probleme venait des valeur contenuent dans les variables et non de la syntaxe du if
0
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
7 août 2006 à 08:50
Ouais, à ceci près que le parser de mIRC (je n'ai pas vérifié sur la 6.2) se gauffre parfois en évaluant les variables pas super bien. Egalement, plus fréquemment, en trouvant un nombre d'arguments invalide alors que c'est correct normalement...
C'est le coté obscuuuur =]
0
Rejoignez-nous