構造体配列を引数とした関数 – プログラミング – Home

構造体配列を引数とした関数
 
通知
すべてクリア

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


cox
 cox
(@cox)
ゲスト
結合: 16年前
投稿: 1
Topic starter  

構造体配列を引数とした入力関数を作成していますが、値がうまく構造体のメンバに保
存されません。

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はうまく動作しており、正しい値が代入されていまし
た。どうやらメイン関数に戻る際に、読み込んだ値が保持されていないようです。

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

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


引用解決済
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

>void Input(WAVE_INFOMATION *Wave,int imax)
>fscanf(InputFile,%lf,&(LeftAM_Wave+i)->amplitude);

LeftAM_Waveってナニモノですか?


返信引用
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

>LeftAM_Waveってナニモノですか?
本当。
なに?って感じですよ。

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


返信引用
Jason
 Jason
(@Jason)
ゲスト
結合: 16年前
投稿: 26
 

こちらでVC6.0でテストしました。
fscanf( InputFile, %lf, &Wave[i].amplitude );のは正しいと思います。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

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


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

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

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

まぁ多分やりたいのはこういう事ではないでしょうか。

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

スレ主さんやりたいのは多分こういう事ではないでしょうか。

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

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


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました