- ベストアンサー
構造体のリンク?
こんにちは。 超初心者です。 どうぞよろしくお願いしますm(__)m 下記の三つのファイル、コンパイルすると「パブリックシンボル_high、_lowがi.obj、c.objの両方に定義されている」旨のエラーが出てしまいます。 ヘッダファイルに#ifndef~を書くくらいしか見当がつけられない初心者です(T_T) どこをどう直せばいいのか教えてください。 やりたいことは、high->i+high->j、low->i+low->jを関数一つに纏めて、mainから別ファイルに独立させることです。 *********c.h********* #ifndef __c__ #define __c__ struct type{ int i; int j; }*high,*low; extern int f(struct type *temp); #endif *********c.cpp********* #include"c.h" int f(struct type *temp); int f(struct type *temp){ return temp->i+temp->j; } *********i.cpp********* #include<iostream.h> #include"c.h" void main(void){ high->i=10; high->j=30; low->i=100; low->j=300; cout<<f(high)<<","<<f(low)<<endl; }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>この程度のものであれば、実態渡しもポインタ渡しも、速さ的には変わりませんか? うーん、どうなのかな、気にしたことないしな。おそらくそんなにかわらないでしょう。 それよりも、関数へのパラメータについての扱いは入力のみ、入出力、出力のみで 渡すパラメータを実体なのかポインタなのかを統一したほうがよいと思います。 見た目でin/outがわかりますしね。 もちろん入出力、出力のみはポインタ渡し。 入力のみについては実体渡しが一般的でないかと思います。ま、好みによりますが。 今回の場合は、入力のみだったので実体渡しを提案しました。
その他の回答 (4)
- GOGOV
- ベストアンサー率54% (12/22)
int f(struct type *temp) struct type high,low; high.i=10; high.j=30; low.i=100; low.j=300; cout<<f(&high)<<","<<f(&low)<<endl; ↑こんな感じですかね。 f()内で渡されたパラメータを変更しないのであれば、 ポインタ渡しでなく実体渡しでも良いですよ。 int f(struct type temp) f(high);
- GOGOV
- ベストアンサー率54% (12/22)
high,lowを実体化すればよい。 *をなくすのと、 ->を使わないのと、 &をつけてfに渡す。
補足
ありがとうございます。 high,lowの*をなくして、&で渡すということは、high,lowのアドレスをfに渡すことになるんですよね? 宣言は int f(struct type &temp) ですか? その先をどのようにするのかわかりません(T_T)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> どこが間違ってるのでしょうか(T_T) struct type *high,*low; high->i=10; high->j=30; low->i=100; low->j=300; ここ。 初期化されていない(どこを指しているのかわからない)ポインタを使っています。
お礼
できましたー!!! ポインタって難しいですね・・・。 ありがとうございます(^^) 私も早くアドバイスできるくらいになりたいです! 頑張りまス!!
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
ヘッダに high, low を書いてはいけません。多重定義となってしまいます。
お礼
ありがとうございます! なるほど、そういうことだったんですね。 もう一つ、教えていただけますか? 先ほどのものはクリアできたので、今度はf()の関数内で、出力をしたいと思い、下記のように書きなおしました。 今度はコンパイルできるものの、実行時にエラーになってしまいます。 どこが間違ってるのでしょうか(T_T) コンパイラはBorland C++ 5.5.1です。 **********c.h********** #ifndef __c__ #define __c__ #include<iostream.h> struct type{ int i; int j; }; //直しました extern void f(struct type *temp); #endif **********c.cpp********** #include"c.h" void f(struct type *temp); void f(struct type *temp){ cout<<temp->i+temp->j<<endl; //変更 } **********i.cpp********** #include"c.h" void main(void){ struct type *high,*low; high->i=10; high->j=30; low->i=100; low->j=300; f(high); //書き足し f(low); //書き足し // cout<<f(high)<<","<<f(low)<<endl; }
お礼
なるほどー! ありがとうございます。 やっぱりポインタは初心者には理解しにくいですね(^^;; この程度のものであれば、実態渡しもポインタ渡しも、速さ的には変わりませんか?