Dll et tableaux

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Dll et tableaux

Message 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.
@ ++
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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?
Dernière modification par nico le lun. 31/janv./2005 17:21, modifié 1 fois.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

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


Merci bien pr c qq réponses.
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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 :roll:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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) 
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)]
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

OKi daccord, je vais essayé des trucs du genre.

Par contre le '@Tab - 4' marche aussi pour les tableaux 2D :lol: 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 ???
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
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)]
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Message 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...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

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

Code : Tout sélectionner

Procedure Bidule(l.LinkedList() )
   ...
EndProcedure
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Message 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... :oops: ? Mais avec ca :

Debug PeekL(PeekL(PeekL(*pointeur1)))

ca marche...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Excellent, :10:

Maintenant, tu dois refaire la même chose mais sans utiliser l'instruction Peek!
Répondre