La mémoire

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

La mémoire

Message par dayvid »

Bonjour, tous est préciser dans le code :)
Cependant ya de gros bug et je n'arrive pas a comprendre pourquoi sa ne marche pas !
Est-ce qu’il serait possible de tester et me dire ce qui cloche svp :)
Est-ce que se serais possible d'améliorer ceci, comment procèderiez-vous ?

Code : Tout sélectionner

; Les oppération sur les variables sont bien trop longue a force de les remplire
; le but est de crée une procedure qui va permètre de faire la même chose
; mais avec une vitesse nètement plus avencer

; Exemple:

; For Variable = 1 To 1000000
;   MaVariable$ + "Abcdefghijklmnopqrstuvwxyz"
; Next

; Ceci va prendre des heurs et des heurs !
; alors que:

; MaVariable("MaVariable$", "+", "Abcdefghijklmnopqrstuvwxyz")

; Va prendre que quelques dizaine de secondes seullement !
; Voici le but de ce programme !

Global NewList GestionnaireDeVariable.s() ; Cette liste va servire pour stoker les imformations sur les variables

; Ajout d'un emplacement vide au début de la liste pour entrée dans la boucle ForEach
; si jamais aucune variable n'est présente dans la liste

AddElement(GestionnaireDeVariable())
GestionnaireDeVariable() = ""

; la procedure permetant de faire des oppérations avec les variables

Procedure.l MaVariable(NomVariable$, Opperateur$, Valeur$)
  Debug "---------------------------"
  ; Je vais faire une recherche pour voir si la variable éxiste déjà ou pas
  
  NombreElementListe = ListSize(GestionnaireDeVariable()) ; Je regarde combien d'élément il y à dans la liste actuellement
  
  ForEach GestionnaireDeVariable() ; Je fait une recherche en passent en revue tous les éléments de la liste
    PositionDansLaListe + 1 ; Je sauvegarde l'emplacement ou nous somme actuellement dans la liste
    
    ; Pour commencer, j'extrait le nom de la variable
    NomDeLaVariable$ = StringField(GestionnaireDeVariable(), 1, "»")
    
    LongueurValeurVariable = Len(Valeur$) ; je regarde combien d'octets fait la valeur de la variable
    
    ; Si la variable a été trouvé c'est qu'elle éxiste, donc on va pas la recrée
    If NomDeLaVariable$ = NomVariable$
      
      ; j'extrait ensuite la valeur de la variable
      ValeurVariable$ = StringField(GestionnaireDeVariable(), 2, "»")
      
      LongueurValeurVariableEnregistrer = Len(ValeurVariable$) ; je regarde combien d'octets fait la valeur de la variable dans la liste
      
      ; puis j'extrait l'emplacement ou se situe la variable dans la mémoire (sont adresse mémoire)
      *EmplacementMemoire = Val(StringField(GestionnaireDeVariable(), 3, "»"))
      
      Debug "A trouvé la variable:"
      Debug "Nom de la variable = " + NomDeLaVariable$
      Debug "Valeur de la variable = " + ValeurVariable$
      Debug "Emplacement Memoire de la variable = " + Str(*EmplacementMemoire)
      
      ; Je vérrifie l'oppérateur pour voir si il est correcte
      If Opperateur$ = "="
        
        ; Si la taille de la variable dans la liste est plus grande que la nouvelle valeur
        If LongueurValeurVariableEnregistrer > LongueurValeurVariable
          ; je suprime toutes les données de cette variable pour en recrée une de la bonne taille
          
          Debug "---------------------------"
          Debug "La taille de la variable dans la liste est plus grande que la nouvelle valeur"
          
          FreeMemory(*EmplacementMemoire) ; je supprime la variable dans la mémoire
          DeleteElement(GestionnaireDeVariable(), 1) ; je supprime égualement la variable dans la liste
          
          Debug "Supprésion de la variable dans la mémoire"
          Debug "Supprésion de la variable dans la liste"
          
          ; Pour conserver quoiqu'il arrive un élément courant valide après un DeleteElement()
          ; j'utilise la valeur 1 dans le paramètre 'Options'. Le nouvel élément est alors l'élément
          ; qui suivait l'élément supprimé.
          
          ; Si la liste ne contenait plus qu'un seul élément
          ; alors il n'y a plus d'élément courant. 
          
          PositionDansLaListe - 1 ; L'élement courent a changer donc j'enlève 1
          
          ; Je recrée le tous:
          
          *EmplacementMemoire = AllocateMemory(LongueurValeurVariable + 1) ; j'aloue la mémoire néccéssaire suivent la taille de la valeur de la variable plus 1 octet de sécurité
          
          LastElement(GestionnaireDeVariable()) ; je vais a la fin de la liste
          AddElement(GestionnaireDeVariable())
          GestionnaireDeVariable() = NomVariable$ + "»" + Valeur$ + "»" + Str(*EmplacementMemoire) ; j'insère la nouvelle variable dans ce format: Variable»Valeur»EmplacementMemoire
          
          
          ; Sinon si la taille de la variable dans la liste est plus petite que la nouvelle valeur
        ElseIf LongueurValeurVariableEnregistrer < LongueurValeurVariable
          
          Debug "---------------------------"
          Debug "La taille de la nouvelle valeur est plus grande que la variable dans la liste"
          
          ; Je regarde la différence de taille qu'il y as entre les deux taille de valeur 
          DifferenceTaille = LongueurValeurVariable - LongueurValeurVariableEnregistrer ; La plus grande - la plus petite
          
          Debug "La différence est de " + Str(DifferenceTaille) + " octets"
          
          *EmplacementMemoire = ReAllocateMemory(*EmplacementMemoire, DifferenceTaille + 1) ; je réaloue de la mémoire a la suite de la précedente suivent la taille de la valeur de la variable plus 1 octet de sécurité
          
          If *EmplacementMemoire > 0 ; Si l'emplacement a été correctement alouer
            
            ; je remplace la valeur de la valiable dans la liste
            GestionnaireDeVariable() = NomVariable$ + "»" + Valeur$ + "»" + Str(*EmplacementMemoire) ; j'insère la nouvelle variable dans ce format: Variable»Valeur»EmplacementMemoire
            
          Else ; Sinon si l'emplacement n'a pas été correctement alouer, ont affiche un message d'avertissement
            Debug "Impossible d'allouer la mémoire demandée pour la variable !"
            ProcedureReturn 0 ; Nous sorton imédiatement de la procedure avec la valeur 0 pour dire que l'oppération sur la variable a échouer
          EndIf 
          
          ; Sinon si les deux valeur sont identique
        ElseIf LongueurValeurVariableEnregistrer = LongueurValeurVariable
          ; Rien ne change, ont ne fait rien puisque les deux valeur sont identique
        EndIf
        
        ; Je remplace le comptenue de la variable
        
        PokeS(*EmplacementMemoire, Valeur$, -1, #PB_Ascii) ; J'écrie dans la mémoire la valeur de la variable
        Debug "---------------------------"
        Debug "A remplacer la valeur de la variable:"
        Debug "Nom de la variable = " + NomDeLaVariable$
        Debug "Nouvelle valeur de la variable = " + Valeur$
        Debug "Nouvelle emplacement Memoire de la variable = " + Str(*EmplacementMemoire)
        
      ElseIf Opperateur$ = "+"
        
      ElseIf Opperateur$ = "-"
        
      ElseIf Opperateur$ = "*"
        
      ElseIf Opperateur$ = "/"
        
      Else
        Debug "Oppérateur invalide !"
        ProcedureReturn 0 ; Nous sorton imédiatement de la procedure avec la valeur 0 pour dire que l'oppération sur la variable a échouer
      EndIf
      
      Break ; ont quitte la boucle puisqu'ont a trouvé la variable
      
    Else ; Sinon
      
      If PositionDansLaListe = NombreElementListe ; si on est a la fin de la liste et si la variable n'a pas été trouvé, c'est qu'elle n'éxiste pas, donc on va la crée
      LongueurValeurVariable = Len(Valeur$) ; je regarde combien d'octets fait la valeur de la variable
      *EmplacementMemoire = AllocateMemory(LongueurValeurVariable + 1) ; j'aloue la mémoire néccéssaire suivent la taille de la valeur de la variable plus 1 octet de sécurité
      
      If *EmplacementMemoire > 0 ; Si l'emplacement a été correctement alouer
        
        Debug "N'a pas trouvé la variable:"
        Debug "Nom de la variable = " + NomVariable$
        Debug "---------------------------"
        Debug "A enregistrer la variable:"
        Debug "Nom de la variable = " + NomVariable$
        Debug "Valeur de la variable = " + Valeur$
        Debug "Longueur de la valeur de la variable = " + Str(LongueurValeurVariable) + " Octets"
        Debug "Adresse d'alocation de l'emplacement de la Memoire de la variable = " + Str(*EmplacementMemoire)
        Debug "---------------------------"
        
        ; Enregistrement de la variable, de sa valeur, et numéro d'emplacement
        
        LastElement(GestionnaireDeVariable()) ; je vais a la fin de la liste
        AddElement(GestionnaireDeVariable())
        GestionnaireDeVariable() = NomVariable$ + "»" + Valeur$ + "»" + Str(*EmplacementMemoire) ; j'insère la nouvelle variable dans ce format: Variable»Valeur»EmplacementMemoire
        
        PokeS(*EmplacementMemoire, Valeur$, -1, #PB_Ascii) ; J'écrie dans la mémoire la valeur de la variable
        
        Debug "Résulta:"
        Debug NomVariable$ + "»" + Valeur$ + "»" + Str(*EmplacementMemoire)
        
      Else ; Sinon si l'emplacement n'a pas été correctement alouer, ont affiche un message d'avertissement
        Debug "Impossible d'allouer la mémoire demandée pour la variable !"
        ProcedureReturn 0 ; Nous sorton imédiatement de la procedure avec la valeur 0 pour dire que l'oppération sur la variable a échouer
      EndIf 
    EndIf
    
  EndIf
    
  Next GestionnaireDeVariable()
  
  ; Comme tous c'est bien passer, nous sorton imédiatement de la procedure avec la valeur 1 pour dire que l'oppération sur la variable a été un succer
  ProcedureReturn 1
  
  
  
EndProcedure

; Procedure AjoutDonnerMemoire(Donner$)
;   CopyMemoryString(PeekS(*Pointeur) + Donner$ + Chr(13) + Chr(10), @*Pointeur)
; EndProcedure
; 
; Global *PointeurVariableID

MaVariable("abc", "=", "2")
MaVariable("abcd", "=", "4")
MaVariable("abcde", "=", "6")

MaVariable("abc", "=", "4")
MaVariable("abcd", "=", "8")
MaVariable("abcde", "=", "2")

MaVariable("abc", "=", "445")
MaVariable("abcd", "=", "Abcdefghijklmnopqrstuvwxyz")
MaVariable("abcde", "=", "")

MaVariable("abc", "=", "Abcdefghijklmnop")
MaVariable("abcd", "=", "Abcdefghijklmnop124")
MaVariable("abcde", "=", "Abcdefghijklmnopqrstuvwxyz0123456789")

MaVariable("abc", "=", "1500")
MaVariable("abc", "=", "0123456789012345678901234567890123456789")
MaVariable("abc", "=", "Abcdefghijklmnopqrstuvwxyz")

MaVariable("abc", "=", "Abcdefghijklmnopqrstuvwxyz0123456789")
MaVariable("abcd", "=", "Abcdefghijklmnopqrstuvwxyz0123456789")
MaVariable("abcde", "=", "Abcdefghijklmnopqrstuvwxyz0123456789")

MaVariable("abc", "=", "2")
MaVariable("abc", "=", "Abcdefghijklmnopqrstuvwxyz")
MaVariable("abc", "=", "445")
MaVariable("abc", "=", "Abcdefghijklmnop")
MaVariable("abc", "=", "1500")
MaVariable("abc", "=", "Abcdefghijklmnopqrstuvwxyz0123456789")


ForEach GestionnaireDeVariable()
  ; j'extrait l'emplacement ou se situe la variable dans la mémoire (sont adresse mémoire)
  *EmplacementMemoire = Val(StringField(GestionnaireDeVariable(), 3, "»"))
  
  If *EmplacementMemoire <> 0
    Liste$ + "Liste = " + GestionnaireDeVariable() + Chr(13) + "Mémoire = Adresse: " + Str(*EmplacementMemoire) + ", Valeur: " + PeekS(*EmplacementMemoire, -1, #PB_Ascii) + Chr(13)
  Else
    Liste$ + GestionnaireDeVariable() + Chr(13)
  EndIf
  
Next GestionnaireDeVariable()

MessageRequester("Résulta", Liste$)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: La mémoire

Message par bombseb »

Salut,

Déja chez moi ca plante avec pb 4.6 beta 2
ensuite ca ressemble vachement à une usine à gaz non ?

si tu veux remplir une variable avec 10000 fois "Abcdefghijklmnopqrstuvwxyz", tu devrais regarder la commande FillMemory, je ne pense qu'on puisse faire plus rapide non ?
ou alors le faire carrément en asm
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: La mémoire

Message par dayvid »

Salut Bombseb !

Oui sa plante tu as raisons et je sais pas pourquoi, bref c'est pas du tous sa quoi :(

Oui tu as compris ce que je veut faire, je regarderais merci du tuyau pour le FillMemory :wink:
oui en faite je voudrait une fonction de même principe qu'une variable mais avec la mémoire car sa va bien plus vite
Malheureusement mais connaissance en cette matière débute juste donc déjà pour un début même qui marche pas, ce n’est pas trop mal je pense

Si quelqu’un veut bien m’aider ou ce qu’il veut pour arriver a un résulta satisfaisant
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Répondre