Ir ao conteúdo
  • Cadastre-se
luisfalm

Access violation at address 00407F26

Recommended Posts

Oi pessoal

Por acaso alguem tem uma dica para isso: estou com erro de "Access Violation" no seguinte código:

for(j=0; j<ny; j++){

y[j]= w[nz][j];

for(i=0; i<nz; i++) y[j] = y[j] + z*w[j];

}

Estranho que os valores da matriz w são constantes. Esse código está dentro de um loop que teria que executar 150 vezes. Entretanto, sempre na iteração 49 dá o erro de "Access Violation". Quando o fiz um debug do código o valor de w para essa iteração estava "???". Nas iterações anteriores estavam normal.

A varável w foi alocada da seguinte maneira:

w= new double *[nz+1];

for(i=0; i<(nz+1); i++) w= new double [ny];

Estou usando o Builder C++ 6.0. Por acaso é alguma configuração de ambiente que devo fazer?

Qualquer ajuda fico agradecido.

abraços

Fernando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para facilitar, abaixo vai o código da rotina que está dando o erro. o Erro ocorre sempre na iteração k=49 na linha em destaque. abraços

float mlp1_teste(int nx, int nz, int ny){

FILE *fin;

AnsiString in;

double **x, *z, *y, **v, **w;

float lambda_z=0.001, lambda_y=0.001;

int s_real, s_esperada, i, j, k, acerto=0, ns, *se;

registro reg;

int ac[6]={0,0,0,0,0,0};

//********* aloca memoria para RNA

// abre arquivo de dadosm para teste da RNA

in= PATH + FEATURE + "teste.rna";

fin= fopen(in.c_str(),"rb");

fread(&ns,sizeof(int),1,fin);

// camada de entrada

x= new double *[ns];

for(i=0; i<ns; i++) x= new double [nx];

se= new int [ns];

for(i=0; i<ns; i++){

for(j=0; j<nx; j++) fread(&x[j],sizeof(double),1,fin);

fread(&se,sizeof(int),1,fin);

}//for i

fclose(fin); fin=NULL;

// camada oculta

z= new double [nz];

// camada de saída

y= new double [ny+1];

// peso entre x e z

v= new double *[nx+1];

for(i=0; i<(nx+1); i++) v= new double [nz];

// peso entre z e y

w= new double *[nz+1];

for(i=0; i<(nz+1); i++) w= new double [ny+1];

// abre arquivo de pesos

in= PATH + FEATURE + "pesos.rna";

if((fin= fopen(in.c_str(),"rb"))==NULL) return -1;

// peso entre x e z

for(i=0; i<(nx+1); i++)

for(j=0; j<nz; j++) fread(&v[j],sizeof(double),1,fin);

// peso entre z e y

for(i=0; i<(nz+1); i++)

for(j=0; j<ny; j++) fread(&w[j],sizeof(double),1,fin);

// fecha arquivo de pesos

fclose(fin); fin=NULL;

// teste da rede

for(k=0; k<ns; k++){

// saída da RNA

if(se[k]!=0) s_esperada=1;

else s_esperada=0;

// calcula entrada da camada oculta

for(j=0; j<nz; j++){

z[j]= v[nx][j];

for(i=0; i<nx; i++) z[j]= z[j] + x[k]*v[j];

}// for j

// calcula a saída da camada oculta

for(j=0; j<nz; j++) z[j]= 1./(1.+exp(-lambda_z*z[j]));

// calcula entrada da camada de saída

for(j=0; j<ny; j++){

y[j]= w[nz][j];

for(i=0; i<nz; i++) y[j] = y[j] + z*w[j];

}// for j

// calcula a saída da camada de saída

for(j=0; j<ny; j++) y[j]= 1./(1.+exp(-lambda_y*y[j]));

// saída real da RNA

for(j=0; j<ny; j++)

if(y[j]>0.5) s_real= 0;

else s_real= 1;

// verifica se acertou

if(s_real==s_esperada){

acerto++;

ac[k%ns]++;

}

}//for k

// libera memória

for(i=0; i<ns; i++){ delete[] x; x = NULL; }

delete[] x; x = NULL;

delete[] se; se = NULL;

delete[] z; z = NULL;

delete[] y; y = NULL;

for(i=0; i<(nx+1); i++){ delete[] v; v = NULL; }

delete[] v; v = NULL;

for(i=0; i<(nz+1); i++){ delete[] w; w = NULL; }

delete[] w; w = NULL;

return (float)(100*acerto)/ns;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

man...não sei se pode ser...eu sou meio que inexperiente nisso...+ tipo parece qe o array W está sendo alocado em um lugar que não deve...verifica se é algum deslize com os ponteiros ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal

Encontrei o erro, por sinal, ridículo...falta de atenção minha...no caso é esse:

ao invés de: ac[k%ns]++;

o correto é: ac[(int)k/25]++;

Assim não estoura o limite do vetor ac[6].

Valeu pela atenção de todos que passaram por esse tópico

abraços

Fernando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×