Probleme avec un dll et un tableau de double

Résolu
Signaler
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006
-
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006
-
Bonjour, je vais essayer d'etre claire.

J'ai un programme en VB6 (qui marche normalement) qui a un tableau de double :

"Dim picture_array(0 To 310, 0 To 400) As Double"

Mon tableau doit etre utilise par une Dll en C++ par une fonction

"extern "C" _declspec(dllexport) double** CALLBACK RAThresh (double **InImg, int x, int y){ ... }"

Je l'ai bien declarer dans mon programme VB

"Public Declare Function RAThresh Lib "RAThresh.dll" (ByRef Infile() As Double, ByVal x As Integer, ByVal y As Integer) As Double"

mais j'ai toujours un message d'erreur a l'execution

"Can't assign to array"

...

J'espere avoir ete asser clair ... merci par avance de toutes reponses.

12 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)



Private Sub Command1_Click()

Dim T1() As Double 'tableau destination

Dim T2() As Double 'tableau à passer

Dim pt As Long 'pointeur du tableau



ReDim T1(1, 1)

ReDim T2(1, 1)



' soit taille 2 * 2 * 8 32



T2(0, 0) = 10

T2(1, 0) = 20

T2(0, 1) = 30

T2(1, 1) = 40

pt = VarPtr(T2(0, 0))



CopyMemory ByVal VarPtr(T1(0, 0)), ByVal pt, 32



MsgBox T1(0, 0)

MsgBox T1(1, 0)

MsgBox T1(0, 1)

MsgBox T1(1, 1)



End Sub


Daniel
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
faut envoyer la première valeur du Tableau,

avec l'adresse de la première les autres valeurs sont faciles à trouver

pour les deux "**" je suis pas sur que ce soit ça.



ByRef Infile(1,1) As Double


Daniel
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

Merci Daniel,

je galere encore mais ton aide me sert.
toujours les meme probleme, le tableau une fois passe dans la dll se retrouve vide et je comprend pas pourquoi.

merci par avance.
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
en fait c'est l'adresse que tu reçois et non pas un double



int * InImg ou Long * InImg



et en VB6:



Public Declare Function RAThresh Lib "RAThresh.dll" (ByRef Infile As Long, ByVal x As Integer, ByVal y As Integer) As Double



Call RAThresh (Varptr(Infile(1,1)), x, y)



Daniel
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

ok, merci pour cette reponse, je la tente et te redonne des nouvelles !!!!!

merci encore et a bientot ....
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

Grace a ton Varptr, j'arrive bien a passe des tableau .. a une dimention de ceux que je veux comme type (merci car avant je ne savait meme pas) mais pour les 2 domentions (double **), je galere toujours.
je m'explique :
quand je passe un tableau en 2 dim, je peux en cpp recuperer la premiere valeur car en parametre de la fonction cpp je declare '*' donc acces avec Infile[0] mais quand je veux d'autre valeur (ex : Infile[0][1], ...) impossible , le conpilateur me precise que j'ai qu'un pointeur 1D!!!! et si je passe '**', le compilateur accepte de generer ma dll mais quand je l'execute avec VB, gros message mechant de Windows qui me dit que je tape dans la memoire ou j'ai pas a mettre mes pieds !!!!

help me more please .... et merci pour tes precedentes reponses qui m'ont permi d'avancer !!!!!
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
tu dois faire des calculs de pointeurs:



ReDim table(1 To 3, 1 To 5) As Double



MsgBox VarPtr(table(1, 1)) ' p + 0

MsgBox VarPtr(table(2, 1)) ' p + 8

MsgBox VarPtr(table(3, 1)) ' p + 16



MsgBox VarPtr(table(1, 2)) ' p + 24

MsgBox VarPtr(table(2, 2)) ' p + 32

MsgBox VarPtr(table(3, 2)) ' p + 40



MsgBox VarPtr(table(1, 3)) ' p + 48

MsgBox VarPtr(table(2, 3)) ' p + 56

MsgBox VarPtr(table(3, 3)) ' p + 64



' pour Table (i,j) --> pointeur = p + (j-1) * 8 * 3 + (i-1) * 8


Daniel
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

j'ai trouve (et enfin reussi) a passer mes tableau 2D de double de mon interface VB6 a ma DLL C++.

On passe le pointeur en "Long" (dans le declaration VB de la fonction DLL) et apres c du C++ normal :

*tableau; // pour la valeur
tableau++; // pour l'incrementation

en fesant gaffe de pas depasse les bords !!!! (mais c pas trop dur si on passe la taille en parametre ("Long" aussi meme si une fois en C++, on les traite en "Int") )

Bon, maintenant, je vais essayer de faire la meme chose a l'envers en passant par le "return" de la fonction C++ pour mon avoir mon nouveau tableau modifie ... si cela interesse quelqu'un une fois que j'aurai trouve je pourai toujours lui filler la source ...
mais la il me faut encore un peu de temps :)

Merci Gobillot pour ton aide qui m'a pernis d'avance...

et surement a bientot vu mes objectifs ....
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

Bon, bin, javais dit dans mon precedent post que j'essaye maintenant d'utiliser le return de ma fonction C++, bin, je bloque depuis qq heures maintenant...

En fait je retourne bien un pointeur (je compare le "numero" en VB et en C++, c bien le meme), mais une fois que j'ai se chiffre, comment dire que c le debut d'un tableau (case [0,0]) de mon programme VB6... Je sais meme pas si c'est realisable...

si qqun a une piste, merci d'avance.
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

Je te remerci car ton indication est exactement ce que je souhaite, le hic, il vient de moi, je sais pas utiliser CopyMemory.
J'ai toujour le message : Sub or Function not Defined.

Je te remerci encore si tu peut m'aider car cela me sortirait d'une grosse pannade.
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
ou est-ce que t'as mis la déclaration ?

faut la mettre juste au début de la Forme, derrière Option Explicit

ou alors dans un module en Public





Option Explicit



'les constantes

'les types

'les dim



Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
(pDst As Any, pSrc As Any, ByVal ByteLen As Long)


'les Sub

'les Fonctions


Daniel
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

C bon, la fonction CopyMemory marche et fait ce que je veux ... de nouveau petits problemes arrivent mais cela viens plus de mes algos qu'autre chose je pense. Je te remerci encore pour toutes tes aides.