Probleme avec un dll et un tableau de double

Résolu
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006 - 11 juil. 2005 à 02:07
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006 - 18 juil. 2005 à 00:21
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

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
14 juil. 2005 à 22:54
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
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
11 juil. 2005 à 10:44
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
0
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
12 juil. 2005 à 00:02
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.
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
12 juil. 2005 à 00:38
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
12 juil. 2005 à 00:44
ok, merci pour cette reponse, je la tente et te redonne des nouvelles !!!!!

merci encore et a bientot ....
0
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
13 juil. 2005 à 18:28
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 !!!!!
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
13 juil. 2005 à 18:44
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
0
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
14 juil. 2005 à 17:43
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 ....
0
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
14 juil. 2005 à 22:29
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.
0
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
14 juil. 2005 à 23:15
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.
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
14 juil. 2005 à 23:22
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
0
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
18 juil. 2005 à 00:21
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.
0