PureBasic
https://www.purebasic.fr/french/

Problème ClearList()
https://www.purebasic.fr/french/viewtopic.php?f=7&t=8007
Page 1 sur 1

Auteur:  meganet [ Lun 21/Avr/2008 12:45 ]
Sujet du message:  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!

Auteur:  Fanator [ Lun 21/Avr/2008 13:30 ]
Sujet du message: 

bonjour. j'ai testé ce bout de code ches moi fonctionne avec jaPBe
Code:
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

Auteur:  cha0s [ Lun 21/Avr/2008 14:16 ]
Sujet du message: 

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.

Auteur:  gnozal [ Mar 22/Avr/2008 13:32 ]
Sujet du message: 

Rappel des règles pour signaler un bug : http://www.purebasic.fr/english/viewtopic.php?t=4701

Citation:
(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 ...

Auteur:  Chris [ Mar 22/Avr/2008 13:35 ]
Sujet du message: 

gnozal a écrit:
Rappel des règles pour signaler un bug : http://www.purebasic.fr/english/viewtopic.php?t=4701

Citation:
(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:

Auteur:  meganet [ Dim 27/Avr/2008 19:06 ]
Sujet du message:  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).

Code:
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!!!

Auteur:  Jacobus [ Lun 28/Avr/2008 9:13 ]
Sujet du message: 

Tu devrais essayer de passer ta liste en global, comme ça :
Code:
Global NewList Verif.s()

Auteur:  meganet [ Lun 28/Avr/2008 14:39 ]
Sujet du message:  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!

Auteur:  Jacobus [ Lun 28/Avr/2008 14:59 ]
Sujet du message: 

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

Auteur:  meganet [ Lun 28/Avr/2008 16:38 ]
Sujet du message:  Pass

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?

Auteur:  Jacobus [ Lun 28/Avr/2008 20:06 ]
Sujet du message: 

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.

@+

Auteur:  meganet [ Lun 28/Avr/2008 20:34 ]
Sujet du message:  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.

Page 1 sur 1 Heures au format UTC + 1 heure
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/