Segmentation violation occurred
Après avoir implémenté la fonction ci-dessous en C++ :
Code:
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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
# include <math.h>
# include "mex.h"
# include "matrix.h"
// CALCUL DES ALLOCATIONS INITIALES DE PORTEFEUILLES.
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *PoidsDepart, *Pas, *PoidsFin, Allocations[40][65500], *AllocationsFinales;
double Compteur;
int j, k, Numero;
double i[40];
mxArray *ValeursDepart;
mxArray *ValeursPas;
mxArray *ValeursFin;
if (nrhs!=3)
{
mexErrMsgTxt ("Nombre d'arguments incorrect !");
}
if (nlhs>1)
{
mexErrMsgTxt ("Une seule variable est calculée !");
}
ValeursDepart = prhs[0];
ValeursPas = prhs[1];
ValeursFin = prhs[2];
PoidsDepart = mxGetPr(ValeursDepart);
Pas = mxGetPr(ValeursPas);
PoidsFin = mxGetPr(ValeursFin);
Numero = 0;
for (i[0]=PoidsDepart[0]; i[0]<=PoidsFin[0]; i[0]=i[0]+Pas[0])
{for (i[1]=PoidsDepart[1]; i[1]<=PoidsFin[1]; i[1]=i[1]+Pas[1])
{for (i[2]=PoidsDepart[2]; i[2]<=PoidsFin[2]; i[2]=i[2]+Pas[2])
{for (i[3]=PoidsDepart[3]; i[3]<=PoidsFin[3]; i[3]=i[3]+Pas[3])
{for (i[4]=PoidsDepart[4]; i[4]<=PoidsFin[4]; i[4]=i[4]+Pas[4])
{for (i[5]=PoidsDepart[5]; i[5]<=PoidsFin[5]; i[5]=i[5]+Pas[5])
{for (i[6]=PoidsDepart[6]; i[6]<=PoidsFin[6]; i[6]=i[6]+Pas[6])
{for (i[7]=PoidsDepart[7]; i[7]<=PoidsFin[7]; i[7]=i[7]+Pas[7])
{for (i[8]=PoidsDepart[8]; i[8]<=PoidsFin[8]; i[8]=i[8]+Pas[8])
{for (i[9]=PoidsDepart[9]; i[9]<=PoidsFin[9]; i[9]=i[9]+Pas[9])
{for (i[10]=PoidsDepart[10]; i[10]<=PoidsFin[10]; i[10]=i[10]+Pas[10])
{for (i[11]=PoidsDepart[11]; i[11]<=PoidsFin[11]; i[11]=i[11]+Pas[11])
{for (i[12]=PoidsDepart[12]; i[12]<=PoidsFin[12]; i[12]=i[12]+Pas[12])
{for (i[13]=PoidsDepart[13]; i[13]<=PoidsFin[13]; i[13]=i[13]+Pas[13])
{for (i[14]=PoidsDepart[14]; i[14]<=PoidsFin[14]; i[14]=i[14]+Pas[14])
{for (i[15]=PoidsDepart[15]; i[15]<=PoidsFin[15]; i[15]=i[15]+Pas[15])
{for (i[16]=PoidsDepart[16]; i[16]<=PoidsFin[16]; i[16]=i[16]+Pas[16])
{for (i[17]=PoidsDepart[17]; i[17]<=PoidsFin[17]; i[17]=i[17]+Pas[17])
{for (i[18]=PoidsDepart[18]; i[18]<=PoidsFin[18]; i[18]=i[18]+Pas[18])
{for (i[19]=PoidsDepart[19]; i[19]<=PoidsFin[19]; i[19]=i[19]+Pas[19])
{for (i[20]=PoidsDepart[20]; i[20]<=PoidsFin[20]; i[20]=i[20]+Pas[20])
{for (i[21]=PoidsDepart[21]; i[21]<=PoidsFin[21]; i[21]=i[21]+Pas[21])
{for (i[22]=PoidsDepart[22]; i[22]<=PoidsFin[22]; i[22]=i[22]+Pas[22])
{for (i[23]=PoidsDepart[23]; i[23]<=PoidsFin[23]; i[23]=i[23]+Pas[23])
{for (i[24]=PoidsDepart[24]; i[24]<=PoidsFin[24]; i[24]=i[24]+Pas[24])
{for (i[25]=PoidsDepart[25]; i[25]<=PoidsFin[25]; i[25]=i[25]+Pas[25])
{for (i[26]=PoidsDepart[26]; i[26]<=PoidsFin[26]; i[26]=i[26]+Pas[26])
{for (i[27]=PoidsDepart[27]; i[27]<=PoidsFin[27]; i[27]=i[27]+Pas[27])
{for (i[28]=PoidsDepart[28]; i[28]<=PoidsFin[28]; i[28]=i[28]+Pas[28])
{for (i[29]=PoidsDepart[29]; i[29]<=PoidsFin[29]; i[29]=i[29]+Pas[29])
{for (i[30]=PoidsDepart[30]; i[30]<=PoidsFin[30]; i[30]=i[30]+Pas[30])
{for (i[31]=PoidsDepart[31]; i[31]<=PoidsFin[31]; i[31]=i[31]+Pas[31])
{for (i[32]=PoidsDepart[32]; i[32]<=PoidsFin[32]; i[32]=i[32]+Pas[32])
{for (i[33]=PoidsDepart[33]; i[33]<=PoidsFin[33]; i[33]=i[33]+Pas[33])
{for (i[34]=PoidsDepart[34]; i[34]<=PoidsFin[34]; i[34]=i[34]+Pas[34])
{for (i[35]=PoidsDepart[35]; i[35]<=PoidsFin[35]; i[35]=i[35]+Pas[35])
{for (i[36]=PoidsDepart[36]; i[36]<=PoidsFin[36]; i[36]=i[36]+Pas[36])
{for (i[37]=PoidsDepart[37]; i[37]<=PoidsFin[37]; i[37]=i[37]+Pas[37])
{for (i[38]=PoidsDepart[38]; i[38]<=PoidsFin[38]; i[38]=i[38]+Pas[38])
{for (i[39]=PoidsDepart[39]; i[39]<=PoidsFin[39]; i[39]=i[39]+Pas[39])
{
Compteur = 0;
for (k=0; k<40; k++)
{
Compteur = Compteur + i[k];
}
if (Compteur==1)
{
Numero = Numero+1;
if (Numero > 65500)
{
mexErrMsgTxt ("Nombre maximal de portefeuilles atteint !");
}
else
{
for (j=0; j<40; j++)
{
Allocations[j][Numero-1] = i[j];
}
}
}
}
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
plhs[0] = mxCreateDoubleMatrix(Numero, 40, mxREAL);
AllocationsFinales = mxGetPr(plhs[0]);
for (k=0; k<Numero; k++)
{
for (j=0; j<40; j++)
{
AllocationsFinales[k+(j*Numero)] = Allocations[j][k];
}
}
} |
et l'avoir transformée en fichier .Mex, Matlab plante en m'affichant le message d'erreur "Segmentation violation occurred within signal handler.
Unable to complete stack trace (stack was probably corrupted)".
Ce qui m'intrigue, c'est que si je bidouille ma fonction C++ pour m'arreter à 20 lignes (et non 40 comme dans l'exemple) le programme marche très bien...
Savez-vous si le problème provient d'un manque de mémoire ?
Merci.