IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Tableau en paramètre d'une fonction d'une dll C++


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut Tableau en paramètre d'une fonction d'une dll C++
    Bonjour,

    J'aimerai utilisé sous delphi une dll écrite en c++.

    La première fonction ne m'a pas posé de problème car elle ne prennait aucun paramètre. La deuxième à de nombreux paramètres : une chaine de caractère que j'ai écrit en dur pour les tests, 1 float que j'ai remplacé par 1 single, et surtout, un tableau !

    En fait la fonction à un paramètre du type :
    J'ai donc tenté de passer en paramètre un tableau dont j'ai fixé la taille arbitrairement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonTableau : array[0..1000000] of MonType
    MonType est un record que j'ai déclaré car on m'a donné sa structure en C (1 single, et un tableau de 4 char).

    Vous vous en doutez, je plante à l'exécution...

    Je coince, et j'ai l'impression que ce tableau est le seul élément qui me gêne...

    Pour info, la dll est utiliser sans problème par un programme VB.

    Vous avez une idée ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    float et single, c'est 4 octets, c'est compatible, OK
    Ce n'est plutôt SAFEARRAY c'est une type particulier, il utilise la Mémoire COM pour s'allouer, il faut utiliser SafeArrayCreate sur un PVarArray\PSafeArray qui s'utilisent globament comme VarArrayCreate sur un Variants

    Attention, une variable locale est limitée, un si grand tableau peut poser des problèmes de taille de pile ! max 1Mo souvent par défaut !
    Utilise un Tableau dynamique et SetLength !
    D'ailleurs pourquoi allouer autant ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Bonjour,

    J'ai mis un peu de temps à répondre car je souhaitais d'abord me documenter. Et finalement je ne trouve pas de réponse à mes questions.

    Est ce normal qu'en C et en delphi il faille passer par cette structure complexe, alors qu'en VB il suffit de passer en paramètre un tableau d'élément dont je connais la structure ? Et surtout, comment c'est 2 façon d'appeller la fonction peuvent être compatible ? Entre le safearray et le tableau de record que j'ai tenté de créer via Delphi (copiant VB) il y a quand une sacré différence. Je suis un peu perdu là...

    Je vais réduire la taille du tableau, j'avais tenté 20000 et 1000000 car je ne savais pas combien d'élément la fonction allait me renvoyer. L'objectif est de récupérer les points d'un fichier dxf, et je ne connais pas le contenu du fichier de test que j'utilise

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par declencher Voir le message
    Bonjour,

    J'ai mis un peu de temps à répondre car je souhaitais d'abord me documenter. Et finalement je ne trouve pas de réponse à mes questions.

    Est ce normal qu'en C et en delphi il faille passer par cette structure complexe, alors qu'en VB il suffit de passer en paramètre un tableau d'élément dont je connais la structure ? Et surtout, comment c'est 2 façon d'appeller la fonction peuvent être compatible ? Entre le safearray et le tableau de record que j'ai tenté de créer via Delphi (copiant VB) il y a quand une sacré différence. Je suis un peu perdu là...

    Je vais réduire la taille du tableau, j'avais tenté 20000 et 1000000 car je ne savais pas combien d'élément la fonction allait me renvoyer. L'objectif est de récupérer les points d'un fichier dxf, et je ne connais pas le contenu du fichier de test que j'utilise
    il est douteux que la taille ne soit pas connue ou qu'il ne soit pas possible de la déterminer.

    ceci dit "**" dans la déclaration indique que c'est un pointeur sur un pointeur (@@ ou ^^ selon le cas sous Delphi).

    il est probable que sous Delphi cela donne un (var p:Pointer), c'est à dire que c'est C++ qui te retourne l'adresse d'un pointeur vers des données. Dans ton cas (var p:PSafeArray);.

    Note que C++ ne fait pas de distinction entre tableaux et pointeurs, un char[] et un char* c'est comme sous Delphi un PChar qui peut être utilisé comme un pointeur sur un char (p^) ou un pointeur sur un tableau de char (p[x]). Sauf qu'en C++ c'est vrai pour tous les types alors que sous Delphi ça ne l'est que pour le PChar.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Merci pour ce complément d'info.

    Seul la dll peut déterminer la taille du tableau qu'elle renvoie, car elle seule s'est lire ce format de fichier.

    Après quelques recherches, je commence à comprendre pourquoi sous VB c'est plus simple. Du coup je me concentre sur Delphi, mais je ne trouve que des exemples super complexe.

    Concernant ça j'en étais arrivé à la même conclusion. Il me reste à voir comment déclarer ma variable qui sera en fait un pointeur sur pointeur, et surtout comment exploiter ensuite les données qui auront été insérées par la fonction car je vais devoir mapper les données avec ma structure préalablement déclaré dans delphi...

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    ceci dit, tu ne nous donnes aucune info sur le contexte, ni le code VB qui est supposé fonctionner, alors nous ne pouvons faire que des suppositions.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Réponses: 2
    Dernier message: 24/08/2007, 01h54
  3. Réponses: 4
    Dernier message: 15/08/2007, 22h05
  4. Réponses: 3
    Dernier message: 16/01/2006, 16h02
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo