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

Schneider Emmanuel (LFR) Emmanuel.Schneider at LIEBHERR.com
Mar 14 Avr 16:18:39 CEST 2015


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 :

emmanuel.schneider at liebherr.com<mailto:emmanuel.schneider at liebherr.com>

Internet :

www.liebherr.com<http://www.liebherr.com/>

b2bemail4liebherr

[https://dataexchange.liebherr.com/sites/LFR/images1/intermat20152.gif]
<http://www.liebherr.com/fr/deu/actualit%C3%A9s/salons-manifestations/intermat-2015/intermat-2015.html>[http://dataexchange.liebherr.com/sites/LFR/images1/twitter.gif]<https://twitter.com/intermatparis>[http://dataexchange.liebherr.com/sites/LFR/images1/linkedin.gif]<https://www.linkedin.com/groups/INTERMAT-Paris-4290066>[http://dataexchange.liebherr.com/sites/LFR/images1/youtube.gif]<https://www.youtube.com/user/INTERMAT2012>[http://dataexchange.liebherr.com/sites/LFR/images1/blog.gif]<http://blog.intermatconstruction.com/>
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <https://lists.scilab.org/pipermail/users-fr/attachments/20150414/1d927e33/attachment.htm>


Plus d'informations sur la liste de diffusion users-fr