構造体配列を引数とした関数

[戻る]
cox 2008/09/26(金) 21:57:10
構造体配列を引数とした入力関数を作成していますが、値がうまく構造体のメンバに保
存されません。



typedef struct  wave_info
{
double    amplitude;    
double    freaquency;    
double    initial_phase;                
double    value;
}WAVE_INFOMATION;



int    main(void)
{
WAVE_INFOMATION   Wave[100];
    
Input(Wave,100);

return 0;
}

void Input(WAVE_INFOMATION  *Wave,int imax)
{
    FILE    *InputFile=NULL;
    char    strings1[300],strings2[300];
    double    freaqency_L,freaqency_R;
    int    i;



    InputFile = FileOpen(InputFile,"hoge.txt",'r');

    for(i=0; i<imax; i++)
    fscanf(InputFile,"%lf",&(LeftAM_Wave+i)->amplitude);
}




デバッガで見てみると、fscanfはうまく動作しており、正しい値が代入されていまし
た。どうやらメイン関数に戻る際に、読み込んだ値が保持されていないようです。

何が良くないのでしょうか?

初歩的な質問ではあると思いますが、ご教授いただけると幸いです。

瀬戸っぷ [E-Mail] 2008/09/26(金) 23:37:51
>void Input(WAVE_INFOMATION  *Wave,int imax)
>fscanf(InputFile,"%lf",&(LeftAM_Wave+i)->amplitude);

LeftAM_Waveってナニモノですか?

金魚ちゃん 2008/09/27(土) 07:19:58
>LeftAM_Waveってナニモノですか?
本当。
なに?って感じですよ。

LeftAM_Wave を Wave にすれば動く気がする…。
fscanf( InputFile, "%lf", &Wave[i].amplitude );
で良さそう。

Jason 2008/09/28(日) 14:42:19
こちらでVC6.0でテストしました。
fscanf( InputFile, "%lf", &Wave[i].amplitude );のは正しいと思います。

ITO 2008/09/28(日) 15:21:18
>LeftAM_Waveってナニモノですか?
ひょっとして、
WAVE_INFOMATION   Wave[100];
この「100」をもっと多くしてnew等でメモリー割り当てしたかったとか?
coxさんの説明がないとわかりませんね。
保存する構造体にdoubleを使うのはどうかと思いますが?
double = 浮動小数点ですから、保存するたびに小数点以降の値が変わる
可能性があります。
int等の整数に変換したほうがいいですね。

maru 2008/09/29(月) 09:10:12
> 保存する構造体にdoubleを使うのはどうかと思いますが?
> double = 浮動小数点ですから、保存するたびに小数点以降の値が変わる
> 可能性があります。
意味不明。
小数点以降の値が変わるとどういう不具合になるのでしょうか?

ITO 2008/09/29(月) 09:18:35
> 意味不明。
> 小数点以降の値が変わるとどういう不具合になるのでしょうか?
判定等で問題になることがあります。
エンドユーザーも気にする人がいます。
質問者が問題ないなら、それでいいですが。。。。。。

maru 2008/09/29(月) 09:32:06
おっしゃりたいことは、十進数で表示された値とdoubleの内部表現値が正確に
一致しないことでしょうか?
でしたら、「保存するたびに」という表現は間違いでしょう。

/* まあ私の指摘内容も的を射ていませんが。 */

仲澤@失業者 2008/09/29(月) 10:05:42
まぁ多分やりたいのはこういう事ではないでしょうか。

WAVE_INFOMATION *    tmp = Wave;
for(i=0; i<imax; i++){
  fscanf( InputFile,"%lf",&tmp->amplitude);
  
  tmp++;
}

仲澤@失業者 2008/09/29(月) 10:09:39
スレ主さんやりたいのは多分こういう事ではないでしょうか。

WAVE_INFOMATION *    tmp = Wave;
for(i=0; i<imax; i++){
  fscanf( InputFile,"%lf",&tmp->amplitude);
    :
    :
  tmp++;  // 次のポインタへ移動
}

(コード未検証につき、「意味」だけ汲み取ってね)
ちがったらすまん。

ITO 2008/09/29(月) 10:25:18
> おっしゃりたいことは、十進数で表示された値とdoubleの内部表現値が正確に
> 一致しないことでしょうか?
その通りです。
> でしたら、「保存するたびに」という表現は間違いでしょう。
そうですね。
ただ、毎回、doubleの値を作るたびに変わるので気になっただけです。
このぶんだと小数点何位まで有効にするのかも決めてないですよね。

古いスレッドには追加発言できません。