Après avoir implémenté la fonction ci-dessous en C++ :

Code : 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
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.