Probleme avec un dll et un tableau de double [Résolu]

les french texans 21 Messages postés mardi 14 juin 2005Date d'inscription 23 octobre 2006 Dernière intervention - 11 juil. 2005 à 02:07 - Dernière réponse : les french texans 21 Messages postés mardi 14 juin 2005Date d'inscription 23 octobre 2006 Dernière intervention
- 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.
Afficher la suite 

12 réponses

Meilleure réponse
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 14 juil. 2005 à 22:54
3
Merci
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

Merci Gobillot 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 11 juil. 2005 à 10:44
0
Merci
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
les french texans 21 Messages postés mardi 14 juin 2005Date d'inscription 23 octobre 2006 Dernière intervention - 12 juil. 2005 à 00:02
0
Merci
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.
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 12 juil. 2005 à 00:38
0
Merci
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
les french texans 21 Messages postés mardi 14 juin 2005Date d'inscription 23 octobre 2006 Dernière intervention - 12 juil. 2005 à 00:44
0
Merci
ok, merci pour cette reponse, je la tente et te redonne des nouvelles !!!!!

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.