PureBasic

Forums PureBasic
Nous sommes le Sam 24/Aoû/2019 10:54

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 16 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
 Sujet du message: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Sam 03/Oct/2009 8:09 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6644
Localisation: Isere
Bonjour les ASMEURS

Je suis désolé de vous déranger, mais c'est pour KCC un besoin vital, enfin presque car KCC il mange toujours rassurez vous :oops:

Voila, je ne sais pas si vous l'avez lu, mais je cherche depuis plus d'un mois une methode pour passer des tabeaux de strings entre VB/PB et une DLL
Apres des dizaines de posts, de nombreuses aides que je remercie encore 8)
J'ai pu arriver a une solution qui apparement marche. :D
Mais elle est tres lourde :(

Donc, comme cette fonction va etre a la base de dizaine de mes programmes, je voudrais etre sur de choisir la bonne, et si il n'y a pas beaucoup plus simple.

Alors voila, au milieu des aides, j'ai demandé si l'ASM ne pouvait pas faire quelque chose pour moi a FRED, sur la gestion des tableaux
Et XOMBIE m'a gentillement fait ce code

Il est beau, court comme tous les codes ASM, et puissant
XOMBIE a pourtant tenté de me l'expliquer, mais j'ai pas tout compris.
Il a pourtant pris la peine de commenter chaque ligne ou presque, mais parler de pile a KCC, ça lui parle autant , que si on lui donne un cours sur le langeage des bébés :oops:
Et en plus, il faut dire aussi que l'ASM est bien assez compliqué comme ça pour ne pas y rajouter l'anglais :roll:

Donc, si un de vous pourrait, avoir la gentillesse de m'expliquer "simplement" si c'est possible, ce que fait ce code.
Surtout dans un premier temps la demarche, en une phrase, pour voir si il serait exploitable dans ce que je cherche a faire...
Car ce n'est pas la peine d'entrer dans les details et vous faire perdre votre precieux temps, si il ne m'est pas utile :oops:

Code:
; http://www.purebasic.fr/english/viewtopic.php?p=294524#p294524

! extrn _SYS_ReAllocateArray@8
; PB calls this to REDIM an array.
ProcedureDLL.l CreateArray(Array a.s(1), Lettre$)
   ; Pass the array as the first parameter - the array must have been declared before calling this procedure.
   Define.l xx
   ;
   ! PUSH dword [p.a_a]
   ; Put the address of the array on the stack.  Use p.a_ for arrays, p.v_ for variables and p.l_ for linked lists.
   ! MOV Eax, 5
   ;  Put the number of items you want to REDIM the array to.  This would be 5 items, 0 to 4.
   ! PUSH Eax
   ; Push the value of Eax onto the stack.
   ! CALL _SYS_ReAllocateArray@8
   ; Call the ReAllocateArray function with the value of Eax (5) and the address of the array as parameters.  Note the @8 as the two parameters are both long values.  It's like calling ReAllocateArray(ArrayA(), 5) only in ASM.
   ;
   For x = 1 To 5
      a(x - 1) = RSet("", x, Lettre$)
   Next
   ;
EndProcedure

Dim ArrayA.s(10)
Debug ArraySize(ArrayA())
CreateArray(ArrayA(), "a")
Debug ArraySize(ArrayA())

Dim ArrayB.s(0) 
CreateArray(ArrayB(), "b")

For i = 0 To ArraySize(ArrayA())
Debug "Premier essai = " + ArrayA(i)
Next
 
For i = 0 To ArraySize(ArrayB())
Debug "Second essai = " + ArrayB(i)
Next i



Merci de votre aide et comprehension

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Sam 03/Oct/2009 9:02 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 07/Avr/2005 1:06
Messages: 1489
Localisation: Rennes
Pour commencer sur les piles, et pour faire simple, la pile c'est donc de l'empilement.
prenons des assiettes par exemple :
Tu prend une assiette ou est inscrit un chiffre, puis tu prend une autre assiette que tu empile ("push") sur la précédente, etc....
tu as donc une "pile" d'assiette, pour connaitre les chiffres marqués dessus, simple il faut enlever chaque assiette donc on dépile (commende "pop" en assembleur)
On parle de méthode LIFO (Last In First Out : dernier entrée, premier sorti)
La c'est la première démarche ... si cela t'a aider, tant mieux :wink:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Sam 03/Oct/2009 9:34 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6644
Localisation: Isere
Merci beaucoup FLAITH de prendre de ton temps pour elever un petit peu mon niveau. 8)

Tu devais t'en douter...si tu repond a KCC c'est un peu comme marcher dedans...., tu te le traine un petit moment, car il a toujours quelque chose à dire, et encore pire toujours une question qui en appelle une autre :?

1/ Quelqu'un m'avais déjà parlé un tout petit peu de FIFO et LIFO
Ces methodes comme tu dis, on peut les utiliser "a ma guise" comme dirait jean rochefort
Ou bien elle sont fixées par le type de processeur, le type d'ASM.
Ce que je veux dire c'est peut on utiliser la methode FIFO, puis juste apres la LIFO dans le meme code ???? :roll:

2/ Est ce que ce qu'a fait ZOMBIE te cause ???
En quelques mots, qu'est ce qu'il demande de faire au processeur ???
Sans rentrer dans les termes techniques...

Pour obtenir ce code qu'il a fait pour moi, je demandais de pouvoir utiliser plusieurs fois le meme tableau.
Donc je suppose qu'il a trifouillé dans les tables d'allocations ???
Est ce bien ça ???? Est ce fiable ????
Que fait ce code en fait ????

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Sam 03/Oct/2009 12:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 22/Jan/2004 14:31
Messages: 3518
Localisation: Sourans
KCC, regardes simplement les 4 lignes de codes après le endprocedure, et regardes les valeurs des debug, tu verras que la taille du tableau ArrayA() a changé (ArraySize renvoie la taille du tableau), c'est ce que fait la partie asm du code en donnant la taille ArraySize() à 4 soit 5 éléments, de 0 à 4.

Code:
Dim ArrayA.s(10) 
Debug ArraySize(ArrayA()) 
CreateArray(ArrayA(), "a") 
Debug ArraySize(ArrayA()) 


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Sam 03/Oct/2009 13:01 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 07/Avr/2005 1:06
Messages: 1489
Localisation: Rennes
ce code se comporte comme un redim mais "forcé" à 5 valeurs :wink:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Sam 03/Oct/2009 17:39 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6644
Localisation: Isere
Merci mes amis, je vais essayer de comprendre 8)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Sam 03/Oct/2009 18:25 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 07/Avr/2005 1:06
Messages: 1489
Localisation: Rennes
Le code de xombie avec explication en français :
Code:
; http://www.purebasic.fr/english/viewtopic.php?p=294524#p294524

; Appel à la procédure de redimensionnement d'un tableau.
! extrn _SYS_ReAllocateArray@8

ProcedureDLL.l CreateArray(Array a.s(1), Lettre$)
  ; Le tableau est placé en 1er paramètre
  ; Bien entendu le tableau a déjà été déclaré avant d'appeler cette procedure.
  Define.l x

  ; on empile l'adresse du tableau : l'assiette contient un chiffre indiquant l'adresse mémoire du tableau ;)
  ; p.a_     : indique que c'est un tableau
  ; p.v_     : c'est une variable
  ; p.l_     : une liste chainée
  ! PUSH dword [p.a_a]

  ; On veut redimensionner la taille à 5
  ; EAX (Accumulateur : registre assembleur 32bits
  ; EAX = 5
  ! MOV Eax, 5

  ; On rajoute une assiette sur la pile contenant le chiffre 5
  ! PUSH Eax

  ; on appelle la procédure qui va redimensionner le tableau
  ; le @8 dans la procédure indique qu'il a besoin de 2 paramètres (ici 2 variables de type long (32bits) : l'adresse du tableau "a" et le chiffre "5")
  ; C'est cette procédure qui va "dépiler/récupérer" les 2 valeurs envoyées
  ! CALL _SYS_ReAllocateArray@8

  ; on affecte la valeur 'Lettre$' a chaque élément du tableau
  For x = 0 To 4                  ; donc 5 elements
    a(x) = RSet("", x, Lettre$)   ; pas la peine d'expliquer ce que fait Rset
  Next

EndProcedure

; on déclare le tableau
Dim ArrayA.s(10)
; affiche sa taille
Debug ArraySize(ArrayA())         ;ici il affiche 10 (soit 11 valeurs en tout : 0 à 10)

; on redimensionne le tableau avec comme valeur "a"
CreateArray(ArrayA(), "a")
; affiche sa taille
Debug ArraySize(ArrayA())         ;il affiche maintenant 4 (5 valeurs car 0 à 4)

; on déclare un autre tableau
Dim ArrayB.s(0)                   ; 1 valeur
CreateArray(ArrayB(), "b")        ; passe à 5

For i = 0 To ArraySize(ArrayA())
Debug "Premier essai = " + ArrayA(i)
Next
   
For i = 0 To ArraySize(ArrayB())
Debug "Second essai = " + ArrayB(i)
Next i


:mrgreen:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Lun 05/Oct/2009 13:02 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6644
Localisation: Isere
Merci beaucoup FLAITH de t'etre donné la peine de me traduire ce code 8)
Quand c'est en français, c'est comme a la maison, ça parle que de chose qu'on a dans nos placards.
Les piles, les assiettes :D

Toutes plaisanteries mise a part, c'est sur que expliqué comme ça, ce language "doberman" dont seul les initiés arrivent a dompter, et que tous programmeur redoute, parait un petit plus "yorshire" quand on le lis. :wink:

C'est tellement beau de pouvoir parler au proce sans passer par un interprete 8)

L'utilité que j'en avais etait de pouvoir modifier la taille d'un tableau se trouvant dans une DLL
Mais maintenant à la lumiere de vos explications et des essais que j'ai fait, je pense que ASM ou non, chaque processus a sa propre table d'allocation, et il est tres difficile, dangereux, voir impossible de par exemple, tenter de modifier le dimensionnage d'un tableau provenant d'un EXE, dans une DLL :roll:

D'ailleur j'ai essayé de séparer les deux parties et ça ne marche pas.
Maintenant je sais pourquoi....chacun chez soi et les bits seront bien gardés :?

Code de l'exe
Code:
If OpenLibrary(0, "PureBasic.dll")

Retour = CallFunction(0, "MaFonction", Parametre1, Parametre2)


; on déclare le tableau
Dim ArrayA.s(10)
; affiche sa taille
Debug ArraySize(ArrayA())         ;ici il affiche 10 (soit 11 valeurs en tout : 0 à 10)

; on redimensionne le tableau avec comme valeur "a"
CallFunction(0, "CreateArray" ,ArrayA(), "a")
; affiche sa taille
Debug ArraySize(ArrayA())         ;il affiche maintenant 4 (5 valeurs car 0 à 4)

; on déclare un autre tableau
Dim ArrayB.s(0)                   ; 1 valeur
CallFunction(0, "CreateArray" ,ArrayB(), "b") ; passe à 5

For i = 0 To ArraySize(ArrayA())
Debug "Premier essai = " + ArrayA(i)
Next

CloseLibrary(0)

EndIf


Code de la DLL
Code:
; http://www.purebasic.fr/english/viewtopic.php?p=294524#p294524

; Appel à la procédure de redimensionnement d'un tableau.
! extrn _SYS_ReAllocateArray@8

ProcedureDLL.l CreateArray(Array a.s(1), Lettre$)
  ; Le tableau est placé en 1er paramètre
  ; Bien entendu le tableau a déjà été déclaré avant d'appeler cette procedure.
  Define.l x

  ; on empile l'adresse du tableau : l'assiette contient un chiffre indiquant l'adresse mémoire du tableau ;)
  ; p.a_     : indique que c'est un tableau
  ; p.v_     : c'est une variable
  ; p.l_     : une liste chainée
  ! PUSH dword [p.a_a]

  ; On veut redimensionner la taille à 5
  ; EAX (Accumulateur : registre assembleur 32bits
  ; EAX = 5
  ! MOV Eax, 5

  ; On rajoute une assiette sur la pile contenant le chiffre 5
  ! PUSH Eax

  ; on appelle la procédure qui va redimensionner le tableau
  ; le @8 dans la procédure indique qu'il a besoin de 2 paramètres (ici 2 variables de type long (32bits) : l'adresse du tableau "a" et le chiffre "5")
  ; C'est cette procédure qui va "dépiler/récupérer" les 2 valeurs envoyées
  ! CALL _SYS_ReAllocateArray@8

  ; on affecte la valeur 'Lettre$' a chaque élément du tableau
  For x = 0 To 4                  ; donc 5 elements
    a(x) = RSet("", x, Lettre$)   ; pas la peine d'expliquer ce que fait Rset
  Next

EndProcedure


Encore merci de ce petit voyage dans le monde du language que j'admire le plus 8)
C'est quand meme une super idée de FRED d'avoir donné cette possibilité.

Sauf peut etre pour vous....car y'a toujours un KCC pour troubler votre quietude :oops:
On peut meme pas etre tranquille dans cette rubrique :? :lol:

Encore merci de votre gentillesse 8)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Lun 05/Oct/2009 13:55 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4222
Localisation: Arras, France
Tu avais cherché du côté des FileMapping? En cherchant un peu (recherche sur le mot CreateFileMapping dans les forums et sur google), j'ai trouvé ça pour VB :
http://www.simpits.org/programming/data ... aring.html
et les docs officielles http://msdn.microsoft.com/en-us/library ... 85%29.aspx (pour les dll), et http://msdn.microsoft.com/en-us/library ... 85%29.aspx


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Lun 05/Oct/2009 14:45 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6644
Localisation: Isere
Merci beaucoup DJES

J'avais un peu regardé aussi de ce coté, mais par contre je n'avais pas trouvé ce lien.
Puis SROD m'a dit que c'etait pas la peine de ressencer toutes les methodes possibles, il fallait que je m'en tienne a une et essayer de la finir.
J'ai donc arretter de chercher d'autres methodes.

J'ai fini a force d'en baver a faire marcher mon passage de tableau, mais comme tu l'as vue...enfin je sais pas...c'est un peu l'usine a gaz :oops:

J'essaye de voir un dernier coup si je peux pas trouver un peu plus simple.
Peut etre suis-je passé a coté de quelque chose ????

Si je trouve pas mieux...je garderais mon usine :D

Merci pour les liens je vais regarder

Pendant que "je te tiens" ....a ton avis l'API Copymemory...elle deplace les pointeurs ou bien elle fait une copie ???

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Lun 05/Oct/2009 15:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 07/Avr/2005 1:06
Messages: 1489
Localisation: Rennes
Kwai chang caine a écrit:
....a ton avis l'API Copymemory...elle deplace les pointeurs ou bien elle fait une copie ???

C'est une question rhétorique ? :mrgreen:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Lun 05/Oct/2009 15:09 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4222
Localisation: Arras, France
De quoi il parle? :lol:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Lun 05/Oct/2009 15:09 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6644
Localisation: Isere
Attend FLAITH t'utilise des mots que je comprend pas le titre
J'ai demandé a mon pote WIKI

Citation:
Une question rhétorique (ou question oratoire) est une figure de style qui consiste à poser une question n'attendant pas de réponse


Bah non, KCC il attend une reponse :D
J'avais cru comprendre que la fonction native de PB "CopyMemory" elle deplacait les pointeurs :roll:

Car dans l'aide PB
Citation:
Contrairement à CopyMemory(), les zones mémoires source et destination peuvent se chevaucher. Néanmoins, MoveMemory() est plus lent que CopyMemory(), donc il est préférable de l'utiliser que si c'est justifié.

FRED dit que c'est les memes fonctions, mais en plus lent
Hors ce qui se deplace, n'est pas ce qui se copie ....enfin pour moi...je connais pas rhetorique ..mais deplacer et copier...je connais la difference :mrgreen:

Car j'essaye de lire dans VB la memoire que PB il a ecris dedans :roll:

Y'a l'API CopyMemory mais je voulais etre sur de ne pas toucher aux pointeurs qui sont en place, car c'est ceux de mon tableau de DLL, et ça KCC il a apris par SROD que c'est pas bien de les toucher.
Alors il les touche plus...promis :oops:

Mais il voudrait juste les toucher avec les yeux....donc il essaye cette API parce VB, n'est pas trop un caid des PEEK :?
Et dans les forums VB y'en a un qu'a créé une pseudo PEEK comme ça....et je voulais etre sur que je ne fais que lire et non deplacer quoi qu ce soit :D
Code:
Public Function Peek(Address As Long) As Long
Call CopyMemory(Peek, ByVal Address, Len(Address))
End Function

Public Function PeekByte(Address As Long) As Byte
Call CopyMemoryByte(PeekByte, ByVal Address, Len(PeekByte))
End Function


djes a écrit:
De quoi il parle? :lol:

A force de lire des peeks, des pokes.....ça commence a me rendre triste comme un jour de pluie :(

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Lun 05/Oct/2009 16:05 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4222
Localisation: Arras, France
Et si tu faisais l'essai?
Code:
src.s = "Hello"
dst.s = "Boy"

calldebugger ;là tu pourrais regarder le contenu mémoire avec "voir les zones mémoire", en mettant @dst, et @dst+10 dans Étendue

RtlMoveMemory_(@dst, @src, 2)

Debug src
Debug dst

Ah au fait, j'ai trouvé ça aussi pour toi : http://www.xtremevbtalk.com/showthread.php?t=248698


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Si "quinquin" pouvait expliquer a KCC un code ...
MessagePosté: Lun 05/Oct/2009 16:39 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6644
Localisation: Isere
Ouaaaooouuhhh !!! mais c'est drolement cool ton lecteur de mémoire 8O
KCC y savait pas que ça existe :oops:

Dans un de mes post, j'ai meme mis c'est dommage que il existe pas un progarmme pour lire la memoire.
Mais DIEU m'avais deja entendu, dans sa grande PBricorde 8)

J'avais vu DOBRO utiliser CallDebugger
J'avais vu que ça s'arrettais dessus.
Alors KCC y s'en servait comme un STOP...et "pis c tout" :D
Comment passer a la 4.40...KCC il en est encore a la 3.94 :(

Oulala !! va me valoir un moment avant de comprendre comment ça marche, mais milles merci DJES de m'avoir montré la voix 8)
KCC il est content...il apprend le debut à la fin...4 ans qui savait pas :oops:

J'ai compris ça existe pas les copy de memoire, ça deplace les pointeurs :cry:
Faut que je trouve quelque chose qui lise en VB, mais pas qui touche....comme des fois pour ma femme .....regarder, mais pas toucher :roll:

Pour le code VB, apparement c'est pour trouver un process par raport au nom d'une fenetre.
Y'a encore quelque chose qu'a du m'echapper, parce que je vois pas trop le raport entre la lecture des process et celle de la memoire :(
Le boulet ...... :oops:

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 16 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye