掲示板利用宣言

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

 私は

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

掲示板2

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

No.26839

データをファイルに出力する関数
投稿者---青葉(2006/05/12 15:46:49)


プログラムを作る過程で
void print_profile_csv (FILE *fp, struct profile *p ,int i) 
{ 
  int k;
  double name,sindou,power,a,b,c,q,x,y,z;
 
  sindou = i/0.020480;
  fprintf(fp,"%f ", sindou);
 
  a = 0.0;
  b = 0.0;
  c = p->id;
  
  for(k=0;k<=1023;k++)
    {
      a = a + c * cos((6.283184 * i * k) / 1024);
      b = b + c * sin((6.283184 * i * k) / 1024); 
    }

  x=a*a;
  y=b*b;
  z=0.00002*0.00002;

  power = z * (x+y);
  q = 10 * log10(power);
  fprintf(fp,"%f\n",q);
}


とし、これを繰り返すようにしたのですが、うまくいきません。
別に、ファイル名を指定して保存んするための関数があるのですが、それをつかって保存んしたところinfなど、おかしな値がでています。
p->idはCSVファイルから読み込んだデータで、iは0から511まで1ずつ増えるように設定しています。しばらく考えててみたのですが、原因がよく分かりませんでした。
どういうことが原因なのでしょうか?

どなたか、よろしくおねがいします!


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:データをファイルに出力する関数 26840 REE 2006/05/12 16:15:55
<子記事> Re:データをファイルに出力する関数 26842 nop 2006/05/12 17:09:20
<子記事> Re:データをファイルに出力する関数 26847 shu 2006/05/12 23:08:05


No.26840

Re:データをファイルに出力する関数
投稿者---REE(2006/05/12 16:15:55)


>とし、これを繰り返すようにしたのですが、うまくいきません。

具体的にどうおかしいのでしょうか?
(こういう値を入力した時に、この値になるはずだが、こういう値になってしまうなど)

>別に、ファイル名を指定して保存んするための関数があるのですが、それをつかって保存んしたところinfなど、おかしな値がでています。

見たところこの関数はファイルに出力しているだけですが、その関数との関係は?
それともこの関数でファイルに出力した結果の話ですか?


この投稿にコメントする

削除パスワード

No.26841

Re:データをファイルに出力する関数
投稿者---青葉(2006/05/12 16:41:09)


コメント、ありがとうございます。

下のような値になるはずですが、
0.000000 -88.127191
48.828125 -120.893178
97.656250 -114.897643
146.484375 -112.613700
195.312500 -108.195623
244.140625 -100.834657


下記のような値になってしまいます。
0.000000 -71.102623
48.828125 -207.069611
97.656250 -210.263587
146.484375 -213.785344
195.312500 -217.307074
244.140625 -inf
292.968750 -229.348001
341.796875 -219.805399


>見たところこの関数はファイルに出力しているだけですが、その関数との関係は?
>それともこの関数でファイルに出力した結果の話ですか?

コマンド分岐関数を使っていて
/* 書き出しコマンド(%W) 
**************************************************** */
void
command_write (struct profile   *p,
           char             *file1) {
  int  n;
  FILE *fp = fopen(file1, "w");

  if (fp == NULL)
    {
      fprintf(stderr, "%W: ファイル「%s」をオープンできません\n", file1);
    } 
  else 
    {
      for (n = 21; n < 533; n++) 
    {
      print_profile_csv(fp, &p[n],i);
      i++;
    }
      fclose(fp);
    }
  printf("ファイルに書き込みました\n");
}



のようになっています。


この投稿にコメントする

削除パスワード

No.26843

Re:データをファイルに出力する関数
投稿者---kafuka(2006/05/12 17:35:39)


> p->idはCSVファイルから読み込んだデータで・・・

とありますが、どのようなデータを読込むのでしょうか?
p->idにどのような値が入っているかが分からないと提示されたソースがおかしいのか、それともそれ以前の部分で問題があるのかの判別もできないです。



この投稿にコメントする

削除パスワード

No.26844

Re:データをファイルに出力する関数
投稿者---青葉(2006/05/12 17:49:31)


>> p->idはCSVファイルから読み込んだデータで・・・
>とありますが、どのようなデータを読込むのでしょうか?
>p->idにどのような値が入っているかが分からないと提示されたソースがおかしいのか、それともそれ以前の部分で問題があるのかの判別もできないです。

コメントありがとうございます。
CSVファイルには以下のようなデータが入っています。
1.36E-02
1.04E-02
7.20E-03
4.80E-03
3.20E-03
0.00E+00
-8.00E-04
-2.40E-03
-4.80E-03
-8.80E-03
-1.12E-02
-1.44E-02
…1023行まで。

これがp->idに入っています。


この投稿にコメントする

削除パスワード

No.26845

Re:データをファイルに出力する関数
投稿者---REE(2006/05/12 18:54:33)


>CSVファイルには以下のようなデータが入っています。
>1.36E-02
>1.04E-02
>7.20E-03
>4.80E-03
>3.20E-03
>0.00E+00
>-8.00E-04

>これがp->idに入っています。

6番目に0があるけど、この時には、aもbも0になってpowerも0
そこにlog10を使っているからinfになるのでしょう。



この投稿にコメントする

削除パスワード

No.26846

Re:データをファイルに出力する関数
投稿者---kafuka(2006/05/12 23:00:04)


既にREEさんが指摘されているように、プログラムは"書かれた通りに"動作しているようです。

で、期待値をどのように算出したかは分かりませんが、1点気になったところ。

>1.36E-02
>1.04E-02
>7.20E-03
>4.80E-03
>3.20E-03
>0.00E+00
>-8.00E-04
>-2.40E-03
>-4.80E-03
>-8.80E-03
>-1.12E-02
>-1.44E-02
>…1023行まで。



>for (n = 21; n < 533; n++) {
> print_profile_csv(fp, &p[n],i);
> i++;
>}

から、
nが21からはじまっていますが、"p[21].id" に入っている値は1行目の "1.36E-02" で間違いないですか?
(期待値は上記の値から算出していますか?)
プログラム中の計算式に間違いがないというのであれば、配列pに格納されている値に"ずれ"があるのかも知れません。


この投稿にコメントする

削除パスワード

No.26842

Re:データをファイルに出力する関数
投稿者---nop(2006/05/12 17:09:20)


まず、単純なプログラムでprint_profile_csv()単体の時の動作は確認しましたか?
int  main(void)
{
    struct profile  data = { /* 試験データ */ };
    FILE  *fp;

    fp = fopen( "hoge", "w" );
    print_profile_csv( fp, &data, 0 );
    fclose( fp );

    return 0;
}

などの様に、簡単な試験プログラムで、
print_profile_csv()単体で正しく動作する様にして下さい。


それが終わったら、正しくなったprint_profile_csv()で、
元のプログラムを実行してみて下さい。
それでも、結果がおかしい場合は、
print_profile_csv()を呼ぶ前の処理に誤りがあります。


とりあえず、デバッガでステップ実行して、
各変数の値が思った通りに変化しているかどうか?
位は確認しましょう。


この投稿にコメントする

削除パスワード

No.26847

Re:データをファイルに出力する関数
投稿者---shu(2006/05/12 23:08:05)


//
//  proguram sample
//
/*
    1.  取りあえずファイル出力は保留。
    2.  sindouを求める関数とqを求める関数をつくる。
    
        値を求める式:関数内の主な処理
        式に使われる変数:引き数
        式の解:returnする値
        
    3.  画面に出力、printf( "%f,%f\n", get_sindou(), get_q() );
        (リダイレクトを使えば、ファイルでの確認もできます。)
    4.  ファイル出力、3.のプログラムをfprintf()形式に変更すれば・・・・・・
    
    *.  定数は#defineやconstしましょう。
    
    値がおかしいのは、
    
        元のデータがおかしい
        計算がおかしい、
        引き数や出力指定の型に対しての、データの型がおかしい
        
    などが、考えられます。
*/

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

//
#define N   511
#define N2  1024

//
struct profile
{
    int id; //  変数名からint型だと仮定
    
    //  その他の変数
};

//
double get_sindou( int i )
{
    double sindou;
    
    //  省略
    
    return sindou;
}
double get_q( int id, int i )
{
    double q;   //  qってなに?
    
    //  省略
    
    return q;
}

//
int main( void )
{
    struct profile data[N]; //  適当
    int i;
    
    //
    for (i = 0; i < N; i++)
    {
        //  print_profile_csvの代わり
        printf( "%f %f\n",
            get_sindou( i ), get_q( data[i].id, i ) );
    }
    
    return 0;
}



この投稿にコメントする

削除パスワード

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