Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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






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

×