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

MATLAB Discussion :

Appel de fonctions MATLAB depuis C++ Builder [Débutant]


Sujet :

MATLAB

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut Appel de fonctions MATLAB depuis C++ Builder
    Bonjour,

    Je créé donc un nouveau post, car j'aimerais également faire communiquer Matlab avec C++ Builder. J'utilise la version Embarcadero C++ Builder XE2 et j'aimerais savoir si quelqu'un a déjà réussi à utiliser les API fournis par Matlab depuis XE2 ?

    Si oui, avec quelle version de Matlab est-ce possible ?

    J'ai repris le code fourni par Matlab (et qui fonctionne sous Visual Studio 2010), en épurant et adaptant ce code pour C++ Builder, mon application me sort des erreurs de compilation au niveau des "typedef" de "matrix.h" ...

    J'ai des "vieux" fichiers engine.h et matrix.h (datant de 2005, mais je ne connais pas la version de Matlab d'où provient ces fichiers , comment le savoir ?), la même application compile, se lie et s'exécute, mais la méthode "engOpen" me renvoie toujours "NULL" ... vu que j'ai Matlab R2008a installé sur mon ordinateur et qui ne correspond pas aux 2 fichiers "engine " et "matrix" ...

    Merci pour vos suggestions et aide,

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par Mercusyo Voir le message
    mon application me sort des erreurs de compilation au niveau des "typedef" de "matrix.h" ...
    Pourrais-tu nous montrer les messages complets

    Citation Envoyé par Mercusyo Voir le message
    J'ai des "vieux" fichiers engine.h et matrix.h (datant de 2005, mais je ne connais pas la version de Matlab d'où provient ces fichiers , comment le savoir ?), la même application compile, se lie et s'exécute, mais la méthode "engOpen" me renvoie toujours "NULL" ... vu que j'ai Matlab R2008a installé sur mon ordinateur et qui ne correspond pas aux 2 fichiers "engine " et "matrix" ...
    La, je ne te suis plus.

    Pourquoi utiliser de vieux fichiers ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Concernant les erreurs, Cf. en pièce jointe, j'ai déjà l'erreur Embarcadero, (E2176 : trop de types dans la déclaration), sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef CHAR16_T  char16_t;
    En fait, pour les 2 anciens fichiers "engine.h" et "matrix.h", c'était pour faire un test, car ces 2 anciens fichiers ne sont pas les mêmes que ceux de Matlab R2008a ... et là mon application se construit sans souci, mais la méthode "engOpen" me renvoie toujours NULL ... qui est dû certainement parce que la version de Matlab installée sur mon poste ne correspond pas ... mais cela, c'est ma déduction.

    Merci,

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    Je vous explique donc où j'en suis ce matin :
    - J'ai désinstallé ma version de Matlab R2008a
    - Installé une ancienne version : Matlab 7.1 R14SP3 (qui contient des répertoires pour lib/dll spécifiques au compilateur Borland ... donc Embarcadero de nos jours)
    - Créé une application C++ Builder XE2, avec juste le code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	Engine *ep = NULL;
     
    	ep = engOpen("");
    	engClose(ep);
    - Lié le projet aux librairies statiques "libmx.lib", "libmat.lib" et "libeng.lib"
    - Cette application se construit sans soucis, avec les bons liens d'include et fichiers lib
    - En exécution je vois bien le moteur Matlab.exe qui démarre et apparait
    - et là, drame : gros message de mémoire "floating point invalid operation" sur "engOpen" ... pourtant Matlab.exe est bien appelé et visible

    Dans le debugger de C++ Builder, la dernière exécution réalisée se porte sur la librairie dynamique "m_interpreter.dll"
    :78988bf7 ; c:\program files\matlab71\bin\win32\m_interpreter.dll
    Merci pour votre aide si vous avez des idées,

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    Je reviens pour faire un bilan de ce que j'ai fait semaine dernière, et qui fonctionne : communication entre Matlab 7.1R14 SP3 et C++ Builder XE2.

    1. Désinstallation de Matlab R2008a
    2. Installation de Matlab 7.1R14 SP3 + vérification de la variable d'environnement "path" + vérification de l'existence que d'une seule version de Matlab (C:\Program Files\MATLAB71\bin\win32) + reboot ordinateur
    3. Création d'une petite application test sous Embarcadero C++ Builder XE2 :
    Code C : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    // très important avec le #include <float.h> !!
     _control87(MCW_EM, MCW_EM);
     Engine *ep = NULL;
     mxArray *T = NULL, *a = NULL, *d = NULL;
     char buffer[BUFSIZE+1];
     double *Dreal, *Dimag;
     double time[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
     
     if (!(ep = engOpen(NULL)))
        ShowMessage("Nok!");
     else
         ShowMessage("Ok!");
     /*
    	 * PART I
    	 *
    	 * For the first half of this demonstration, we will send data
    	 * to MATLAB, analyze the data, and plot the result.
    	 */
     
    	/*
    	 * Create a variable from our data
    	 */
    	T = mxCreateDoubleMatrix(1, 10, mxREAL);
    	memcpy((char *) mxGetPr(T), (char *) time, 10*sizeof(double));
     
    	/*
    	 * Place the variable T into the MATLAB workspace
    	 */
    	engPutVariable(ep, "T", T);
     
    	/*
    	 * Evaluate a function of time, distance = (1/2)g.*t.^2
    	 * (g is the acceleration due to gravity)
    	 */
    	engEvalString(ep, "D = .5.*(-9.8).*T.^2;");
    	/*
    	 * Plot the result
        */
    	engEvalString(ep, "plot(T,D);");
    	engEvalString(ep, "title('Position vs. Time for a falling object');");
    	engEvalString(ep, "xlabel('Time (seconds)');");
    	engEvalString(ep, "ylabel('Position (meters)');");
     
    /*
    	 * PART II
    	 *
    	 * For the second half of this demonstration, we will create another mxArray
    	 * put it into MATLAB and calculate its eigen values
    	 *
    	 */
     
    	 a = mxCreateDoubleMatrix(3, 2, mxREAL);
    	 memcpy((char *) mxGetPr(a), (char *) Areal, 6*sizeof(double));
    	 engPutVariable(ep, "A", a);
     
    	 /*
    	 * Calculate the eigen value
    	 */
    	 engEvalString(ep, "d = eig(A*A')");
     
    	 /*
    	 * Use engOutputBuffer to capture MATLAB output. Ensure first that
    	 * the buffer is always NULL terminated.
    	 */
    	 buffer[BUFSIZE] = '\0';
    	 engOutputBuffer(ep, buffer, BUFSIZE);
     
    	 /*
    	 * the evaluate string returns the result into the
    	 * output buffer.
    	 */
    	 engEvalString(ep, "whos");
    	 MessageBox ((HWND)NULL, (LPSTR)buffer, (LPSTR) "MATLAB - whos", MB_OK);
     
    	 /*
    	 * Get the eigen value mxArray
    	 */
    	 d = engGetVariable(ep, "d");
    	 engClose(ep);
     
    	 if (d == NULL) {
    			MessageBox ((HWND)NULL, (LPSTR)"Get Array Failed", (LPSTR)"Engwindemo.c", MB_OK);
    		}
    	else {
    		Dreal = mxGetPr(d);
    		Dimag = mxGetPi(d);
    		if (Dimag)
    			sprintf(buffer,"Eigenval 2: %g+%gi",Dreal[1],Dimag[1]);
    		else
    			sprintf(buffer,"Eigenval 2: %g",Dreal[1]);
    		MessageBox ((HWND)NULL, (LPSTR)buffer, (LPSTR)"Engwindemo.c", MB_OK);
    	    mxDestroyArray(d);
    	}
     
    	/*
    	 * We're done! Free memory, close MATLAB engine and exit.
    	 */
    	mxDestroyArray(T);
    	mxDestroyArray(a);

    4. Le bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     _control87(MCW_EM, MCW_EM);
    est très important : Cf page 4.17 du PDF à l'URL : http://www.unc.edu/depts/case/BMELIB...tMATLAB6p1.pdf
    --> The only compiler and platform on which you need to mask floating-point
    exceptions is the Borland C++ compiler on Windows

    5. Dans les options, spécifiez le lien vers la bibliothèque pour "engine.h" et autres header (C:\Program Files\MATLAB71\extern\include)
    6. Ajouter les librairies statiques spécifiques au compilteur Borland BCC32 suivantes à l'application : "libmx.lib", "libmat.lib" et "libeng.lib" (C:\Program Files\MATLAB71\extern\lib\win32\borland\bc54)

    Et cela fonctionne donc à merveille
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par Mercusyo Voir le message
    Et cela fonctionne donc à merveille
    Bravo et merci pour le retour
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut pourriez vous m'aider j'arrive pas a compiler
    Bonjour tous le monde,

    Je suis en face un même problème dont je veux appeler matlab version 2009a version 7.8.0.347 et ce depuis embarcadero XE2, Et en excutant votre code source voici une parmi les erreurs de compilation :
    [bcc32 Erreur] matrix.h(302): E2209 Impossible d'ouvrir le fichier include 'tmwtypes.h'

    et plus que ça pourriez vous svp me détailler les deux derniers point sur la démarche que vous avez montrés:

    5. Dans les options, spécifiez le lien vers la bibliothèque pour "engine.h" et autres header (C:\Program Files\MATLAB71\extern\include)
    6. Ajouter les librairies statiques spécifiques au compilteur Borland BCC32 suivantes à l'application : "libmx.lib", "libmat.lib" et "libeng.lib" (C:\Program Files\MATLAB71\extern\lib\win32\borland\bc54)

    merci d'avance.
    cordialement.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    Désolé pour la réponse tardive, concernant les points 5 et 6, il vous faut tout d'abord installer la bonne version de Matlab, à télécharger sur le net car c'est une ancienne version; en effet, les répertoires précisés sont ceux de cette version.
    Sinon :
    Point 5 : dans C++ Builder XE, positionnez vous sur le projet et faite un clic droit/ Options. Allez sur la ligne spécifique aux en têtes et coller le lien. Afin que le compilateur puisse trouver les header correspondant
    Point 6 : Pareil, clic droit, choisissez "Ajouter", une boîte de dialogue apparaît alors, choisissez les types de fichiers "lib - librairie statique", et sélectionnez les différents librairies statiques (libmx.lib, libmt.lib et libeng.lib), puis OK

    En espérant que cela vous aide,

    Tenez moi au courant,

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

Discussions similaires

  1. [Débutant] Appel de fonctions MATLAB depuis VSC++ 2010
    Par Mercusyo dans le forum MATLAB
    Réponses: 10
    Dernier message: 06/11/2013, 13h17
  2. Appel de fonctions MATLAB depuis VSC++ 2010
    Par Mercusyo dans le forum Visual C++
    Réponses: 1
    Dernier message: 28/10/2013, 13h21
  3. Appeler un fonction javascrit depuis un lien
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/04/2006, 08h53
  4. [Info] Appeler une fonction Ada95 depuis Java
    Par mmathieu dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 15/09/2005, 09h42
  5. Comment appeler une fonction JavaScript depuis Delphi ?
    Par Alfred12 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 17/06/2005, 18h15

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