掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29279

コマンドラインからの引数(小数)渡しについて
投稿者---yoshi(2006/12/22 19:08:25)


 現在、コマンドラインから引数を渡してプログラムを実行使用としているのですが、上手く行きません。コンパイラはとおるのですが、実行結果が正しく出力されません。
 コマンドプロンプトから以下のように実行しようとしています。

実行ファイル名 読み込みファイル名 出力ファイル名 小数値

 小数値を一度、変数に代入してから、他の関数に送ろうとしているのですが、結果が上手く出てきません。
読み込みファイルと、出力ファイルの場合だけですと、(小数値はコマンドプロンプトからではなく、プログラム内で設定)上手く動きます。

どなたかコマンドラインから引数(小数)を入力して、その小数を他の関数に引数として渡す上手いやり方をご存知の方は教えていただけないでしょうか?
よろしくお願いいたします。

・「この下が問題となっています」の引数のところが上手く行きません。  


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

#define FNAME_B "file_siml.csv"
#define MAX 10000

/* 構造体の定義 */
typedef struct data_line{

int file; /* ファイル名 */
long word; /* 単語名 */
double weight; /* tfidf値 */

} data_line;


/* 関数のプロトタイプ宣言 */
int get_data(char* buf, int* a, long* b, double* c);
int calc_siml(data_line dat[], long n);
int calc_dis(data_line dat[], long n, double temp);


/* main関数 */
int main(int argc, char *argv[]){

/* 変数の宣言 */
FILE* fp_a;
FILE* fp_b;
FILE* fp_c;
char buf[256];
data_line dat[MAX];
long cnt; /* 行の総数 */
int file;
long word;
double weight;
double temp;

if(argc != 4){
printf("引数の数が違います。\n");
exit(1);
}


fp_a = fopen(argv[1], "r");
if ( fp_a==NULL )
{
printf("ファイルオープンに失敗しました\n");
return 1;
}

/* 変数の初期化 */
cnt = 0;

/* ファイルから1行分のデータを読み込む */
while (fgets(buf, 256, fp_a) != NULL)
{
/* データの取り出し */
get_data(buf, &file, &word, &weight);

/* 構造体にデータを代入 */
dat[cnt].file = file;
dat[cnt].word = word;
dat[cnt].weight = weight;

/* 配列がオーバーしていないか? */
cnt = cnt + 1;
if (cnt >= MAX)
{
printf("配列の最後に到達しました。\nファイルの読み込みを中止します。\n");

break;
}
}

/* ファイルを閉じる */
fclose(fp_a);

fp_b = fopen(FNAME_B, "a");
if ( fp_b==NULL )
{
printf("ファイルオープンに失敗しました\n");
return 1;
}


/* 類似度を求める */
calc_siml(dat, cnt);

/* ファイルを閉じる */
fclose(fp_b);


fp_c = fopen(argv[2], "a");
if ( fp_c==NULL )
{
printf("ファイルオープンに失敗しました\n");
return 1;
}

/***************************************** この下が問題となっています *********************************/
temp = atof(argv[3]);
printf("temp %f\n",temp);

/* クラスタリングを行う */
calc_dis(dat, cnt, temp);

/* ファイルを閉じる */
fclose(fp_c);

return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:コマンドラインからの引数(小数)渡しについて 29280 Yanks 2006/12/22 19:40:26


No.29280

Re:コマンドラインからの引数(小数)渡しについて
投稿者---Yanks(2006/12/22 19:40:26)


>temp = atof(argv[3]);
>printf("temp %f\n",temp);

この時点でのtempの値は、思ったとおりですか?

>/* クラスタリングを行う */
>calc_dis(dat, cnt, temp);

calc_dis関数のコードを見ないことには、何が問題で
どうすれば解決するのか、見当がつきません。


この投稿にコメントする

削除パスワード

No.29281

Re:コマンドラインからの引数(小数)渡しについて
投稿者---yoshi(2006/12/22 20:14:55)


>>temp = atof(argv[3]);
>>printf("temp %f\n",temp);
>
>この時点でのtempの値は、思ったとおりですか?
>
>>/* クラスタリングを行う */
>>calc_dis(dat, cnt, temp);
>
>calc_dis関数のコードを見ないことには、何が問題で
>どうすれば解決するのか、見当がつきません。

はい、main関数の上の時点でのtempの値は入力したとおりに、printfで出力されました。
あと、calc_dis関数内のtempの値も入力した値と同じでした。
calc_dis関数は小数値(temp)を引数として渡さなかった場合、上手く動いていたので、貼っていませんでした。すみません。
下にcalc_dis関数を載せます。


/* calc_dis関数 */
int calc_dis( data_line dat[], long n, double temp)
{
/* 変数の宣言 */
FILE* fp_c;
int cluster[CLUSTER][CLUSTER_LT]; /* クラスタ番号、クラスタ内のデータ番号 */
long cnt_1; /* カウンタ1(比較値) */
long cnt_2; /* カウンタ2(クラスタ内のデータ値) */
long cnt_3; /* カウンタ3 */
long cntlt_1; /* カウンタ1の終わり値 */
long cntlt_2; /* カウンタ2の終わり値 */
double dis; /* 比較値とクラスタ内のデータとの距離 */
long i; /* クラスタ操作値1 クラスタ存在数(変化有り) */
long j; /* クラスタ操作値2 */
long comp; /*  比べる素子 比較(Comparison) */
double a; /* クラスタ毎の比較データとの距離 */
double d; /* クラスタ毎の比較データとの距離の最小値 */
long f; /* 距離最小値のクラスタ番号 */
double h; /* クラスタ内のデータ数 */
double l[CLUSTER]; /* dis[CLUSTER] 一時的な置き場(クラスタ毎の距離) */

printf("temp2 %f\n",temp);

/* 変数の初期化 */
cnt_1 = 0;
cnt_2 = 0;
i = 0;
j = 0;
comp = 2;
h = 0;
cluster[i][j] = 1;
dis = 0;
a = 0;



/* クラスタリング */
while(comp <= dat[n-1].file)
{
while(cluster[i][j] != 0)
{

while(cluster[i][j] != 0)
{
while (comp > dat[cnt_1].file)
{
cnt_1 = cnt_1 + 1;
}

cntlt_1 = cnt_1;

while (dat[cnt_1].file == dat[cntlt_1].file) /* cnt_1の上限(終わり値)の設定 */
{
cntlt_1 = cntlt_1 + 1;
}
while (cluster[i][j] > dat[cnt_2].file)
{
cnt_2 = cnt_2 + 1;
}

cntlt_2 = cnt_2;

while (dat[cnt_2].file == dat[cntlt_2].file) /* cnt_2の上限(終わり値)の設定 */
{
cntlt_2 = cntlt_2 + 1;
}

while(cnt_1 < cntlt_1) /* cnt_1を基準にcnt_2との距離を計算 */
{
if (dat[cnt_2].word > dat[cnt_1].word)
{
cnt_1 = cnt_1 + 1;
}
else if(dat[cnt_2].word < dat[cnt_1].word)
{
cnt_2 = cnt_2 + 1;
}
else{


dis = dis + pow((dat[cnt_1].weight - dat[cnt_2].weight),2); /* kとの距離の計算 */
cnt_1 = cnt_1 + 1;
cnt_2 = cnt_2 + 1;



}
if(dat[cnt_2].file == dat[cntlt_2].file)
{
cnt_2 = cnt_2 - 1;

if(dat[cnt_1].file == dat[cntlt_1].file)
{
break;
}

cnt_1 = cnt_1 + 1;
continue;
}


}

a = a + sqrt(dis);
j = j + 1;
h = h + 1;
dis = 0;
cnt_1 = 0;



if(j > CLUSTER_LT)
{
printf("クラスターの要素数が限界を超えました。\n");
break;
}
}

l[i] = a / h;

j = 0;
i = i + 1;
cnt_2 = 0;
h = 0;
a = 0;


if(i > CLUSTER)
{
printf("クラスターの総数が限界を超えました。\n");
break;
}

if(j > CLUSTER_LT)
{
printf("クラスターの要素数が限界を超えました。\n");
break;
}
}


cnt_3 = 0;
f = 0;
d = l[cnt_3];
while(cnt_3 < i)
{

if (l[cnt_3] < d)
{
d = l[cnt_3];
f = cnt_3;
}

cnt_3 = cnt_3 + 1;
}





j = 0;
if(temp > d) /******************** ここに代入しています ***********************/
{
while(cluster[f][j] != 0)
{
j = j + 1;

}

cluster[f][j] = comp;
}
else{
while(cluster[j][0] != 0)
{
j = j + 1;

}

cluster[j][0] = comp;
}


comp = comp + 1;
i = 0;
j = 0;
}

while(cluster[i][j] != 0)
{
while(cluster[i][j] != 0 )
{
fprintf(fp_c, "%d,", cluster[i][j]);
j = j + 1;


}

fprintf(fp_c, "\n");
j = 0;
i = i + 1;

}

return 0;
}



この投稿にコメントする

削除パスワード

No.29282

Re:コマンドラインからの引数(小数)渡しについて
投稿者---Yanks(2006/12/22 21:07:40)


コードを何とかして読み解こうとしましたが、
力及ばず敗れ去りました。
申し訳ありません。


この投稿にコメントする

削除パスワード

No.29283

Re:コマンドラインからの引数(小数)渡しについて
投稿者---near(2006/12/22 22:09:44)


calc_dis内で、fp_cがなにも代入されずに使われています。
その他が原因なら入力ファイルの内容すらわからないのでどうしようもありません。


この投稿にコメントする

削除パスワード

No.29284

Re:コマンドラインからの引数(小数)渡しについて
投稿者---rvr_driver(2006/12/22 22:15:10)


>あと、calc_dis関数内のtempの値も入力した値と同じでした。

ということはきちんとコマンドラインの引数がcalc_dis関数に
渡されていると確認できているので題名とは違うところで
問題になっているように思います。

そもそもcalc_dis関数に期待している結果とうまくいかなかった結果
は何ですか?

# 【掲示板利用宣言】をきちんと理解されていますか?
# ソースの添付は「HTML変換ツール」で字下げしましょう。
# 環境(OSとコンパイラ)や症状は具体的に詳しく書きましょう。



この投稿にコメントする

削除パスワード

No.29285

Re:コマンドラインからの引数(小数)渡しについて
投稿者---yoshi(2006/12/23 00:11:52)





>>コードを何とかして読み解こうとしましたが、
力及ばず敗れ去りました。
申し訳ありません。

・Yanksさん、自分で言うのもなんですが、見にくい物を読み解こうとしてくれてありがとうございます。投稿の際に、規約にチェックをしたにもかかわらず、字下げツールを使わずに張ってしまったので、本当に読みにくかったと思います。次の投稿にツールを利用したソースを張るので、よかったらご指導お願いします。


>>calc_dis内で、fp_cがなにも代入されずに使われています。
その他が原因なら入力ファイルの内容すらわからないのでどうしようもありません。

・nearさん、fp_cはcalc_dis内でfprintfで出力する際のファイルポインタ代わりとしております。出力先はmain関数内の出力ファイル(argv[2])となっています。calc_dis内で使わないと、未定義のファイルポインタとなるので、使用しています。入力ファイルの内容なども以下に書きたいと思います。どうかよろしくお願いいたします。


>>そもそもcalc_dis関数に期待している結果とうまくいかなかった結果
>>は何ですか?
>
>># 【掲示板利用宣言】をきちんと理解されていますか?
>># ソースの添付は「HTML変換ツール」で字下げしましょう。
>># 環境(OSとコンパイラ)や症状は具体的に詳しく書きましょう。

・rvr_driverさん、言葉足らずで申し訳ありません。
規約についても申し訳ありません。字下げツールを使わずソースを貼り付けてしまいました。
このプログラムなのですが、入力ファイルと出力ファイルは共にCSV形式のファイルです。そして、入力ファイルから構造体にデータを代入し、calc_siml関数とcalc_dis関数によって計算したものをそれぞれファイルに書き込んで出力するというものです。

argv[1]入力ファイル
2 , 422 , 0.06166307103
2 , 427 , 0.0460933529
2 , 508 , 0.06398731459
2 , 670 , 0.05378111277
2 , 688 , 0.04475855845
2 , 696 , 0.05747513455
2 , 724 , 0.006998436844

argv[2] 出力ファイル
1,7,13,20,27,41,63,68,90,95,
2,4,11,23,25,43,45,65,70,75,76,83,85,88,94,97,
3,12,22,44,52,56,99,
5,10,18,39,42,66,81,87,96,
6,14,16,21,30,54,79,86,92,
8,9,15,29,55,74,82,
17,35,38,49,51,59,69,98,
19,34,47,60,64,67,71,73,78,89,
24,31,40,46,58,
26,36,50,53,100,
28,32,48,57,72,77,84,91,
33,37,61,62,
80,93,

上の出力ファイルが上手く言った状態になります。
(これは、ファイルはコマンドラインから引数として渡して、argv[3]の小数値はプログラムにそのまま書き込んでいました。)
駄目な場合は、ファイルは作成されるのですが、「ファイルが読み込めません」と出ます。その場合、0byteのファイルが作成されます。
環境 OS;WindowsMe
   コンパイラ;Borland C++5.5


本文がオーバーするので、次の投稿に字下げツールを使用したcalc-dis関数を改めて張りたいと思います。


この投稿にコメントする

削除パスワード

No.29286

Re:コマンドラインからの引数(小数)渡しについて
投稿者---yoshi(2006/12/23 00:13:38)


calc-dis関数になります。


/* calc_dis関数 */
int calc_dis( data_line dat[], long n, double temp)
{
  /* 変数の宣言 */
  FILE* fp_c;
  int cluster[CLUSTER][CLUSTER_LT];   /* クラスタ番号、クラスタ内のデータ番号 */
  long cnt_1;         /* カウンタ1(比較値) */
  long cnt_2;                 /* カウンタ2(クラスタ内のデータ値) */
  long cnt_3;         /* カウンタ3 */
  long cntlt_1;        /* カウンタ1の終わり値 */
  long cntlt_2;        /* カウンタ2の終わり値 */
  double dis;         /* 比較値とクラスタ内のデータとの距離 */
  long i;          /* クラスタ操作値1 クラスタ存在数(変化有り) */
  long j;          /* クラスタ操作値2 */
  long comp;                  /*  比べる素子 比較(Comparison) */
  double a;         /* クラスタ毎の比較データとの距離 */
  double d;         /* クラスタ毎の比較データとの距離の最小値 */
  long f;          /* 距離最小値のクラスタ番号 */
  double h;         /* クラスタ内のデータ数 */
  double l[CLUSTER];              /* dis[CLUSTER] 一時的な置き場(クラスタ毎の距離) */
  
  printf("temp2 %f\n",temp);

  /* 変数の初期化 */
  cnt_1 = 0;
  cnt_2 = 0;
  i = 0;
  j = 0;
  comp = 2;
  h = 0;
  cluster[i][j] = 1;
  dis = 0;
  a = 0;
  
  /* クラスタリング */
  while(comp <= dat[n-1].file)
  {
    while(cluster[i][j] != 0)
    {
      
      while(cluster[i][j] != 0)
      {
        while (comp > dat[cnt_1].file)
        {
          cnt_1 = cnt_1 + 1;
        }
        
        cntlt_1 = cnt_1;
          
        while (dat[cnt_1].file == dat[cntlt_1].file)    /* cnt_1の上限(終わり値)の設定 */
        {
          cntlt_1 = cntlt_1 + 1;
        } 
        while (cluster[i][j] > dat[cnt_2].file)
        {
          cnt_2 = cnt_2 + 1;
        }
      
        cntlt_2 = cnt_2;
      
        while (dat[cnt_2].file == dat[cntlt_2].file)    /* cnt_2の上限(終わり値)の設定 */
        {
          cntlt_2 = cntlt_2 + 1;
        }
        
        while(cnt_1 < cntlt_1)                /* cnt_1を基準にcnt_2との距離を計算 */
        {
          if (dat[cnt_2].word > dat[cnt_1].word)
          {
            cnt_1 = cnt_1 + 1;
          } 
          else if(dat[cnt_2].word < dat[cnt_1].word)
          {
            cnt_2 = cnt_2 + 1;  
          }
          else{
            dis = dis + pow((dat[cnt_1].weight - dat[cnt_2].weight),2);  /* kとの距離の計算 */
            cnt_1 = cnt_1 + 1;
            cnt_2 = cnt_2 + 1;  
          }
          if(dat[cnt_2].file == dat[cntlt_2].file)
          {
            cnt_2 = cnt_2 - 1;
          
            if(dat[cnt_1].file == dat[cntlt_1].file)
            {
              break;
            }
              
            cnt_1 = cnt_1 + 1;  
            continue;
          }
                    
        }

        a = a + sqrt(dis);
        j = j + 1;
        h = h + 1;
        dis = 0;
        cnt_1 = 0;
        
        if(j > CLUSTER_LT)
        {
          printf("クラスターの要素数が限界を超えました。\n");
          break;
        } 
      }

      l[i] = a / h;

      j = 0;
      i = i + 1;
      cnt_2 = 0;
      h = 0;
      a = 0;
      
      if(i > CLUSTER)
      {
        printf("クラスターの総数が限界を超えました。\n");
        break;
      }
      
      if(j > CLUSTER_LT)
        {
          printf("クラスターの要素数が限界を超えました。\n");
          break;
        } 
    }

    cnt_3 = 0;
    f = 0;
    d = l[cnt_3];
    while(cnt_3 < i)
    {
      if (l[cnt_3] < d)
      {
        d = l[cnt_3];
        f = cnt_3;
      }
      
      cnt_3 = cnt_3 + 1;  
    }

    j = 0;
    if(temp > d)   /******************** ここに代入しています ***********************/
    {
      while(cluster[f][j] != 0)  
      {
        j = j + 1;
      }
      
      cluster[f][j] = comp;
    }
    else{
      while(cluster[j][0] != 0) 
      { 
        j = j + 1;

      }
      
      cluster[j][0] = comp;
    }
    
    comp = comp + 1;
    i = 0;
    j = 0;
  }

  while(cluster[i][j] != 0)
  { 
    while(cluster[i][j] != 0 )
    { 
      fprintf(fp_c, "%d,", cluster[i][j]);
      j = j + 1;
    }
    
    fprintf(fp_c, "\n");
    j = 0;
    i = i + 1;
    
  }

  return 0;
}
  




この投稿にコメントする

削除パスワード

No.29288

Re:コマンドラインからの引数(小数)渡しについて
投稿者---Yanks(2006/12/23 00:35:59)


>fp_cはcalc_dis内でfprintfで出力する際の
>ファイルポインタ代わりとしております。
>出力先はmain関数内の出力ファイル(argv[2])となっています。

とのことですが、calc_dis関数のfp_cもmain関数のfp_cも
それぞれの関数内のローカル変数であり、
なおかつ、calc_dis関数の引数でもありません。

【結論】main関数からcalc_dis関数へ、fp_cの情報は渡っていません。



この投稿にコメントする

削除パスワード

No.29289

Re:コマンドラインからの引数(小数)渡しについて
投稿者---Yanks(2006/12/23 01:02:19)


つまり、calc_dis関数では、fopenでオープンしていない
fp_cを使ってファイル操作をしています。
それがマズい、というのがnearさんのご指摘です。


この投稿にコメントする

削除パスワード

No.29290

Re:コマンドラインからの引数(小数)渡しについて
投稿者---yoshi(2006/12/23 01:19:50)


>>fp_cはcalc_dis内でfprintfで出力する際の
>>ファイルポインタ代わりとしております。
>>出力先はmain関数内の出力ファイル(argv[2])となっています。
>
>>とのことですが、calc_dis関数のfp_cもmain関数のfp_cも
>>それぞれの関数内のローカル変数であり、
>>なおかつ、calc_dis関数の引数でもありません。
>
>>【結論】main関数からcalc_dis関数へ、fp_cの情報は渡っていません。


はい、最初(ファイル名は#define 入力ファイル、小数値も#define 0.1などで定義していたとき)はcalc_dis関数からファイルを開いていたのですが、その時は、コマンドラインから出力ファイル名(argv[2]にあたる)を入力して、そのmain関数の引数をcalc_dis関数の引数に渡そうと思っていました。

ですが、上手くいかなかったので、main関数にファイルを開くプログラムを持ってきて、コマンドラインからの引数に対応しようとしました。
しかし、calc_dis関数内のfprintfのファイルポインタfp_cが未定義というエラーとなったため、ファイルポインタfp_cを新たに定義したところ、コンパイラも通り、main関数内の出力ファイル(argv[2])に実行結果が上手く書き込まれてしまいました。

これについては、自分でもよく原理がわかっていないので、説明が出来ないです。申し訳ありません。



この投稿にコメントする

削除パスワード

No.29291

Re:コマンドラインからの引数(小数)渡しについて
投稿者---rvr_driver(2006/12/23 07:53:20)


変数を参照できる範囲についてを参照してみてください
第12章 記憶クラス

まず、この質問に関する回答です。
main関数で定義したfp_cの情報はcalc_disでいきなり使っても使用できません。
使用する方法として
 1.fp_cをcalc_disの引数として使用する
 2.fp_cを外部変数として使用する
があり、今回の解決方法として一番手っ取り早いのがfp_cを外部変数で
定義する方法です。

FILE* fp_c;

int main(int argc, char *argv[])
{
    /* 変数の宣言 */
    /*FILE* fp_c;*/

    return 0;
}

int calc_dis( data_line dat[], long n, double temp)
{
    /* 変数の宣言 */
    /*FILE* fp_c;*/
    return 0;
}



ここからは本質的な問題に関する回答です。
これで解決するにはするのですが個人的にあまりお勧めしません。
理由として
・安易な考えで外部変数を使用することになってしまう。
 →理由は長くなるのであえて説明はしません。
  本やネットで調べたり人に聞いたりしてみてください。
・設計という面からするとcalc_dis関数内でファイルに書き込む処理
 はいかがなものか。
 →calc_dis関数本来の機能以外のファイルに書き込む処理をさせています。
  計算結果を表示したり、ファイルに書き出す処理は機能が別なので
  別個の処理とすると処理の切り分けができて、判り易くなります。

以上の理由より個人的な意見として
calc_dis関数は計算するためのデータを引数として渡してもらい
計算した結果を引数で返す方法が最適だと思います。



この投稿にコメントする

削除パスワード

No.29292

Re:コマンドラインからの引数(小数)渡しについて
投稿者---Yanks(2006/12/23 10:37:33)


main関数およびcalc_dis関数の、fp_cについて行なっているのと
同じようなことをしているコードを書いてみました。
変数aが相当します。

main関数でaに値を代入しています。main関数でファイルをオープンし、
fp_cに値を代入することに相当します。

次に、func関数を呼び出しています。aとは別のnはfunc関数の引数ですが、
aは引数ではありません。calc_dis関数を呼び出していることに相当します。

func関数に書いているaは、main関数のaとは「別のもの」です。
したがって、引数としているnの値は正しく受け渡していますが、
aの値はmain関数で代入した値とは別になっています。

関数内のローカル変数は、名前が同じでも全く別のものであることが
わかるでしょうか。
#include <stdio.h>

void func(int n)
{
    int a;
    
    printf("【func】n=%d, a=%d\n", n, a);
}

int main(void)
{
    int n, a;
    
    n = 123;
    a = -23456;
    printf("【main】n=%d, a=%d\n", n, a);
    func(n);
    return 0;
}






この投稿にコメントする

削除パスワード

No.29293

Re:コマンドラインからの引数(小数)渡しについて
投稿者---榊(2006/12/23 11:58:45)


単に引数に書込み用ファイルポインタを渡すようにすればいいのでは?

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

#define MAX 10000

/* 構造体の定義 */
typedef struct data_line {
    int file;      /* ファイル名 */
    long word;    /* 単語名 */
    double weight;  /* tfidf値 */
} data_line;


/* 関数のプロトタイプ宣言 */
int calc_dis(data_line[], long, double, FILE*);

/* main関数 */
int main(int argc, char *argv[])
{
    /* 変数の宣言 */
    FILE* fp_r;
    FILE* fp_w;
    char buf[256];
    long cnt;   /* 行の総数 */

    double arg_dbl;

    int file;
    long word;
    double weight;
    data_line dat[MAX];

    if (argc != 4) {
        printf("引数の数が違います。\n");
        return -1;
    }

    fp_r = fopen(argv[1], "r");
    if (fp_r == NULL) {
        printf("ファイルオープンに失敗しました。[%s]\n", argv[1]);
        return -1;
    }

    /* 変数の初期化 */
    cnt = 0;
    /* ファイルから1行分のデータを読み込む */
    while (fgets(buf, sizeof(buf), fp_r) != NULL) {
        /* データの取り出し */
        /* get_data()の内容が分からないのでとりあえず適当な数値を代入しておく */
        file = 12345;
        word = 67890;
        weight = 0.123;

        /* 構造体にデータを代入 */
        dat[cnt].file = file;
        dat[cnt].word = word;
        dat[cnt].weight = weight;

        /* 配列がオーバーしていないか? */
        cnt++;
        if (MAX <= cnt) {
            printf("配列の最後に到達しました。\nファイルの読み込みを中止します。\n");
            break;
        }
    }
    /* ファイルを閉じる */
    fclose(fp_r);

    /* calc_siml()が何をやっているか知らないがとりあえず無視 */

    fp_w = fopen(argv[2], "a");
    if (fp_w == NULL) {
        printf("ファイルオープンに失敗しました。[%s]\n", argv[2]);
        return -1;
    }
    arg_dbl = atof(argv[3]);
    printf("arg_dbl %f\n", arg_dbl);

    /* クラスタリングを行う */
    calc_dis(dat, cnt, arg_dbl, fp_w);

    /* ファイルを閉じる */
    fclose(fp_w);

    return 0;
}

/* calc_dis関数 */
int calc_dis(data_line dat[], long arg_cnt, double arg_dbl, FILE* arg_fp)
{
    int i;

    printf("calc_dis:arg_cnt=%d\n", arg_cnt);
    printf("calc_dis:arg_dbl=%lf\n", arg_dbl);

    if (arg_fp == NULL) {
        printf("fp is NULL\n");
        return -1;
    }
    for (i = 0; i < arg_cnt; i++) {
        printf("%04d : %d, %ld, %lf\n", i, dat[i].file, dat[i].word, dat[i].weight);
        fprintf(arg_fp, "%04d : %d, %ld, %lf\n", i, dat[i].file, dat[i].word, dat[i].weight);
    }

    return 0;
}



この投稿にコメントする

削除パスワード

No.29294

Re:コマンドラインからの引数(小数)渡しについて
投稿者---yoshi(2006/12/23 17:55:41)


>>rvr_driverさん
外部変数の使い方での解決方法やプログラムの改良点を教えていただき、ありがとうございました。ファイルの処理については、初めて知ったのでこれから調べて改良していきたいと思います。

>>Yanksさん
ローカル変数がそれぞれの関数内で同じ名前でも別の関数として働くことなど、ローカル変数の使い方について教えていただきありがとうございます。非常にわかりやすかったです。

>>榊さん
榊さんが書き込んだソースを参考にさせていただきました。
ファイルポインタを関数に送ることによって、データがエラーにならず、無事に動きました。ありがとうございます。

変数の認識とファイルポインタの使い方が、やはりまずかったのだと思います。
書き込んでくれて、教えていただいた方々は、本当にありがとうございました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧