Problème ClearList()
Problème ClearList()
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!
Quelqu’un à une solution ?
Merci d'avance!
bonjour. j'ai testé ce bout de code ches moi fonctionne avec jaPBe
Windows XP sp2 - mémoire 1 Go
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
Rappel des règles pour signaler un bug : http://www.purebasic.fr/english/viewtopic.php?t=4701
Poster un 'bug' sans aucun code à l'appui est parfaitement inutile ...(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.
Ca, c'est la règle chez les rosbeef.gnozal a écrit :Rappel des règles pour signaler un bug : http://www.purebasic.fr/english/viewtopic.php?t=4701
Poster un 'bug' sans aucun code à l'appui est parfaitement inutile ...(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.
C'est parce que faut tout leur expliquer, à eux
Voilà mon code.
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).
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!!!
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
Merci de votre aide!!!
Tu devrais essayer de passer ta liste en global, comme ça :
Code : Tout sélectionner
Global NewList Verif.s()
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Ca marche!
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!
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é)
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...
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
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...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.
@+
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.
@+
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
C'est fait.
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.