ファイル入出力とデータ処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
so-men
記事: 3
登録日時: 9年前

ファイル入出力とデータ処理

#1

投稿記事 by so-men » 9年前

こんにちは。
現在、とある数値データの羅列(15万点程度,小数)をtxtファイルからファイル入力し、数値処理してからファイルに出力するプログラムを作っているのですが、コンパイル後実行すると動作停止のエラーが出てしまいます。以下ソースコードです。

コード:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  FILE *fp;
  FILE *fq;
  double before[200000];
  double after[200000];
  int i , j = 0 , k , n = 0; 

  
  if ((fp = fopen("test.txt", "r")) == NULL) {
    printf("%sのオープンに失敗しました.\n");
    exit(EXIT_FAILURE);
  }
  
  while ( fscanf(fp, "%lf", &before[n])) {
    n++;
  }
  
  fclose( fp );

  n = n-1; //改行分削除
  
  for(i=0; i<100; i++){
    after[i] = before[i];
  }
 //100個目のデータまでは処理の対象にしない
  for(i=100; i<n; i++){

    if( j==0 ){
      if( before[i] - before[i-1] >= 0.000002704 || before[i] - before[i-1] <= -0.000002704){
        after[i] = after[i-1] ;
        j++ ;   
      } //1つ前の数値より規定以上大きく動いたら1つ前の数値を保持
      else{
        after[i] = before[i] ;
      }
    }
    else if( j > 0 && j <= 10 ){
      after[i] = after[i-1] ;
      j++ ;
    } //1度保持したら10点分は無条件で1つ前の値を保持
    else if( j > 10 ){
      if( before[i] - before[i-10] >= 0.000001352 || before[i] - before[i-10] <= -0.000001352){
        after[i] = after[i-1] ;
        j++ ;
      } //11点目以降で10点前と比較、値のズレが大きかったら値の保持を継続
      else{
        after[i] = before[i] ;
        j = 0;
      } //ズレが小さかったら値を保持せず元のデータをそのまま移行
    }
  }
       
  if ((fq = fopen("result.txt", "w")) == NULL) {
    printf("%sのオープンに失敗しました.\n");
    exit(EXIT_FAILURE);
  }
  for( k=0 ; k<n ; k++){
    fprintf(fq, "%lf\n", after[k]);
  }
//ファイル出力
  fclose( fq );
  return 0;
}


コンパイルでエラーが出ていないので、ファイル入出力がうまくできていないのでしょうか?
実行できない理由、改善策などもしよろしければ教えていただけると嬉しいです。
今週中には完成させたいので、お早めにご教授いただければ幸いです。
よろしくお願い致します。

だんごさん
記事: 273
登録日時: 13年前

Re: ファイル入出力とデータ処理

#2

投稿記事 by だんごさん » 9年前

配列の要素数が大きすぎてスタックオーバーフローを起こしています。
double before[200000]; と double after[200000]; を int main(void)の外に出して静的領域に移動させるか、mallocなどで動的にメモリ確保を行ってください。
 Dango San

so-men
記事: 3
登録日時: 9年前

Re: ファイル入出力とデータ処理

#3

投稿記事 by so-men » 9年前

迅速なご返信ありがとうございます。ご指摘のとおり、double before[200000]; と double after[200000]; を int main(void)の外に出したところ動作停止のエラーは出なくなりました。
しかしプログラム実行後数分待っても処理が終了せず…この量の数値処理だと相当時間がかかるということでしょうか?
それともどこかでループを抜け出せなくなっているのでしょうか…?

だんごさん
記事: 273
登録日時: 13年前

Re: ファイル入出力とデータ処理

#4

投稿記事 by だんごさん » 9年前

とてもこちら側で15万点ものデータを用意できませんので自分で確認してもらうのが一番実用的な方法です。
開発環境は何でしょうか?デバッグ機能がついたコンパイラで実行してみてください。
例えばvisual studioは高機能かつ無料で使用できます。
Visual Studio ダウンロード
 Dango San

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: ファイル入出力とデータ処理

#5

投稿記事 by usao » 9年前

>しかしプログラム実行後数分待っても処理が終了せず…この量の数値処理だと相当時間がかかるということでしょうか?
>それともどこかでループを抜け出せなくなっているのでしょうか…?

一定個数のデータを処理する毎(例えばiが100の倍数のときとか)に
今何個目の処理なのかをprintf()か何かで出力してみればどうでしょう.

元気に動いていれば出力される値が増えていくでしょうし,おおよその処理の速度も把握できます.
予定と違う動きをしているならば,出力も予想とは異なる形になって,問題に気付くことができるかもしれません.

so-men
記事: 3
登録日時: 9年前

Re: ファイル入出力とデータ処理

#6

投稿記事 by so-men » 9年前

返信ありがとうございました!どうやらファイル入力から配列に埋め込むところでループを抜けだせずに空白(0)を配列に入れ続けて止まってしまったようでした。
配列に0が挿入cされた時点でループを抜ける処理を加えたところキチンと動き、出力までできました!
ご協力大変助かりました、ありがとうございました!

閉鎖

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