1 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:18:18 ] プログラミング言語C/C++についての、小心者向けスレです。質問・要望・雑談などどうぞ。 関連スレやURLは>>2 以降。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・ぐぐる ・マニュアルで探す ・FAQを読む 例えば www.bohyoh.com/CandCPP/FAQ/index.html 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(なるべくそのままで) ・実行環境(OS名、コンパイラ名) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は小心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって小心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。 宗教的な話題は禁止します。
910 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 22:30:11 ] >>909 正直議論の意味というか、何にこだわってるのか、何を知りたいのか 全く理解できんのだけど…… magick++を使ったことは無いのでわからんが、まあ、そう言ってしまえば 何だってそうだといえるだろうさ 画像処理で言うと、ファイルフォーマット内のバイトオーダーは ライブラリによって隠蔽されるケースは多いと思う が、ライブラリにロードしてもらった32bitラスタ画像のピクセルフォーマットが ARGBかBGRAか、といったことは、ピクセルを弄る場合には結局必要になるわけだ
911 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 22:54:34 ] picture[y][x].a = 〜 みたいに使えるんでないの? ロードの処理が重くなりそうだが。
912 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 23:01:06 ] >>911 一瞬意味が分からなかった、その.aはARGBのAか まあ、そういう実装は可能だろうね Cだと PutPixel(point, a, r, g, b) のような関数ないしマクロを使うんだろう
913 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 23:13:43 ] >>910 画像処理と言ってもライブラリを使える場合もあるから 「必ずエンディアンの問題は出てくる」ということも無いということだよ magick++ とかを使ってできることをわざわざ車輪を再発明する事もない場合も多いし 具体的にピクセルをどう弄りたいわけ?
914 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 01:45:40 ] >>913 ああ、要するに「必ず」は言いすぎだろ、という突っ込みか 確かに言い過ぎたね
915 名前:デフォルトの名無しさん [2010/03/19(金) 12:22:01 ] Windowsでカレントディレクトリを取得する方法を教えてください
916 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 12:36:42 ] GetCurrentDirectory()
917 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 23:45:49 ] 失礼します。 C++を勉強中の初心者です。 ポインタを関数の戻り値する場合は関数内の宣言にstaticをつけなければならないという記述をよく目にするのですが、 以下のようにstaticをつけずにHoge hを宣言しても問題なくプログラムが動き、5が出力されます。どういうことなのでしょうか。 typedef struct{ int k; } Hoge; Hoge* func(int a) { Hoge h; h.k = a; return &h; } int main() { Hoge* h = func(5); cout << h->k; }
918 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 23:59:25 ] >>917 Hoge h がスタック上に作られている場合、関数から帰ってきた 直後は問題ない可能性が高いが、もう1回func()を呼んだり 別の関数を呼んだりすると、おかしくなる可能性がある。
919 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:02:59 ] >>917 動くのはたまたまです 試しに、func(5) のあとに別の関数を呼んでみてください 別の結果になると思います
920 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:16:44 ] なるほど たしかにおっしゃるとおりの事態が起きました。 ありがとうございます。 あと実はこのことに直接関わるかはわからないのですが、 別のプログラムにおいて、同じように構造体のポインタを戻り値とする関数をつくって内部の宣言をstatic有りと無しどちらも試したところ、 staticをつけた方はmainを抜けるところで停止してしまいます。 関係があるのかどうかよくわかりませんが、もし心当たりがありましたらお教えいただけると幸いです。
921 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:23:11 ] >>920 ソースをcodepadに貼れ 言ってる事がよくわからない
922 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:25:57 ] >>920 そんなことで悩むぐらいならポインタでなく実体を返せばいいと思う Hoge func(int a) { Hoge h; h.k = a; return h; }
923 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 01:30:09 ] >>922 構造体の配列を返したかったので・・・ すみませんどうやら別のところで引っかかっていたようで、今解決しました。 どうもお騒がせしましてすみません。
924 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 03:13:39 ] つーか根本的に関数側で確保した構造体のポインタを返すのがキモイ 呼び出し側で(空でいいから)構造体を用意して、そのポインタを関数に渡して、 関数側はその渡されたポインタで構造体の中身を加工する、っつーのが普通だし、 そういう設計ならポインタを返す必要も無いしstaticも要らないし、static無しで ポインタ返しても別に問題無い 何でそうなるかが分からんようだと辛い
925 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 09:22:50 ] >>924 関数側で確保した構造体のポインタじゃなくて構造体を返すのもダメ?
926 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 10:41:34 ] >>924-925 (コピーのオーバーヘッドはおいといて)1個の構造体や、固定長の構造体配列ならそれでもいいんじゃないの? 任意個数の配列をポインタではなく値で返す方法ってのを俺は知らないのだけど、どんなのがある? >>920 staticつけないのは論外として、つけてもポインタの指し示す先が共有されていることは理解してる? int *func(int n){ static int a; a=n; return &a; } int main(void){ int a,b; a=func(1); b=func(2); printf("a = %d, b = %d\n", a, b); /* a = 2, b = 2 */ return 0; }
927 名前:926 mailto:sage [2010/03/28(日) 10:42:50 ] ごめ、すっとぼけてた。 int main(void){ int *a,*b; a=func(1); b=func(2); printf("*a = %d, *b = %d\n", *a, *b); /* *a = 2, *b = 2 */ return 0; }
928 名前:925 mailto:sage [2010/03/28(日) 13:39:27 ] デザインの問題だけどたとえば何かデータをファイルから読むとか 与えたデータから新しいデータを作るというときに const vector<double> parseData(double x,vector<double> v,...){ vector<double> v1; …vector 領域確保して,データを料理してv1に入れる… return v1; } int main(){ ... vector<double> vData(paseData(x,v,...)); } みたいなのはなぜいかんのかなと思って void parseData(vector<double>&v1,double x,vector<double> v,...){ …vector 領域確保して,データを料理してv1に入れる… } int main(){ vector<double> vData; paseData(vData,x,v,...); } みたいに必ず書かなきゃいかんのかな?(確かに昔Fortranとかはいつもこういう スタイルだったなぁ) 個人的には前者の方が直感的だけど 簡単のため vector の例にしたけどもちろん自分で定義したデータ class でも同じこと
929 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 13:40:41 ] コピーが発生したら嫌じゃん
930 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 15:38:13 ] コピーのコストが問題にならない状況でなら、その手も使った。
931 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:47:51 ] 関数内でnewしてshared_ptrで返せばいいよ
932 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 17:06:34 ] #include <vector> #include <memory> #include <iostream> using namespace std; using namespace std::tr1; shared_ptr<vector<double> > parseData(double x){ shared_ptr<vector<double> > v1(new vector<double>); v1->push_back(x); return v1; } int main(){ shared_ptr<vector<double> > vData(parseData(1.5)); cout << vData->at(0) << endl; }
933 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:14:03 ] 何でstatic付けると助かるのかを理解しない限り、いくらでも似たような問題で 引っ掛かると思われ
934 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:24:01 ] #include <iostream> #include <vector> using namespace std; int sum(vector<int> vec){ int ammount = 0; for(vector<int>::iterator it = vec.begin();it != vec.end(); ++it){ ammount += *it; } return ammount; } // 2ch行数制限回避 int main() { vector<int> v; v.push_back(1);v.push_back(2);v.push_back(3); cout << sum << endl; // 表示結果: 6 } はいいんだけど、sumを template <class T, T zero> T sum(vector<T> vec) { T ammount = zero; for(vector<T>::iterator it = vec.begin();it != vec.end(); ++it){ ammount += *it; } return ammount; } にして、main中のcoutの行をcout << sum<int, 0>(v) << endl;にすると a.cpp:8: error: dependent-name ‘std::vector::iterator’ is parsed as a non-type, but instantiation yields a type a.cpp:8: note: say ‘typename std::vector::iterator’ if a type is meant のようになっちゃう。vector<T>::iterator itをT vector::iterator itに変えても a.cpp:9: error: ‘template<class _Tp, class _Alloc> class std::vector’ used without template parameters a.cpp:9: error: expected initializer before ‘it’ になっちゃう。 どう対処すればいいんでしょう?
935 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:29:52 ] >>934 ja.lmgtfy.com/?q=error%3A+dependent-name
936 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:57:05 ] typename vector<T>::iteratorか。
937 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 20:14:09 ] test
938 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 20:59:59 ] 個人的にはそろそろ>>928 前者のような直接値を返すのも VC10とかg++ 4.3とかめちゃくちゃ新しいコンパイラならはありだと思うようになってきた。 C++0xのおかげでコピー発生しなくなったから。
939 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:17:32 ] それはちゃんと右辺値参照をアレするクラスを書いた時限定じゃないのか 全てライブラリのコンテナに限定するなら構わんだろうけど
940 名前:デフォルトの名無しさん [2010/04/07(水) 05:36:10 ] error: pointer to incomplete class type is not allowedってどういうことですか?
941 名前:デフォルトの名無しさん mailto:sage [2010/04/07(水) 05:40:42 ] >>940 そのまんまだろう。
942 名前:デフォルトの名無しさん mailto:sage [2010/04/07(水) 13:16:50 ] >>940 不透明ポインタあたりでぐぐれ