[Users-fr] Problème fuite mémoire interface C++ / Scilab

classic Classic list List threaded Threaded
1 message Options
Schneider Emmanuel (LFR) Schneider Emmanuel (LFR)
Reply | Threaded
Open this post in threaded view
|

[Users-fr] Problème fuite mémoire interface C++ / Scilab

Bonjour,

 

J’aurais besoin d’un éclairage au sujet de l’écriture d’interfaces C++ / Scilab

Ma configuration est Scilab 5.4.1 64 bit + module ATOMS mingw + gcc-4.8.2-64.exe sous Windows 7

 

Je ne comprends pas pourquoi l’appel de mon code augmente la mémoire utilisée par Scilab.

 

Pour illustrer mes propos voici un exemple de code écrivant en sortie une liste de double :

 

==============================================================================

 

extern "C"{

 

#include "api_scilab.h"

#include "Scierror.h"

#include "sciprint.h"

 

int sci_ecrire_liste(char *fname,unsigned long fname_len)

{

 

  //  Creation d'une sortie de type liste

  //-------------------------------------

 

  SciErr err;

  int * piAdrOut; 

  int nb_element = 10000;

 

  //creation de la liste dans l'espace memoire de Scilab -> piAdrOut contient l'adresse de la liste

  err = createList(pvApiCtx,              //context Scilab

          nbInputArgument(pvApiCtx) + 1,  //indice de la variable

                             nb_element,  //nombre d'elements

                               &piAdrOut);  //adresse de la liste dans l'espace memoire de Scilab

  if(err.iErr)

  {

    printError(&err, 0);

    return 0;

  }

 

  //ajout des elements a la liste

  double u = 1;

  for(int i=0; i<nb_element; i++)

  {

    err = createMatrixOfDoubleInList(pvApiCtx,  //context Scilab

            nbInputArgument(pvApiCtx) + 1,      //indice de la variable

            piAdrOut,                             //adresse de la liste dans l'espace memoire de Scilab

            i + 1,                              //position dans la liste

            1,                                  //dimension 1 de la matrice

            1,                                  //dimension 2 de la matrice

            &u);                       //pointeur sur le tableau contenant les donnees de la matrice

    if(err.iErr)

   {

      printError(&err, 0);

      return 0;

    }

  }

 

  //assignation des sorties n = nb d'entree + n

  AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;

 

  //transmission de l'adresse des sorties a Scilab

  ReturnArguments(pvApiCtx);

 

  return 0;

 

}

 

} //extern C

 

 

==============================================================================

 

 

Une fois ce code compilé à l’aide de ilib_build, j’appelle la fonction en boucle dans Scilab :

 

for i=1:100000; u=ecrire_liste(); end;

 

L’allocation de mémoire pour Scilab dans le gestionnaire des tâches ne fait que augmentée bien que nous écrivions la sortie dans la même variable u.

 

Est-ce normal ?

Y-a-t ’il un moyen de modifier la variable u en la passant à la fonction, par exemple ecrire_liste(u) via une fonction « get » dans le programme C++ interface ?

 

Bien à vous.

 

Emmanuel SCHNEIDER

Bureau d'Etudes Système d'Entrainement

 

Liebherr-France SAS
2, avenue Joseph Rey - BP 90287
FR - 68005 Colmar Cedex

 

Phone :

+33 3 89 21 39 31

 

Email :

[hidden email]

Internet :

www.liebherr.com

b2bemail4liebherr

 

https://dataexchange.liebherr.com/sites/LFR/images1/intermat20152.gif
http://dataexchange.liebherr.com/sites/LFR/images1/twitter.gifhttp://dataexchange.liebherr.com/sites/LFR/images1/linkedin.gifhttp://dataexchange.liebherr.com/sites/LFR/images1/youtube.gifhttp://dataexchange.liebherr.com/sites/LFR/images1/blog.gif


_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr