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

MFC Discussion :

dll contenant plusieurs fonctions


Sujet :

MFC

Vue hybride

marie6631 dll contenant plusieurs... 12/03/2009, 10h55
ram-0000 Dans ta déclaration, la... 12/03/2009, 11h17
marie6631 pardon je me suis trompée en... 12/03/2009, 11h47
Médinoc Attention, je te déconseille... 12/03/2009, 12h04
marie6631 merci mais ca ne fonctionne... 12/03/2009, 13h25
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut dll contenant plusieurs fonctions
    bonjour

    je travail sur un programme sous vc++ 6. j'ai créé une dll afin d'éffectuer des calculs sur les valeurs d'un pointeurs stockant les niveaux de gris d'une image.

    la première fonction est une moyenne glissante. elle fonctionne très bien dans mon programme client.
    la deuxième fonction est une fonction de normalisation par rapport à la moyenne des valeurs des niveaux de gris. et là ça bloque. je redéfinis un pointeur vers la fonction Norme de ma dll dans mon programme client. mais ensuite mon programme ne veut pas faire la norme des valeurs. j'ai une erreur à l'execution du programme client. si j'execute en faisant d'abord la normalisation, j'ai une normalisation abérrante et un problème sur le filtre. je ne peux pas faire les options en meme temps (filtre + norme).

    S'agit il d'un problème de pointeur ou de fonctions dans la dll ?

    voici le code:
    programme client (dialog based)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    ...
    HMODULE HDll=LoadLibrary("TraitProfil.dll");
    typedef double* Filtrage_func(double*,int);
    Filtrage_func *pFiltrage=(Filtrage_func*)GetProcAddress(hDll,"Filtrage");
    typedef double* Norme_func(double*);
    Norme_func *pNorme=(Norme_func*)GetProcAddress(hDll,"Norme");
     
    ///plus loin dans le code, une combo box appelle ces fonctions
    double *moy;
    moy = new double[1000];
    if (stFiltre=="2")
    {
    moy=pFiltrage(m_pdData);
    m_cvDraw.AddDataBuffer(xxx,moy,1000,color); //fonction pour dessiner le graph contenant moy
    }
     
    double *norme;
    norme=new double[1000];
    if(stNorme=="Moyenne")
    {
    norme=pNorme(moy);
    m_cvDraw.AddDataBuffer(xxx,norme000,color); //fonction pour dessiner le graph contenant norme c'est ici que ca ne fonctionne plus
    }
    pour la dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    extern "C" double* Filtrage(double *a, int n)
    {
    double somme[1000];
    double *moyenne;
    moyenne=new double[1000];
    for (int i=0;i<1000;i++)
    {
      somme[0]=a[i];
      for(int j=0;j<100;j++)
      {
        somme[1+j]=somme[j]+a[1+i+j];
      }
      moyenne[i]=somme[i]/n;
    }
    return moyenne;
    }
     
    extern "C" double* Norme(double *c)
    {
      double sum;
      double av;
      double *b;
      b=new double[1000];
      for(int i=0;i<999;i++)
      {
        sum += c[i];
      }
      av=sum/1000;
      for(intk=0;k<999;k++)
      {
        b[k]=c[k]/av;
      }
      return b;
    }
    merci d'avance car je ne suis certainement pas très claire

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Dans ta déclaration, la fonction filtrage attend 2 paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" double* Filtrage(double *a, int n)
    Dans ton code, tu n'en passe qu'un seul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Filtrage_func *pFiltrage=(Filtrage_func*)GetProcAddress(hDll,"Filtrage");
    ...
    moy=pFiltrage(m_pdData);
    De plus, ton code ne montre pas la déclaration et l'initialisation de m_pdData
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    pardon je me suis trompée en recopiant, j'ai bien deux paramètres pour la fonction filtrage ce n'est pas ca le problème car seule elle fonctionne nickel...

    en ce qui concerne m_pdData c'est un pointeur double déclaré et initialisé dans une fonction ainsi:

    if (m_pdDada!=NULL)
    delete[] m_pdData;
    m_pdData=new double m_pdData[taille];

    ainsi que dans le .h double* m_pdData;

    merci d'avoir lu mon message

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Attention, je te déconseille les delete[] dans la fonction appelante.
    En règle générale, ce qui est alloué par un module doit être désalloué par le même module (même si la version DLL de la CRT a tendance à éviter cela, je conseille de toujours en avoir le réflexe).
    Ainsi, ta DLL devrait exporter une fonction DeleteDoubles(double*).

    De plus, ce code manque cruellement de const, et tes int devraient être des size_t.

    PS: Est-ce normal que la fonction Norme() ne prenne pas en compte le dernier élément du tableau?
    Edit: Ah, je crois que j'ai trouvé l'erreur: Dans la fonction Norme(), la variable locale sum n'est pas initialisée...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    merci mais ca ne fonctionne toujours pas en tenant compte de vos remarques. je pense que c'est un problème de pointeur...mais je ne sais pas comment m'en sortir.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    As-tu pensé à initialisé sum à zéro?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/07/2015, 15h08
  2. [Info]pliage/depliage de plusieurs fonctions d'un coup
    Par pierre.zelb dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 22/06/2005, 14h17
  3. appeler plusieurs fonctions à partir d'une checkbox
    Par amelhog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/05/2005, 16h10
  4. [VB.NET] Variable visible dans plusieurs fonctions ?
    Par Webman dans le forum ASP.NET
    Réponses: 2
    Dernier message: 19/05/2004, 17h36
  5. [Appli][Autre language]dll-contenant form
    Par flash dans le forum Langage
    Réponses: 6
    Dernier message: 20/09/2002, 14h18

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