2011-12-02 103 views
3
#define MAXROWS 88 
#define MAXSTATES 10 
#define MAXPROBS 6 

int obs[MAXROWS]= {0,5,2,3,0,5,2,3,2,4,0,3,5,1,4,3,1,5,2,0,4,4,1,5,3,3,1,4,0,5,1,2,3,0,2,0,5,2,0, 4,4,5,3,0,5,2,5,1,5,4,0,3,1,4,5,2,3,5,1,5,2,4,5,1,5,4,2,5,0,3,4,1,5,2,4,1,5,0,4,2,3,0,5,1,5,2,4,1};//{2,1,0} ; 
int q[MAXROWS]= {1}; 
int s=MAXROWS, i=1,j=0; 
double **A; 
double **B; 
double AD[MAXSTATES][MAXSTATES]={{0,1,0,0,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,0,0},{0,0,0,1,0,0,0,0,0,0},{0,0,0,0,1,0,0,0,0,0},{0.8,0,0,0,0,0.2,0,0,0,0},{0,0,0,0,0,0,1,0,0,0},{0,0,0,0,0,0,0,1,0,0},{0,0,0,0,0,0,0,0,1,0},{0.2,0,0,0,0,0.8,0,0,0,0}};//{{.6,.4},{.3,.7}};//{ { .500, .375, .125 }, { .250,.125, .625 }, { .250,.375,.375 } }; 
double BD[MAXSTATES][MAXPROBS]={{.167,.167,.167,.167,.167,.167},{.167,.167,.167,.167,.167,.167},{.167,.167,.167,.167,.167,.167},{.167,.167,.167,.167,.167,.167},{.167,.167,.167,.167,.167,.167},{.4,.1125,.1125,.1125,.1125,.15},{.4,.1125,.1125,.1125,.1125,.15},{.4,.1125,.1125,.1125,.1125,.15},{.4,.1125,.1125,.1125,.1125,.15},{.4,.1125,.1125,.1125,.1125,.15}};//{{.1,.3,.6},{.5,.4,.1}};//{ { .60, .20 ,.15, .05}, { .25, .25, .25, .25 }, { .05,.10,.35,.50 } }; 
double *pi; 
double pi2[MAXSTATES] = {1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};//{.4,.6}; 
double *poolA; 
double *curPtrA; 
double *poolB; 
double *curPtrB; 
double pproba=0; 
double **delta; 
double *pool; 
double *curPtr; 

int **psi; 
int *poolpsi; 
int *curPtrpsi; 

HMM model; 

A = (double**)calloc(MAXSTATES, sizeof(double*)); 

poolA = (double *)calloc(MAXSTATES * MAXSTATES, sizeof(double)); 
curPtrA = poolA; 

for(i = 0; i < MAXSTATES; i++) 
{ 
    *(A + i) = curPtrA; 
     curPtrA += MAXSTATES; 
} 

B = (double**)calloc(MAXSTATES, sizeof(double*)); 

poolB = (double *)calloc(MAXSTATES * MAXPROBS, sizeof(double)); 
curPtrB = poolB; 

for(i = 0; i < MAXSTATES; i++) 
{ 
    *(B + i) = curPtrB; 
     curPtrB += MAXPROBS; 
} 

for(i = 0; i <MAXSTATES; i++) 
    for(j=0; j< MAXPROBS; j++) 
     B[i][j] = BD[i][j]; 

for(i = 0; i < MAXSTATES; i++) 
    for(j=0; j< MAXSTATES; j++) 
     A[i][j] = AD[i][j]; 


pi = (double*)calloc(MAXSTATES, sizeof(double*)); 

for(i = 0; i <MAXSTATES; i++) 
    pi[i] = pi2[i]; 


model.M=MAXPROBS; 
model.N=MAXSTATES; 
model.A= A; 
model.B = B; 
model.pi = pi; 
//double delta[6][4]; 


    psi = (int**)calloc(MAXROWS, sizeof(int*)); 

    poolpsi = (int *)calloc(MAXROWS*MAXSTATES, sizeof(int)); 
    curPtrpsi = poolpsi; 

    for(i = 0; i < MAXROWS; i++) 
    { 
     *(psi + i) = curPtrpsi; 
     curPtrpsi += MAXSTATES; 
    } 

我开始磅=(INT **)...线大约堆是这样得到错误:内存分配问题

“Windows已经引发了TestProj.exe一个断点。

这可能是由于堆,这表明在TestProj.exe或任何它已加载的DLL的一个错误的损坏。

这也可能是由于用户按F12而TestProj.exe有重点。

输出窗口可能有更多诊断信息。“

+0

你打F12了吗? – Pubby

+0

你可以把你的问题归结为一个更简短的例子吗? – arne

回答

1
pi = (double*)calloc(MAXSTATES, sizeof(double*)); 

我想你应该有sizeof(double)不是指针,因为它是一个double值的数组。

1

按如下方式分配内存可以避免在整个地方重复使用类型名称,因此您不会错配它。

double* pi = calloc(MAXSTATES, sizeof(*pi)); 
0
int **psi , i; 

    psi = malloc(MAXROWS * sizeof(int*)); 

    for(i = 0 ; i < MAXROWS ; i++) 
    { 
     psi[i] = calloc (MAXSTATES, sizeof(int)); 
    } 

尝试这样做,和一个小检查,如果PSI不为空可能是巨大的^^。