Page 1 sur 3
Dll et tableaux
Publié : lun. 31/janv./2005 10:38
par lionel_om
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.
@ ++
Publié : lun. 31/janv./2005 12:10
par hardy
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.
Publié : lun. 31/janv./2005 12:27
par nico
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)
Intéressant mais comment tu identifies le type?
Publié : lun. 31/janv./2005 16:50
par lionel_om
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.
Publié : lun. 31/janv./2005 17:24
par Oliv
Pour passer un tableau à Procedure, il faut lmui envoyer l'adresse mémoire:
Code : Tout sélectionner
Procedure Test(*Pointeur.l)
Enprocedure
Dim Tableau(5,9)
Test(@Tableau)
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
Publié : lun. 31/janv./2005 17:32
par nico
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.
Publié : lun. 31/janv./2005 19:46
par filperj
Pour les équivalences:
Code : Tout sélectionner
.b = signed char
.w = signed short
.l = signed long
.f = float
autant que je me souvienne

Publié : lun. 31/janv./2005 20:50
par Le Soldat Inconnu
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)
Publié : mar. 01/févr./2005 10:16
par lionel_om
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 ???
Publié : mar. 01/févr./2005 11:16
par Le Soldat Inconnu
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
Publié : mar. 01/févr./2005 11:49
par Torp
Une liste chainé, pour chaque element, on a ça en gros :
ça se comporte comme uns structure avec 3 élément qui contient :
- Adresse de l'élément précédent
- Adresse de l'élément suivant
- Valeur de l'élément
Les choses s'éclaircissent peu à peu...
Publié : mar. 01/févr./2005 17:41
par nico
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
Publié : mar. 01/févr./2005 17:42
par lionel_om
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 :
Publié : mer. 02/févr./2005 10:46
par Torp
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
Sais pas si c'est la solution attendu...

? Mais avec ca :
Debug PeekL(PeekL(PeekL(*pointeur1)))
ca marche...
Publié : mer. 02/févr./2005 12:11
par nico
Excellent,
Maintenant, tu dois refaire la même chose mais sans utiliser l'instruction Peek!