Page 1 sur 1
Problème ClearList()
Publié : lun. 21/avr./2008 12:45
par meganet
Salut, j'utilise une liste chainé pour stoker une grande quantité d'éléments (65000 ou +). Quand je fait un ClearList(malist()) le soft plante. J'ai essayé de rajouter un Delay() jusqu'à 10 sec ça ne change rien il plante juste au moment du ClearList(malist()).
Quelqu’un à une solution ?
Merci d'avance!
Publié : lun. 21/avr./2008 13:30
par Fanator
bonjour. j'ai testé ce bout de code ches moi fonctionne avec jaPBe
Code : Tout sélectionner
NewList maliste.l()
For i=1 To 75000
AddElement(maliste())
maliste()=i
Next
ForEach maliste()
Debug maliste()
Next
ClearList(maliste())
Debug maliste() ; message : the linked list doesn't have a current element
Windows XP sp2 - mémoire 1 Go
Publié : lun. 21/avr./2008 14:16
par cha0s
essaye avec un nombre d'élément de manière crescendo pour voir a combien d'enregistrement sa plante. vérifie aussi l'état de ta mémoire.
Moi j'opte pour un dépassement de pile :p.
Publié : mar. 22/avr./2008 13:32
par gnozal
Rappel des règles pour signaler un bug :
http://www.purebasic.fr/english/viewtopic.php?t=4701
(4) If something doesn't "seem to work", then post it in the Questions section first, unless you know it's a bug. A lot of times a bug is just lack of knowledge by a newbie of how to use a command correctly.
(7) If you've found something that seems to be a real bug, then try to narrow it down to a small section of code, and post that code with your report. It's hard to help if we can't see exactly what you're doing.
Poster un 'bug' sans aucun code à l'appui est parfaitement inutile ...
Publié : mar. 22/avr./2008 13:35
par Chris
gnozal a écrit :Rappel des règles pour signaler un bug :
http://www.purebasic.fr/english/viewtopic.php?t=4701
(4) If something doesn't "seem to work", then post it in the Questions section first, unless you know it's a bug. A lot of times a bug is just lack of knowledge by a newbie of how to use a command correctly.
(7) If you've found something that seems to be a real bug, then try to narrow it down to a small section of code, and post that code with your report. It's hard to help if we can't see exactly what you're doing.
Poster un 'bug' sans aucun code à l'appui est parfaitement inutile ...
Ca, c'est la règle chez les rosbeef.
C'est parce que faut tout leur expliquer, à eux
Voilà mon code.
Publié : dim. 27/avr./2008 19:06
par meganet
Salut, voici mon code, j'ai un autre problème, c'est quand le fichier de préférence est fermé, que le thread est lancé et que le nouveau fichier de préférence est créé, le programme plante. Pour voir le problème avec ClearList() mettre 2 à la 2eme boucle (For Lent=1 To 2) et pour le problème de préférence, il faut mettre 3 (For Lent=1 To 3).
Code : Tout sélectionner
EnableExplicit
Define Dir_Comp.s, Key.s, MD5.s, Test.l, *ASC_SRC.l, Caract.l, ThreadCompress.l, PasswordNumber.l, Lent.l, PreferencesNumber.l
Global Charset_List.s, DirIni.s, DirCompress.s, MutexCompress
Declare.s BruteForceNext(Key.s, Size.l, Charset.s)
Declare Compress(FileNumber.l)
MutexCompress = CreateMutex()
For Caract=0 To 255
Charset_List + Chr(Caract)
Next Caract
DirIni = PathRequester("Dossier pour les fichiers .ini", "")
DirCompress = PathRequester("Dossier pour les fichiers compressés.", "")
NewList Verif.s()
; premier exemple d'utilisation :
; Une recherche pure et simple de toutesles combinaisons
Key = ""
MD5 = ""
PassWordNumber = 0
PreferencesNumber = 0
Macro Pass
Key = BruteForceNext(Key, Lent, Charset_List)
*ASC_SRC = AllocateMemory(Len(Key)+1)
PokeS(*ASC_SRC, Key, Len(Key), #PB_Ascii)
MD5 = MD5Fingerprint(*ASC_SRC, Len(Key))
Test = 0
ForEach Verif()
If Key = Verif()
Test = 1
EndIf
Next
If Test = 0
AddElement(Verif())
Verif() = Key
PreferenceGroup("MD5ASC")
WritePreferenceString(MD5, Key)
PasswordNumber + 1
EndIf
EndMacro
For Lent=1 To 3
Repeat
If PasswordNumber <= 0
CreatePreferences(DirIni+Str(PreferencesNumber)+".ini")
Pass
ElseIf PasswordNumber >= 200000
PreferenceGroup("")
PreferenceComment("Preference file of MegaNet Brute Force")
PreferenceComment("Date : "+FormatDate("%yyyy/%mm/%dd %hh:%ii:%ss", Date()))
PreferenceComment("File : "+Str(PreferencesNumber)+" .")
WritePreferenceLong("PasswordNumber", CountList(Verif()))
WritePreferenceString("Type", "MD5 To ASC .")
ClosePreferences()
Delay(3000)
ThreadCompress = CreateThread(@Compress(), PreferencesNumber)
PasswordNumber = 0
PreferencesNumber + 1
CreatePreferences(DirIni+Str(PreferencesNumber)+".ini")
Pass
Else
Pass
EndIf
Until Not Key
Next Lent
PreferenceGroup("")
PreferenceComment("Preference file of MegaNet Brute Force")
PreferenceComment("Date : "+FormatDate("%yyyy/%mm/%dd %hh:%ii:%ss", Date()))
PreferenceComment("File : "+Str(PreferencesNumber)+" .")
WritePreferenceLong("PasswordNumber", CountList(Verif()))
WritePreferenceString("Type", "MD5 To ASC")
ClosePreferences()
Delay(4000)
MessageRequester("ClosePreferences", "OK!", 0)
FreeMemory(*ASC_SRC)
MessageRequester("FreeMemory", "OK!", 0)
ClearList(Verif())
Delay(4000)
MessageRequester("ClearList", "OK", 0)
ThreadCompress = CreateThread(@Compress(), 0)
MessageRequester("CreateThread", "OK!", 0)
WaitThread(ThreadCompress)
MessageRequester("Fini!", "Les mots de passes on tous été génèrés.", #PB_MessageRequester_Ok)
End
Procedure.s BruteForceNext(Key.s, Size.l, Charset.s)
Protected Partial.l, Pos.l, rKey.s, rSet.s
If Len(Key) < Size
Partial = #True
ElseIf Len(Key) > Size Or Len(Charset) <= 1
Key = #NULL$
EndIf
If Key And Not Partial
While Right(Key, 1) = Right(Charset, 1)
Key = Left(Key, Len(Key)-1)
Wend
EndIf
If Key And Not Partial
rKey.s = Right(Key, 1)
rSet.s = Right(Charset, 1)
While rKey = rSet
Key = Left(Key, Len(Key)-1)
rKey.s = Right(Key, 1)
Wend
EndIf
If Key And Not Partial
Pos = FindString(Charset, Right(Key, 1), 1) + 1
Key = Left(Key, Len(Key)-1) + Mid(Charset, Pos, 1)
EndIf
If Key Or Partial
While Len(Key) < Size
Key + Left(Charset, 1)
Wend
EndIf
ProcedureReturn Key
EndProcedure
Procedure Compress(FileNumber.l)
LockMutex(MutexCompress)
MessageRequester("Nombre", "Nombre = "+Str(FileNumber)+" .", #PB_MessageRequester_Ok)
CreatePack(DirCompress+Str(FileNumber)+".cmp")
Delay(300)
AddPackFile(DirIni+Str(FileNumber)+".ini", 9)
Delay(6000)
ClosePack()
Delay(6000)
UnlockMutex(MutexCompress)
ProcedureReturn 1
EndProcedure
DisableExplicit
Voilà également le lien du fichier .rar qui contient le programme compilé, le fichier source, et les 2 fichiers créés pour le 2eme problème :
Brute_Force.rar.
Merci de votre aide!!!
Publié : lun. 28/avr./2008 9:13
par Jacobus
Tu devrais essayer de passer ta liste en global, comme ça :
Ca marche!
Publié : lun. 28/avr./2008 14:39
par meganet
Effectivement ça marche!!!! Mais lol jcomprend pas pourquoi. Le ClearList(Verif()) n'est pas dans une procédure don cpour moi il y avais pas besoin de mettre ma liste en global. Et ça ne résoud parcontre pas mon 2ème problème. Le programme plante toujours quand il doit changer de fichier et que le thread pour compresser le premier fichier est appelé. Merci du coup de main!
Publié : lun. 28/avr./2008 14:59
par Jacobus
Si si, tu te sers de la liste Verif() dans une procédure, il faut donc qu'elle soit globale. Pour le reste j'ai l'impression que le blème vient de là: (j'ai pas testé)
Code : Tout sélectionner
Repeat
If PasswordNumber <= 0
CreatePreferences(DirIni+Str(PreferencesNumber)+".ini")
Pass
ElseIf PasswordNumber >= 200000
PreferenceGroup("")
PreferenceComment("Preference file of MegaNet Brute Force")
PreferenceComment("Date : "+FormatDate("%yyyy/%mm/%dd %hh:%ii:%ss", Date()))
PreferenceComment("File : "+Str(PreferencesNumber)+" .")
WritePreferenceLong("PasswordNumber", CountList(Verif()))
WritePreferenceString("Type", "MD5 To ASC .")
ClosePreferences()
Delay(3000)
ThreadCompress = CreateThread(@Compress(), PreferencesNumber)
PasswordNumber = 0
PreferencesNumber + 1
CreatePreferences(DirIni+Str(PreferencesNumber)+".ini")
Pass
Else
Pass
EndIf
Until Not Key
Car dans ta boucle tu utilises ton thread (qui de par nature travaille en dehors) qui lui même a des Delay() importants de plusieurs secondes. Or, ton thread n'est pas terminé que tu modifies ses valeurs de travail pour le relancer. Même avec un Mutex je ne suis pas sûr que ce soit la bonne façon de faire...
Pass
Publié : lun. 28/avr./2008 16:38
par meganet
Tu parle de Pass? C'est une macro pas une procédure. Mais dans le thread, j'utilise pas la valeur directe je la passe en paramètre exprêt. Tu pense qu'en enlevant le Delay() ça passerai?
Publié : lun. 28/avr./2008 20:06
par Jacobus
Je ne sais pas. Je trouve que des Delay(6000) ça fait beaucoup! Dans ta procédure tu fais attendre le thread plus de 12 secondes à chaque fois !!! ça me paraît long bien que je ne sache pas pourquoi tu les a mis (si c'est pour soulager le processeur un delay(1) suffit.
De plus placer les threads dans une boucle, est-ce une bonne idée? Perso je ne le ferai pas, car ton prog (en l'état) une fois lancé je ne suis pas sûr de pouvoir l'arrêter avant l'an 2040
et encore...
Mais je peux me tromper. N'oublie pas de cocher la case de gestion des Threads dans les options de compilation.
@+
C'est fait.
Publié : lun. 28/avr./2008 20:34
par meganet
Je les es enlevé, ça ne change rien nomplus. Et pour les Delay() c'était pour lesser le temps au fichier .ini de se fermer. J'ai déjà eu le problème avec la lib pack. Et pour lancer le thread à l'interrieur d'une boucle, ce thread sert juste à compresser les fichiers préférences génèrés donc c'est pas lui le plus long.