Problème ClearList()

Archive.
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

Problème ClearList()

Message 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!
Fanator
Messages : 20
Inscription : jeu. 19/avr./2007 8:14

Message 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
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message 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.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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 ...
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :lol:
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

Voilà mon code.

Message 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!!!
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

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.
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

Ca marche!

Message 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!
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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...
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.
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

Pass

Message 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?
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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.

@+
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.
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

C'est fait.

Message 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.
Répondre