[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