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

Scilab Discussion :

Scilab 6.0.1 StartScilab fonctionne dans un EXE mais pas dans une DLL


Sujet :

Scilab

  1. #1
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut Scilab 6.0.1 StartScilab fonctionne dans un EXE mais pas dans une DLL
    O.S. Windows Seven
    Scilab version 6.0.1

    je suis parti du
    A simple call_scilab example
    fournit dans la doc Scilab.

    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
     
     
    #include <stdio.h>
     /* stderr */
     
    #include "api_scilab.h"
    //#include "stack-c.h" /* Provide functions to access to the memory of Scilab */
    #include "call_scilab.h" /* Provide functions to call Scilab engine */
     
    int main(void)
    {
    /****** INITIALIZATION **********/
    #ifdef _MSC_VER
     if ( StartScilab(NULL,NULL,NULL) == FALSE )     
    #else
     if ( StartScilab(getenv("SCI"),NULL,NULL) == FALSE )
    #endif
      {
       fprintf(stderr,"Error while calling StartScilab\n");
       return -1;
      }
     
    /****** ACTUAL Scilab TASKS *******/
     
     SendScilabJob("myMatrix=['sample','for the help']");
     SendScilabJob("disp(myMatrix);"); // Will display !sample  for the help  !
     SendScilabJob("disp([2,3]+[-44,39]);"); // Will display   - 42.    42.   
     SendScilabJob("A=[1,2;3,4];");     
     SendScilabJob("B=inv(A);");     
     SendScilabJob("disp(A)");      
     SendScilabJob("disp(B)");      
     SendScilabJob("disp(A*B)"); 
     
     
    /****** TERMINATION **********/
     if ( TerminateScilab(NULL) == FALSE ) {
      fprintf(stderr,"Error while calling TerminateScilab\n");
      return -2;
     }
     return 0;
    }

    Je compile et j'exécute ce code sans problème.

    Lorsque je transforme cela en fonction exportée par une DLL et que je lance cette fonction depuis un exécutable (64 bits) je déclenche une exception "Opération en virgule flottante incorrecte".

    remarques complémentaires :
    • l'application cliente démarre une fenêtre console
    • les instructions "printf" ont été ajoutées en début et en fin de fonction, seule la première instruction est exécutée lors de mon test



    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
     
     
    #include <stdio.h> /* stderr */
     
    #include "api_scilab.h"
    //#include "stack-c.h" /* Provide functions to access to the memory of Scilab */
    #include "call_scilab.h" /* Provide functions to call Scilab engine */
     
    //---------------------------------------------------------------------------
         #if defined(__cplusplus)
         #define FRONTAL_EXPORT extern "C" __declspec( dllexport ) 
         #else
         #define FRONTAL_EXPORT __declspec( dllexport )  
         #endif
    //---------------------------------------------------------------------------
     
    FRONTAL_EXPORT int  __cdecl _lancerSCILAB(
          int * numErr
    )
    {
    printf("FRONTAL_EXPORT int  __cdecl _lancerSCILAB : begin\n");
    /****** INITIALIZATION **********/
    #ifdef _MSC_VER
     if ( StartScilab(NULL,NULL,NULL) == FALSE )     
    #else
     if ( StartScilab(getenv("SCI"),NULL,NULL) == FALSE )
    #endif
      {
       fprintf(stderr,"Error while calling StartScilab\n");
       * numErr=1;
       return -1;
      }
     
     * numErr=0;
    printf("FRONTAL_EXPORT int  __cdecl _lancerSCILAB : end\n");
     return 0;
    }

    .J'ai le même comportement pour Scilab5.5.2 64 bits
    .En revanche tout fonctionne correctement avec Scilab5.5.2 32 bits

    Voilà, pour le moment je n'ai pas trouvé de réponse à ce problème (ni sur Développez ni sur le Google)

    N.B. l'include
    stack-c.h
    est connu dans la version 5.5.2 mais pas en 6.0.1

  2. #2
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    Suite à de nombreux retours dans le Forum Delphi où j'ai soumis le problème (d'une façon un peu différente) j'ai obtenu la solution suivante :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int lancerScilab(int * numErr)
    {
    	_control87(_MCW_EM, _MCW_EM);
    	if ( StartScilab(NULL,NULL,NULL) == FALSE )
    	{
    		fprintf(stderr,"Error while calling StartScilab\n");
    		*numErr=1;
    		return S_FAILED;
    	}
    	return S_OK_LOCAL;
    }

    L'instruction _control87(_MCW_EM, _MCW_EM); résoud le problème.

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

Discussions similaires

  1. Script qui fonctionne dans un onglet mais pas dans un popup
    Par lwolf dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/08/2012, 20h13
  2. [XL-2010] macro fonctionne dans l'editeur mais pas depuis une feuille
    Par Kanetsugu dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/12/2011, 06h56
  3. Réponses: 11
    Dernier message: 09/09/2010, 02h53
  4. Requete SQL BETWEEN fonctionne dans le bash mais pas dans mon script?
    Par ssc37 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 09/03/2009, 11h01
  5. [RegEx] Regex qui fonctionne dans un preg_replace mais pas dans un ereg
    Par méphistopheles dans le forum Langage
    Réponses: 4
    Dernier message: 31/03/2007, 11h56

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