Dll et tableaux
-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
Dll et tableaux
Bonjour à tous.
(Je viens de poser la mm question sur le forum de DB)
Est-ce possible (je pense ke oui, mais je ne sait pas comment) de passer un tableau (1 ou 2 Dimensions) en paramètre à un appèle de fonction/Dll.
Car vu que les tableaux en Basic sont globaux, je ne sais pas trop comment faire...
De plus, si je créé ma Dll en C++, quel est le type associé à Byte, Word ??? short int ???
Merci d'avance pour vos réponse.
@ ++
(Je viens de poser la mm question sur le forum de DB)
Est-ce possible (je pense ke oui, mais je ne sait pas comment) de passer un tableau (1 ou 2 Dimensions) en paramètre à un appèle de fonction/Dll.
Car vu que les tableaux en Basic sont globaux, je ne sais pas trop comment faire...
De plus, si je créé ma Dll en C++, quel est le type associé à Byte, Word ??? short int ???
Merci d'avance pour vos réponse.
@ ++
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
Comme toujours, pour passer un objet complexe à une procédure, on lui passe l'adresse @tab() du tableau.
Il est simple de récupérer les éléments du tableau : à l'adresse @tab()-4, t'as le type d'éléments du tableau, à l'adresse @tab()-8, le nombre d'éléments (pour un tableau à une dimension),...
à l'adresse @tab(), tu as le premier élément du tableau (ou l'adresse de la chaîne/structure, si c'est une chaîne/structure, etc...), à l'adresse @tab()+4 le suivant (@tab()+1 si bytes, @tab()+2 si words)...
Une procédure ne reçoit que des adresses pour ce qui n'est pas byte ou word ou long, ou double.
Il est simple de récupérer les éléments du tableau : à l'adresse @tab()-4, t'as le type d'éléments du tableau, à l'adresse @tab()-8, le nombre d'éléments (pour un tableau à une dimension),...
à l'adresse @tab(), tu as le premier élément du tableau (ou l'adresse de la chaîne/structure, si c'est une chaîne/structure, etc...), à l'adresse @tab()+4 le suivant (@tab()+1 si bytes, @tab()+2 si words)...
Une procédure ne reçoit que des adresses pour ce qui n'est pas byte ou word ou long, ou double.
Intéressant mais comment tu identifies le type?hardy a écrit :Il est simple de récupérer les éléments du tableau : à l'adresse @tab()-4, t'as le type d'éléments du tableau, à l'adresse @tab()-8, le nombre d'éléments (pour un tableau à une dimension)
Dernière modification par nico le lun. 31/janv./2005 17:21, modifié 1 fois.
-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
Merci pr cette réponse. Je savais pour l'adresse, mais pas que le type et (encore moins) le nombre d'élément été dans des adresses mémoire antérieures.
Je vais m'amuser à faire quelques petits test.
Et pour les équivalents en C++, vous savez ce que ca donne un Byte ou un Word ??? Je crois k'il y a déja un Float et un Long en C.
Merci bien pr c qq réponses.
Je vais m'amuser à faire quelques petits test.
Et pour les équivalents en C++, vous savez ce que ca donne un Byte ou un Word ??? Je crois k'il y a déja un Float et un Long en C.

Merci bien pr c qq réponses.
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
Pour passer un tableau à Procedure, il faut lmui envoyer l'adresse mémoire:
Après c'est moins agréable que de travailler sur Tableau(x,y) car il faut travailler directement sur l'adresse mémoire, mais je pense que ça passe aussi pour les DLL
Code : Tout sélectionner
Procedure Test(*Pointeur.l)
Enprocedure
Dim Tableau(5,9)
Test(@Tableau)
Il y a une autre façon de faire si les tableaux ne sont pas énorme, ce serait de travailler en parallèle sur deux tableaux. A chaque modification dans la DLL ou dans le prog, l'un et l'autre fait une copie des données sur l'autre tableaux. Bon bien sûr il faut une petite gestion mais ça permet de travailller dans le tableau normalement.
Pour les équivalences:
autant que je me souvienne 
Code : Tout sélectionner
.b = signed char
.w = signed short
.l = signed long
.f = float

Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
oui, je fais comme dis nico quand il n'y a pas besoin de rapidité (même si c'est quand même déjà bien rapide)
Code : Tout sélectionner
Procedure Test(TableauX, TableauY, TableauAdresse.l)
Dim Tableau_Temp(TableauX, TableauY)
CopyMemory(TableauAdresse, @Tableau_Temp(), 4 * TableauX * TableauY) ; on copie le tableau dans le tableau temporaire
Tableau_Temp(0, 0) = 124
CopyMemory(@Tableau_Temp(), TableauAdresse, 4 * TableauX * TableauY) ; on copie le tableau temporaire dans le tableau
EndProcedure
Dim Tableau(5,9)
Test(5, 9, @Tableau())
Debug Tableau(0,0)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
OKi daccord, je vais essayé des trucs du genre.
Par contre le '@Tab - 4' marche aussi pour les tableaux 2D
même si ce n'est que peu utile
Bon je Vais essayé tout cela
Ca marche aussi pr les Listes Chainées de PB ???
Par contre le '@Tab - 4' marche aussi pour les tableaux 2D

Bon je Vais essayé tout cela
Ca marche aussi pr les Listes Chainées de PB ???
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
non, les listes chainées, c'est différent, on ne peut pas les copier avec un CopyDirectory
Une liste chainé, pour chaque element, on a ça en gros :
ça se comporte comme uns structure avec 3 valeurs qui contiennent :
- Adresse de l'élément précédent
- Adresse de l'élément suivant
- Valeur de l'élément
donc quand on ajoute un nouvel élément, il n'est pas forcément à la suite du précédent dans la mémoire. Il sont relier par le biais d'adresse mémoire qui pointe vers les éléement suivants ou précédent.
Je pense que Nico t'en dira plus que moi
Une liste chainé, pour chaque element, on a ça en gros :
ça se comporte comme uns structure avec 3 valeurs qui contiennent :
- Adresse de l'élément précédent
- Adresse de l'élément suivant
- Valeur de l'élément
donc quand on ajoute un nouvel élément, il n'est pas forcément à la suite du précédent dans la mémoire. Il sont relier par le biais d'adresse mémoire qui pointe vers les éléement suivants ou précédent.
Je pense que Nico t'en dira plus que moi
Dernière modification par Le Soldat Inconnu le mar. 01/févr./2005 12:05, modifié 1 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Pour Torp:
Code : Tout sélectionner
; Un petit test pour se mettre en bouche
; Nous avons 3 pointeurs et une variable
; chaque pointeur contient l'adresse du pointeur suivant
; et le dernier pointeur contient l'adresse de la variable
; Comment faire pour lire la valeur de la variable
; à partir du premier pointeur, c'est à dire *pointeur1 ?
Ma_variable=123
*pointeur1:*pointeur2:*pointeur3
*pointeur1=@*pointeur2
*pointeur2=@*pointeur3
*pointeur3=@Ma_variable
-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
ouic'est vrai, mais on doit pouvoir récupérer l'adresse mémoire de la liste, donc peut-être des éléments importants.
Mais bon ça ne m'intéresse pas pour l'instant.
Mais c'est vrai que c'est bien relou d'avoir les tableaux et listes toujours en global et de ne pas pouvoir faire des choses du genre :
Mais bon ça ne m'intéresse pas pour l'instant.
Mais c'est vrai que c'est bien relou d'avoir les tableaux et listes toujours en global et de ne pas pouvoir faire des choses du genre :
Code : Tout sélectionner
Procedure Bidule(l.LinkedList() )
...
EndProcedure
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
Sais pas si c'est la solution attendu...nico a écrit :Pour Torp:
Code : Tout sélectionner
; Un petit test pour se mettre en bouche ; Nous avons 3 pointeurs et une variable ; chaque pointeur contient l'adresse du pointeur suivant ; et le dernier pointeur contient l'adresse de la variable ; Comment faire pour lire la valeur de la variable ; à partir du premier pointeur, c'est à dire *pointeur1 ? Ma_variable=123 *pointeur1:*pointeur2:*pointeur3 *pointeur1=@*pointeur2 *pointeur2=@*pointeur3 *pointeur3=@Ma_variable

Debug PeekL(PeekL(PeekL(*pointeur1)))
ca marche...