アクセス違反を解決するには?


odd  2009-01-31 02:55:22  No: 69546

シーケンスペアにおける一様交叉をつくっており、デバッグするとFloorplan.exe の 0x00418efe で初回の例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。
Floorplan.exe の 0x00418efe でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。
'Floorplan.exe': 'C:\WINDOWS\system32\kavo0.dll' を読み込みました。バイナリはデバッグ情報と一緒にビルドされませんでした。
Floorplan.exe の 0x029feee4 で初回の例外が発生しました: 0xC0000005: 場所 0x77010000 を読み込み中にアクセス違反が発生しました。

1回目のroopはうまくいって結果がでてるのですが2周目に入ったとたんこれらがたくさんでてきます。

以下プログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "ga.h"
#include "data.h"

void Crossover(GeneticPool *gp, Data *data, Individual *child, Individual **selpool, int crossNum)
{

int *flag;
int *mask;
int *cross_data1;
int *cross_data2;
int *cross_data3;
int *cross_data4;
float cross_rate;
double d_ret; 
int i,j,k,l;
int z;

int rando (int);
srand((unsigned) time(NULL));

flag = (int *)calloc(data->blockNum, sizeof(int));
for (i=0; i<data->blockNum; i++){
flag[i] = 0;
}

mask = (int *)calloc(data->blockNum, sizeof(int));
for (i=0; i<data->blockNum; i++){
mask[i] = 0;
}

cross_data1 = (int *)calloc(data->blockNum, sizeof(int));
for (i=0; i<data->blockNum; i++){
cross_data1[i] = -1;
}

cross_data2 = (int *)calloc(data->blockNum, sizeof(int));
for (i=0; i<data->blockNum; i++){
cross_data2[i] = -1;
}

cross_data3 = (int *)calloc(data->blockNum, sizeof(int));
for (i=0; i<data->blockNum; i++){
cross_data3[i] = -1;
}

cross_data4 = (int *)calloc(data->blockNum, sizeof(int));
for (i=0; i<data->blockNum; i++){
cross_data4[i] = -1;
}

cross_rate = 0.5;
for(i=0; i<data->blockNum;i++){
d_ret=(double)rando(101)/100;

    if(d_ret< cross_rate) mask[i] = 1;
    else mask[i] = 0;
}

for(i=0; i<crossNum*2; i++){
for(j=0; j<data->blockNum; j++){
child[i].Gp[j]=-1;
child[i].Gm[j]=-1;
child[i].TH[j]=-1;
child[i].L[j]=-1;
}
}

for(i=0; i<data->blockNum; i++){
printf("%d",mask[i]);
}
printf("\n");

/*Γ+においてマスクが1のとき親1、親2の遺伝子を子1、子2に受け継ぐ*/
for(i=0; i<crossNum*2; i+=2){
for (j=0; j<data->blockNum; j++){
if(mask[j]==1){
child[i].Gp[j]=selpool[i]->Gp[j];
cross_data1[j]=selpool[i]->Gp[j];

}
}
}

for(i=0; i<crossNum*2; i+=2){
for (j=0; j<data->blockNum; j++){
if(mask[j]==1){
child[i+1].Gp[j]=selpool[i+1]->Gp[j];
cross_data2[j]=selpool[i+1]->Gp[j];
}
}
}
for(i=0; i<data->blockNum; i++){
printf("%d",flag[i]);
}
printf("\n");

/*Γ+においてマスクが0のとき親2の遺伝子を子1に受け継ぐ*/
for(i=0; i<crossNum*2; i+=2){
for (k=0; k<data->blockNum; k++){
for (j=0; j<data->blockNum; j++){
if(child[i].Gp[j]==selpool[i+1]->Gp[k]){
flag[k]=1;←ここのフラグで0と1が入っているにもかかわらず表示させるとすべて1になっているのもなぜかわかりません。
break;
}
}
}
}

for(i=0; i<data->blockNum; i++){
printf("%d",flag[i]);
}
printf("\n");

for(i=0; i<crossNum*2; i+=2){
for(k=0; k<data->blockNum; k++){
if(mask[k] == 0){
for(j=0; j<data->blockNum; j++){
if(flag[j]==0){
child[i].Gp[k]=selpool[i+1]->Gp[j];
cross_data3[k]=selpool[i+1]->Gp[j];
flag[j]=1;
break;
}
}
}
}
}

/*flag初期化*/
for (i=0; i<data->blockNum; i++){
flag[i] = 0;
}

/*Γ+においてマスクが0のとき親1の遺伝子を子2に受け継ぐ*/
for(i=0; i<crossNum*2; i+=2){
for (k=0; k<data->blockNum; k++){
for (j=0; j<data->blockNum; j++){
if(selpool[i]->Gp[k]==child[i+1].Gp[j]){
flag[k]=1;
break;
}
}
}
}

for(i=0; i<crossNum*2; i+=2){
for(k=0; k<data->blockNum; k++){
if(mask[k] == 0){
for(j=0; j<data->blockNum; j++){
if(flag[j]==0){
child[i+1].Gp[k]=selpool[i]->Gp[j];
cross_data4[k]=selpool[i]->Gp[j];
flag[j]=1;
break;
}
}
}
}
}

/*flag初期化*/
for (i=0; i<data->blockNum; i++){
flag[i] = 0;
}

/*Γ-においてΓ+に対応した親1、親2の遺伝子を子1、子2に受け継ぐ*/
for(i=0; i<crossNum*2; i+=2){
for (k=0; k<data->blockNum; k++){
for (j=0; j<data->blockNum; j++){
if(selpool[i]->Gm[k]==cross_data1[j]){
child[i].Gm[k]=selpool[i]->Gm[k];
}

if(selpool[i+1]->Gm[k]==cross_data2[j]){
child[i+1].Gm[k]=selpool[i+1]->Gm[k];
}
}
}
}

/*Γ-においてΓ+に対応した親2の遺伝子を子1に受け継ぐ*/
for(i=0; i<crossNum*2; i+=2){
for (k=0; k<data->blockNum; k++){
for (j=0; j<data->blockNum; j++){
if(selpool[i+1]->Gm[k]==child[i].Gm[j]){
flag[k]=1;
break;
}
}
}
}

for(i=0; i<crossNum*2; i+=2){
for(k=0; k<data->blockNum; k++){
if(child[i].Gm[k]==-1){
for(j=0; j<data->blockNum; j++){
if(flag[j]==0){
child[i].Gm[k]=selpool[i+1]->Gm[j];
flag[j]=1;
break;
}
}
}
}
}

/*flag初期化*/
for (i=0; i<data->blockNum; i++){
flag[i] = 0;

/*Γ-においてΓ+に対応した親1の遺伝子を子2に受け継ぐ*/
for(i=0; i<crossNum*2; i+=2){
for (k=0; k<data->blockNum; k++){
for (j=0; j<data->blockNum; j++){
if(selpool[i]->Gm[k]==child[i+1].Gm[j]){
flag[k]=1;
break;
}
}

}

for(i=0; i<crossNum*2; i+=2){
for(k=0; k<data->blockNum; k++){
if(child[i+1].Gm[j]==-1){
for(j=0; j<data->blockNum; j++){
if(flag[j]==0){
child[i+1].Gm[k]=selpool[i]->Gm[j];
flag[j]=1;
break;
}
}
}
}
}

/*flag初期化*/
for (i=0; i<data->blockNum; i++){
flag[i] = 0;
}

/*親1、親2のθ成分を子1、子2へ受け継ぐ*/
for(i=0; i<crossNum*2; i+=2){
for (k=0; k<data->blockNum; k++){
for (j=0; j<data->blockNum; j++){
if(k==cross_data1[j]){
child[i].TH[k]=selpool[i]->TH[k];
}

if(k==cross_data2[j]){
child[i+1].TH[k]=selpool[i+1]->TH[k];
}
}
}
}

/*親2のθ成分を子1に*/
z=0;
z=z-1;
for(i=0; i<crossNum*2; i+=2){
for(k=0; k<data->blockNum; k++){
if( child[i].TH[k]==-1){
for(l=z+1; l<data->blockNum; l++){
for(j=0; j<data->blockNum; j++){
if(l==cross_data3[j]){
child[i].TH[k]=selpool[i+1]->TH[j];
break;
}
}
if(l==cross_data3[j]){
break;
}
}
z=l;
}
}
}

/*親1のθ成分を子2に*/
z=0;
z=z-1;
for(i=0; i<crossNum*2; i+=2){
for(k=0; k<data->blockNum; k++){
if(child[i+1].TH[k]==-1){
for(l=0; l<data->blockNum; l++){
for(j=0; j<data->blockNum; j++){
if(l==cross_data3[j]){
child[i+1].TH[k]=selpool[i]->TH[j];
break;
}
}
if(l==cross_data4[j]){
break;
}
}
z=1;
}
}
}

/*親1、親2のアスペクト比を子1、子2へ受け継ぐ*/
for(i=0; i<crossNum*2; i+=2){
for (k=0; k<data->blockNum; k++){
for (j=0; j<data->blockNum; j++){
if(k==cross_data1[j]){
child[i].L[k]=selpool[i]->L[k];
}

if(k==cross_data2[j]){
child[i+1].L[k]=selpool[i+1]->L[k];
}
}
}
}

/*親2のアスペクト比を子1に*/
z=0;
z=z-1;
for(i=0; i<crossNum*2; i+=2){
for(k=0; k<data->blockNum; k++){
if( child[i].L[k]==-1){
for(l=z+1; l<data->blockNum; l++){
for(j=0; j<data->blockNum; j++){
if(l==cross_data3[j]){
child[i].L[k]=selpool[i+1]->L[j];
break;
}
}
if(l==cross_data3[j]){
break;
}
}
z=1;
}
}
}

/*親1のアスペクト比を子2に*/
z=0;
z=z-1;
for(i=0; i<crossNum*2; i+=2){
for(k=0; k<data->blockNum; k++){
if(child[i+1].L[k]==-1){
for(l=0; l<data->blockNum; l++){
for(j=0; j<data->blockNum; j++){
if(l==cross_data3[j]){
child[i+1].L[k]=selpool[i]->L[j];
break;
}
}
if(l==cross_data4[j]){
break;
}
}
z=1;
}
}
}

free(mask);
free(flag);
free(cross_data1);
free(cross_data2);
free(cross_data3);
free(cross_data4);

}

int rando (int num) {
int ret;
ret = rand ();
ret = ret % num;
return ret;
}

ループは
for(・・・)
Crossover(・・・)
という感じで違うプログラムで行っています。

アクセス違反とできればフラグについてもよろしくおねがいします。


どら  2009-01-31 03:17:43  No: 69547

開発環境や実行環境も書かれていませんし、
#include "ga.h"
#include "data.h"
に関してはオリジナルっぽいので、その中で宣言されている構造体やクラス等
の中身もわかりません。

デバッグ実行でブレイクポイントで止めながら実行し、どこでそのエラーが発
生するかを切り分けましたか?

どこでエラーが発生するかは書いていただいた方がいいと思います。
後、開発環境や実行環境(OSやVCのバージョンなど)も記載した方が良い場合が
多いです。

まずはそこからだと思います。


wclrp ( 'o')  2009-01-31 07:38:57  No: 69548

報告としては正確で詳細なのでいいことです。
でもこれだとただ報告しているだけで丸投げとしか思えない。

面倒なのでプログラムは見ないで回答します。

int a[10];
int b[10];
int*p=&a[7];
a[15]=3; ← こういうことをしている場所が無いか徹底的に探しましょう。
p[6]=3; ← こういうことをしている場所が無いか徹底的に探しましょう。

エラーが起きる場所と
その原因を作る場所は離れているから
何度も実行して徐々にokなところNGなところを探っていきましょう。

2周目で起きると判っているなら楽じゃないですか。
翌日起きるとか
いつ起きるとか判らないことよくある。
ラッキーなくらいだ。

ASERTNつかうとか
TRACEやLOGつかうとか。


odd  2009-01-31 21:27:43  No: 69549

ご指摘ありがとうございます。
もう少し検査してから書きたいと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加