ファイルの入出力に関する質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
なお

ファイルの入出力に関する質問

#1

投稿記事 by なお » 13年前

初めまして。 以下のようなソースを作成したのですが
、ファイルに出力する際にエラーが発生してしまい原因が分かりませんのでよろしければ回答お願いします。

コード:

#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));
}
エラーが発生している箇所はfprintf(fp, "%d %d %f\n", i, j, m[j]);の部分で、コンパイルはできるのですが、デバッグをすると、
「project1.exe の 0x010d20ba でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfdfdfdfd を読み込み中にアクセス違反が発生しました。」というメッセージが出て止まってしまいます。環境はVC++ 2008です。 よろしくお願いいたします。

アバター
kimuchi
記事: 163
登録日時: 13年前
住所: 東京

Re: ファイルの入出力に関する質問

#2

投稿記事 by kimuchi » 13年前

その直前のfor文がfprintfを囲んでいませんが、意図した物でしょうか?
最後に編集したユーザー kimuchi on 2011年2月06日(日) 21:48 [ 編集 1 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ファイルの入出力に関する質問

#3

投稿記事 by みけCAT » 13年前

なるほど、そしてiが範囲外なのでアクセス違反になりそうですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

なお

Re: ファイルの入出力に関する質問

#4

投稿記事 by なお » 13年前

返信ありがとうございました。forの{が抜けていたのは私のミスでした。ご指摘ありがとうございます。ここの間違いを訂正したところ、今度は208行のy[k][l]= x[k][(l-temp1)/L];のところで、同様のアクセス違反のエラーが出てしまいました。 度々申し訳ありませんが、もしよろしければ回答お願いします。

non
記事: 1097
登録日時: 13年前

Re: ファイルの入出力に関する質問

#5

投稿記事 by non » 13年前

何のプログラムかわかりませんが、実行してもエラーが出ませんでした。
non

閉鎖

“C言語何でも質問掲示板” へ戻る