Hdel qui marche pas

Résolu
Signaler
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
-
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
-
Voila je realise un lecteur mp3 en ce moment et il y a un probleme
lorsque je ve supprimer un mp3 : il ne supprime pas la ligne de ma list
mais il la remplace par un blanc .



lorsque j'ajoute un mp3 :

if ($did == 3) {

var %a $$sfile(c:)

var %b 1

while ($hget(Mp3,%b)) {

if ($nopath(%a) == $ifmatch) { var %c dd }

inc %b

}

if (%c) { echo -a Tu ne peux
ajouter cette chanson car elle est deja dans ta playlist }

else {

inc %nb

var %artiste $$input(Nom :,e,Quel est le nom de l'artiste de la chanson)

Hadd -m mp3 %nb $nopath(%a)

Hadd -m chemin %nb %a

hadd -m artiste %nb %artiste

liste

}

}

on s'interesse juste au Hadd -m mp3 %nb $nopath(%a)

et lorsque le supprime un mp3 :

elseif ($did == 6) { hdel Mp3
$$did(2).sel | hdel artiste $did(2).sel | hdel Chemin $did(2).sel | dec
%nb | liste }



et l'alias liste :

alias liste {

did -r mp3 2

var %a 1

while ($hget(Mp3,%a).item) {

did -a Mp3 2 $hget(Mp3,%a)

inc %a

}

hsave Mp3 Mp3

}



l'id de ma list est 2 bien sur

Et donc quand je ve supprimer il remplace la chanson par un blanc j'vois pas pourquoi :$

35 réponses

Messages postés
1726
Date d'inscription
vendredi 12 septembre 2003
Statut
Membre
Dernière intervention
13 juin 2009
1
je crois que ya un décalage entre le nb de ligne et le nb d'entrée dans
la table, enfin je sais que perso j'étais obligé d'utiliser $calc()
pour déplacer vers le haut toutes les entrées de ma table qd je
délétais une ligne du milieu..

ce qui donne un truc dans ce genre: (c'est tiré d'un remote à moi donc ça marchera pas tel quel sur ton script..)



" if $did == 12 { did -d $dname 6 $did(6).sel | var %x 1 | while
$did(6,%x) { hdel exa.away $+(r-,$calc(%x +1)) | hadd exa.away
$+(r-,%x) $ifmatch | inc %x } | halt }"
-1337 connexion-
Messages postés
879
Date d'inscription
vendredi 22 octobre 2004
Statut
Membre
Dernière intervention
29 juin 2007

Je pense qu'il fait plutot faire comme ça pour la boucle :

et l'alias liste :
alias liste {
did -r mp3 2
var %o^ 1 , %ù^ $hget(mp3,0).item
while (%o^ <= %ù^) { did -a Mp3 2 $hget(Mp3,%o^) | inc %o^ }
hsave Mp3 Mp3
}

désolé si c'est pas ça j'suis mal réveillé :'(
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
J'voulais pas tout decaler mais bon si c le seul moyen jvé m'y mettre
Messages postés
216
Date d'inscription
mardi 7 novembre 2000
Statut
Membre
Dernière intervention
16 mars 2006

Concernant la première boucle qui vérifie si la chanson existe avant de l'ajouter, il vaut mieux la supprimer et utiliser $hfind.

Pour ton problème de ligne vide c'est normal, regardons ce qui se passe.
Imaginons ta table initiale :
item valeur
1 chanson A
2 chanson B
3 chanson C
4 chanson D

Tu veux ajouter chanson E, elle n'existe pas, donc il ajoute
5 chanson E

Ensuite, actualisation de la list (alias liste).
Ta liste de MP3 devient :
chanson A
chanson B
chanson C
chanson D
chanson E

Puis tu décides de supprimer chanson B qui se trouve être sur la ligne 2 de ta list, il va supprimer l'item nommé 2.
Ta table devient :
1 chanson A
3 chanson C
4 chanson D
5 chanson E

Ensuite, actualisation de la list (alias liste)
Tu vas boucler tant que $hget(Mp3,%a).item existe, donc 4 fois puisque il y a 4 items dans ta table, en partant de 1.
Tu fais afficher dans ta list $hget(Mp3,%a), donc la valeur de l'item %a et non la valeur de chaque item existant.
Affichage des items 1, 2, 3, 4 et non 1, 3, 4, 5.
Donc dans ta list tu auras ceci :
chanson A

chanson C
chanson D

L'item 2 n'existant plus il te met une ligne blanche et il ne t'affiche même plus la dernière chanson ajoutée.
C'est juste la méthode qui est à revoir.
J'espère avoir répondu à ta question : "j'vois pas pourquoi".
Bonne continuation.
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Oui mais sa j'avais compris , mais la methode de tofu est tres bien ^^
Messages postés
1726
Date d'inscription
vendredi 12 septembre 2003
Statut
Membre
Dernière intervention
13 juin 2009
1
sinon ce que tu peux faire c'est ta liste, tu l'as en .txt (file
handling pour la vitesse d'exécution) ap qd tu del une ligne, tu refais
un /loadbuf sur ton fichier et ça remet tout en place je pense. ça
pourrait être une alternative viable enfin à tester tout du moins..
-1337 connexion-
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Voila j'ai reussis.Mais pour rajouter dans la table mp3 c'etais pas dur
par contre j'enregistrais le chemin du mp3 ds une table il a fallu que
je fasse des ptit reglage ca donne ca :

elseif ($did == 6) {

var %x $$did(2).sel

did -d $dname 2 %x

var %tofu 1

set %nb1 %nb

unset %nb

hfree mp3

while ($did(2,%tofu)) {

inc %nb

hadd -m Mp3 %nb $ifmatch

if (%x >= 1
&& %x < %nb1) { var %c $hget(Chemin,$calc(%tofu +1)) | hdel
Chemin %tofu | hadd -m Chemin %nb %c }

else { hdel Chemin %nb1 }

inc %tofu

}

unset %nb1

liste

}
Messages postés
216
Date d'inscription
mardi 7 novembre 2000
Statut
Membre
Dernière intervention
16 mars 2006

Tu dis : "Oui mais sa j'avais compris"
Euh...??? Tu avais bien dit il me semble : "quand je ve supprimer il remplace la chanson par un blanc j'vois pas pourquoi"
Moi je t'ai expliqué pourquoi.

Ensuite, connaissant la cause, je sais que tu as un niveau plutôt correct en mIRC scripting pour pouvoir rectifier le tir. Pour les débutants je conçois qu'on puisse donner carrément certaines solutions ou les façons de procéder, mais pour les autres, il me semble qu'il suffit de leur donner la cause de l'erreur pour que par eux-même ils puissent corriger. Si vraiment, par la suite après diverses recherches, le scripteur chevronné ne trouve pas, on peut lui donner une soluce si on en a une.
Moi en tous cas, je préfère qu'on me dise d'où vient mon erreur plutôt qu'on me donne la solution directement.

Mais si tu en voulais une directement, fallait la demander
Messages postés
1726
Date d'inscription
vendredi 12 septembre 2003
Statut
Membre
Dernière intervention
13 juin 2009
1
lol la var %tofu ..
-1337 connexion-
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
nolson je savais que ca venais de la le probleme mais je voulais eviter de tout remplacé c'est pour ca :$

Mais merci quand meme :)
Messages postés
216
Date d'inscription
mardi 7 novembre 2000
Statut
Membre
Dernière intervention
16 mars 2006

Pas de problème wims, mais la prochaine fois pose mieux ta question parce que quand on me dit "je vois pas pourquoi" pour moi ça veut bien dire "je ne vois pas pourquoi"
Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009

Bonjour,

juste pour dire qu'il serait vraiment très judicieux de ne pas utiliser de hash table dans le cas présent.

Cela conduira à une lenteur assez prononcée à cause de nombreuses opérations de pseudo-décalage.

Une bonne solution consiste à utiliser une liste MDX avec colonnes, une
colonne cachée (de taille 0) servira à stocker le chemin du fichier.

Ou alors tu peux utiliser une fenêtre cachée (ou un listbox cachée),
que tu rempliras avec les chemins des fichiers, ainsi un simple /dline
servira à supprimer proprement une ligne (il faudra aussi supprimer la
ligne dans la liste du dialog).
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Ben j'ai utilisé les fichier.txt et c'est impecable :x
Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009

Ah bon, tu n'utilises plus de hash pour stocker les chemins des fichiers ?

Cependant faut faire également attention avec les fichiers txt, un
/write -d ou un /write -i équivaut à décaler un grande partie des
données du fichier, à petite echelle, ça risque de pas se remarquer,
mais à grande echelle (plus de 2000 mp3), ça risque d'être nettement
plus lent
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Bah nan j'utilise write -dl et comme ds la list chaque did(*).sel = a la meme ligne ds le fichier txt, aucun pb
Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009

oui je sais ça, c'est évident.



Seulement /write -dl décale tout les données du fichier, afin de
supprimer la ligne et de décaler vers le haut les lignes d'en dessous.

L'insertion de ligne ou supression de ligne n'est pas une opération 'standard' dans les fichiers.

C'est pour ça qu'aucune fonction du file handling de mIRC ne te permet
d'insérer ou de supprimer des octets n'importe où dans le fichier
(généralement on peut juste insérer et supprimer à la fin).



En gros ce que je voulais te dire c'est que /write -dl effectue une
opération 'lourde' est pas franchement rapide, et qu'il est possible de
trouver des solutions nettement plus rapide
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Hum ok et j'aurais une question, pour mon mp3 je voudrai utilisé tes
alias $wav et $wma seulement je n'y arrive pas et jvoulais savoir
pourquoi ne pas avoir fait $midi :p

$wav(fichier).***



"fichier" dois etre le nom complet ex : c:\windows\blabla.wav

ou alors juste le nom : blabla.wav

Si il faut tout le repertoire , si il y a des espace ca marchera ?

meme question pour $wma :]
Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009

$wav(fichier) ou $wma(fichier), fichier doit être un nom complet:
c:\windows\blabla.wav, ça marche également si il y a des espaces, ex:
C:\Mes sons\Son sympa 1.wav



Et pour le $midi, j'avais tenté d'en faire un, mais après pas mal
d'efforts, j'ai lâché prise, à vrai dire; le format est assez
compliqué. Par exemple pour obtenir la durée, il faut calculer le temps
de tous les channels, en sachant que le temps s'obtient en additionant
le temps de toutes les notes (noire, blanche, ronde, triolet, etc..) et
de tout les silences (soupir, silence, etc..), et pour calculer le
temps d'une note il faut faire une opération avec le tempo actuel, en
sachant que le tempo peut changer, et tout ça sans compter les
éventuelles note maintenues avec la pédale... Bref, c'est un peu chiant
de coder ça :p
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Ok merci beaucoup j'essayerai demain

pour calculer la durée d'un midi : $duration($calc($insong.length / 1000))

:p
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Hum j'ai essayer mais $wav($insong.fname).format ou
$wav($insong.fname).channels ne me retourne rien alors que
$insong.fname retourne bien le chemin du wav

Est -il possible que ca ne retourne pas l'information pour certains wav ?

( j'ai essayer avec un seul )