、ファイルに出力する際にエラーが発生してしまい原因が分かりませんのでよろしければ回答お願いします。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "mylib.h"
/* 1次元配列(int)のメモリ確保 */
int *allocate_ivector(int n){
int *u;
u=(int*)malloc(sizeof(int)*(n));
return u;
}
/* 1次元配列(double)のメモリ確保 */
double *allocate_dvector(int n){
double *u;
u=(double*)malloc(sizeof(double)*(n));
return u;
}
/* 2次元配列(int)のメモリ確保 */
int **allocate_imatrix(int m, int n){
int **u;
int i;
u=(int**)malloc(sizeof(int*)*(m));
for (i=0;i<m;i++)
u[i]=(int*)malloc(sizeof(int)*(n));
return u;
}
/* 2次元配列(double)のメモリ確保 */
double **allocate_dmatrix(int m, int n){
double **u;
int i;
u=(double**)malloc(sizeof(double*)*(m));
for (i=0;i<m;i++)
u[i]=(double*)malloc(sizeof(double)*(n));
return u;
}
/* 1次元配列(int)のメモリ解放 */
void free_ivector(int *u){
if (u) free(u);
}
/* 1次元配列(double)のメモリ解放 */
void free_dvector(double *u){
if (u) free(u);
}
/* 2次元配列(int)のメモリ解放 */
void free_imatrix(int m, int **u){
int i;
for (i=0;i<m;i++)
if (u[i]) free (u[i]);
if (u) free(u);
}
/* 2次元配列(double)のメモリ解放 */
void free_dmatrix(int m, double **u){
int i;
for (i=0;i<m;i++)
if (u[i]) free (u[i]);
if (u) free(u);
}
/* 1次元配列(int)のメモリ確保 */
int *allocate_ivector(int n);
/* 1次元配列(double)のメモリ確保 */
double *allocate_dvector(int n);
/* 2次元配列(int)のメモリ確保 */
int **allocate_imatrix(int m, int n);
/* 2次元配列(double)のメモリ確保 */
double **allocate_dmatrix(int m, int n);
/* 1次元配列(int)のメモリ解放 */
void free_ivector(int *u);
/* 1次元配列(double)のメモリ解放 */
void free_dvector(double *u);
/* 2次元配列のメモリ解放 */
void free_imatrix(int m, int **u);
/* 2次元配列(double)のメモリ解放 */
void free_dmatrix(int m, double **u);
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "mylib.h"
#define N 100 // 素子数
#define K 120 // パタン数
#define L 5 // アップサンプル率
#define END 20 // 試行回数
int GetRandom(int min,int max);
void make_pattern(int **x, double lambda);
void make_upsample(int **x, int **y);
void make_weight(int **W, int **y);
void initial_state(int *s, int **y, double m0);
void update(int **W, int *s);
int sgn(int y);
double overlap(int **y, int *s);
int main(void){
int i,j;
int **x, **W, **y;
int *s;
double **m, lambda;
FILE *fp;
fp = fopen("test1","w");
//N,Kが大きいので配列にすると、動作しない。
//記憶パタン、重み行列はポインタとして定義する。
s=allocate_ivector(N*L); // 現在の状態 state
x=allocate_imatrix(K,N); // 記憶パタン
y=allocate_imatrix(K,N*L); // 記憶パタン(アップサンプル後)
W=allocate_imatrix(N*L,N*L); // 結合重み
m=allocate_dmatrix(END,10); // 第0パターンとのオーバラップ
srand((unsigned int)time(NULL));/*initialisation of RAND function*/
for (lambda=-0.9;lambda<1;lambda=lambda+0.1){
//int **x = {0};
//int **y = {0};
make_pattern(x,lambda);
make_upsample(x,y);
make_weight(W,y);
for (j=0;j<10;j++){
initial_state(s,y,0.1*(j+1)); //初期状態作成
for (i=0;i<END;i++){
m[i][j]=overlap(y,s); // オーバーラップの計算
update(W,s); // 状態更新
}
}
for (j=0;j<10;j++){
for (i=0;i<END;i++)
printf("%d %d %f\n", i, j, m[i][j]); //結果表示
fprintf(fp, "%d %d %f\n", i, j, m[i][j]);
printf("\n");
fprintf(fp, "\n");
}
}
fclose(fp);
// メモリ空間開放
free_dmatrix(END,m);
free_imatrix(N*L,W);
free_imatrix(K,y);
free_ivector(s);
return 0;
}
void make_pattern(int **x, double lambda){
int k,n;
for (k=0;k<K;k++){
x[k][0]=(rand()%2)*2-1;
for (n=1;n<N;n++){
if((RAND_MAX+1)*(1+lambda)/2 > rand())
x[k][n]=x[k][n-1];
else
x[k][n]=-x[k][n-1];
}
}
}
void make_upsample(int **x, int **y){
int k,l,temp1;
for(k=0;k<K ;k++)
{
temp1 = GetRandom(0,L-1);
for(l = 0;l <temp1 ;l++){
y[k][l]= x[k][N-1];
}
for(l = temp1;l < N*L;l++){
y[k][l]= x[k][(l-temp1)/L];
}
}
}
void make_weight(int **W, int **y){
int m,n, k,sum;
for (m=0;m<N*L;m++)
for (n=0;n<N*L;n++){
sum=0;
for (k=0;k<K;k++)
sum+=y[k][m]*y[k][n];
W[m][n]=sum;
}
}
void initial_state(int *s, int **y, double m0){
int n;
for (n=0;n<N*L;n++){
if (n<(double)N*L*(m0+1)*0.5)
s[n]=y[0][n];
else s[n]=-y[0][n];
}
}
// signum 関数
int sgn(int y){
if (y<0) return(-1);
else return (1);
}
void update(int **W, int *s){
int n, m, z[N*L], sum;
for (m=0;m<N*L;m++){
sum=0;
for (n=0;n<N*L;n++)
if (n!=m)
sum+=W[m][n]*s[n];
z[m]=sum;
}
for (n=0;n<N*L;n++) s[n]=sgn(z[n]);
}
double overlap(int **y, int *s){
double ans=0;
int n;
for (n=0;n<N*L;n++)
ans+=y[0][n]*s[n];
return(ans/(N*L));
}
int GetRandom(int min,int max)
{
return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}
「project1.exe の 0x010d20ba でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfdfdfdfd を読み込み中にアクセス違反が発生しました。」というメッセージが出て止まってしまいます。環境はVC++ 2008です。 よろしくお願いいたします。