1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
75 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 15:56:46 ] MinGWとVC++との連携を考えてて 下記みたいなソースを考えた。 GeoOpen関数へ引数無しだとちゃんとreturnされてくるんだが、 引数を作るとエラーが起こっちゃうんだよ。 printfはちゃんとされてるからまさにreturnでエラーが起こってる様子。 ちなみにエラー文はコレ↓ 「The value of ESP was not properly saved across a funciton call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.」 なんぞこれーー コンパイラが違うから起こってるエラーなのか。。。 ■MinGW側cpp(DLL作成側) extern "C" __declspec(dllexport) int __stdcall GeoOpen(int inta) { printf("%u", inta); return 1; } ■VC++側cpp(DLL読み込み側) GEOOPEN geoOpen = (GEOOPEN)GetProcAddress(hGEOCODERDLL, "GeoOpen@4"); if (geoOpen != NULL){ int intRes = (*geoOpen)(testInt); }
76 名前:デフォルトの名無しさん [2008/06/06(金) 15:58:29 ] ちなみにVC++のヴァージョンは6.0 もしかしてスレチなのかな。
77 名前:デフォルトの名無しさん [2008/06/06(金) 16:00:59 ] しまった記述し忘れ。 ■VC++側cpp(DLL読み込み側) testInt = 1;
78 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:05:27 ] GEOOPENの定義は?
79 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:07:09 ] C++にはDLLなんて概念ないしスレ違いだが まあ呼び出し規約が一致してないんじゃないかなあ。
80 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:07:44 ] GEOOPENのtypedeで__stdcallを忘れているんじゃない
81 名前:デフォルトの名無しさん [2008/06/06(金) 16:13:25 ] >>78 typedef int (* GEOOPEN)(int); です。 >>79 やはりスレチでしたか。 失礼を。
82 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:16:12 ] >>80 ぐほー! 正にその通りでしたっ ありがとうございます!
83 名前:デフォルトの名無しさん [2008/06/07(土) 05:17:16 ] templateの型を強引にunsigned形式にキャストしたいんですが どうやれば良いのでしょうか? (unsigned T)num; はエラーになってしまうので・・・。
84 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 05:32:20 ] Boostのmake_unsignedを使う。 あるいは自分で同等のメタ関数を書く。
85 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 05:43:10 ] 質問です ゲームを作るときに速度や位置といったよく変更するものは一箇所のヘッダーにまとめたほうがいいのでしょうか それとも、その値を使うヘッダーごとに分けたほうがいいのでしょうか 前者だと、変更するたびにコンパイルの時間が長くなるし、 後者だと、書いてるヘッダーを探す手間が増えるというように、 長所と短所があるのでアドバイスをお願いします
86 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 06:19:35 ] >>73 固定配列のサイズ指定でmax() の戻り値使うと、可変長配列にならね? C99なら問題無いけど、C++だと規格上不正のような気がする。 とはいえGCC4は通っちゃったので俺が間違ってるのか >>70 boost使えるのならこういうのがあるYo boost::integer_traits<T>::const_max
87 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 10:03:09 ] >>85 定義ファイルから読み込む
88 名前:83 mailto:sage [2008/06/07(土) 12:18:14 ] >>84 レスありがとうございます。 boostは環境で使えないので メタ関数を書いたのですが・・・ template <typename T> struct add_unsigned { typedef unsigned T type; }; で、エラーが出ます。 unsignedではなくconstなどでは問題なくコンパイル通るのですが・・・
89 名前:83 mailto:sage [2008/06/07(土) 12:24:42 ] 力ずくですが template <class T> struct add_unsigned{ typedef T type; }; template <> struct add_unsigned<char>{ typedef unsigned char type; }; template <> struct add_unsigned<wchar_t>{ typedef unsigned int type; }; template <> struct add_unsigned<int>{ typedef unsigned int type; }; こんな感じで解決する事にしました。 どうもありがとうございました。
90 名前:85 mailto:sage [2008/06/07(土) 15:55:13 ] >>87 定義ファイルだとユーザが変更出来るという点が気になって使ってなかったんですが、 気にしなくていいのでしょうか それとも配布前にコードに埋め込んで配布という形を取るのでしょうか
91 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:54:34 ] >>85 ヘッダで宣言してソースで定義すればいいんじゃないの?
92 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:50:01 ] >>90 コードに埋め込めばユーザーが変更できないとでも?
93 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:03:16 ] >>91 俺もそれ思ったけど、 定数自体よく増えそうじゃね? その場合、定数取得用の関数に文字列渡して ソースの方でマッピングするくらいしか無いと思う。 マクロ使って、開発中は関数+文字列渡しで、 リリース時は本当の定数にするのも手だけど、 うまいマクロ書けずに諦めた。
94 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:29:25 ] 潤沢なCPU資源のある今の時代、別に毎回文字列をmapから探しても大して問題はないと思うな。 適当なテキストファイルにa=bの形式でひたすら列挙したものを読み込むクラスとか、そんなに手間でないし便利だから作っておくといいんじゃね? 俺は保存とかコメント付けもしたいからxml使ってるが。
95 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:42:44 ] おれは>>91 の方法だな >>93 は同じような文字列(宣言と定義)を2箇所に書くのがいやだとかそういう話?
96 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:21:47 ] >>95 じゃなくて、値だけがよく変わるならそれ(cppの書き換えだけ)で良いけど、 定数が増える場合は宣言も当然追加しないといけないので、 ヘッダ書き換える事になって、 結局includeしてる全cppがコンパイルし直しになるな、と。 まぁ、>>85 が定数増やすこと有るかどうか分からないけどね。
97 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:25:14 ] ヘッダ一つに定数一個だけ宣言して 定数使うソースは使う定数の分だけヘッダをインクルードすればいいんじゃね?
98 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:40:18 ] BCC 5.5.1であるテンプレートクラスの変数をメンバに持つクラスがいて、このクラスのヘッダの段階では テンプレート引数にくるクラスが前方宣言されただけの時コンパイラに未定義の構造体と警告されてしまいます。 でもcppの方で実際の定義が分かるので、一応コンパイルは通ってるみたいなんですが、 コンパイラを黙らせるにはどのように書くのが良いのでしょうか? ヘッダ class hoge; class piyo{ sokuseki_ptr<hoge> hoggee; }; ソース struct hoge{ 〜 } (hoggeeの使用)
99 名前:デフォルトの名無しさん [2008/06/07(土) 23:27:42 ] C++でDLL作成に挑戦しています 公開するAPI関数の定義(XXX.h)を extern "C" {} ブロックで囲っているのですが、 関数の本体(XXX.cpp)も同じように extern "C" {} ブロックで囲う必要があるのか分かりません もちろんインターネットで検索をかけていますが、今のところ有用な情報がないです 両方とも囲う必要があるのか教えてください
100 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:36:28 ] >>99 試してみれば?
101 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:45:59 ] >>100 コンパイルは通りました defファイルも作成できました しかし、これで正しいのかが分からないのです
102 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:48:23 ] >>98 BCB2007の付属品のBCC5.9.3では何のエラーも警告も出ない。 5.5.1のバグというか癖では?
103 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:08:39 ] ソート済みのvectorに対してupper_boundで取得してきたイテレータから そもvectorにおけるインデックス番号はどうやれば取得できるでしょうか?
104 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:11:18 ] std::distance()
105 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:24:29 ] >>99 名前マングルか名前マングリングでググれ。
106 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:22:37 ] >>104 ほんとだ。ありがとうございます!
107 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:33:02 ] >>105 いくつか有用な情報が得られました ありがとうございました
108 名前:デフォルトの名無しさん [2008/06/08(日) 02:07:53 ] 質問です。 VC++2008を使用しているのですが STLのvectorのsize()って、メソッドが呼ばれたらその都度数えているのでしょうか? それとも、内部に、数量を管理する変数があって、その値を返しているのでしょうか?
109 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:11:13 ] 実装次第。 VC6 の STL なんかは begin と end のポインタを保持していてその差を返してるが、 全ての STL でそういう実装になっているとは限らない。
110 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:11:44 ] 普通はその都度数えます とはいっても引き算1回 意味的には vector<T> v; v.end() - v.begin() と同じ
111 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:17:45 ] 数えるにしても、少なくとも O(1) の数え方ではある。 strlen みたいな O(N) の数え方はしていないな。
112 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 03:00:16 ] リストと違って定数時間が保証されてる
113 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 03:25:40 ] spliceとどっちを優先するかだね。
114 名前:108 mailto:sage [2008/06/08(日) 06:23:00 ] レスどうもありがとうございます。 それほど遅くはならない仕様なんですね。 今使ってるプログラムは 配列を使ってmalloc()で逐次拡張していくプログラムなんですが これをvectorに置き換えたんですが、なんか100倍近く遅くなってるんですよね。 基本的に、配列と同じく[]しか使わなかったし mallocで1つずつ拡張してた場所をresizeやらpush_backに置き換えただけなのに・・・。 元が1時間くらい回しっぱなしのプログラムなので、vectorに置き換えたら10時間くらいかかるようになってしまった・・・。
115 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 07:52:43 ] >>114 vectorは一般的に[]は速く、resizeやpushu_backは遅い。reservを調べよ。
116 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:28:37 ] FreeBSD7.0のgcc4.2.1では vectorは1つの連続したメモリで管理しています。 resize()、push_back()は内部の配列のメモリは大体二倍ずつ増えるようになっています。 resize()は縮小しても内部のメモリを再割り当てしない様になっています。 STLのソースを読むのが早いのではないですか?
117 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:59:30 ] vector<A> v; void f(vector<A> v); f(v); とかやってるんではないですか? void g(vector<A>& v); ではなく。
118 名前:85 mailto:sage [2008/06/08(日) 09:00:57 ] >>91-97 アドバイスを参考に色々考えた結果、ヘッダで宣言して定義をソースに書き、 設定する値は、デバック時はINIファイルやXMLファイルから読み込み、 配布時は埋め込んだコードを使うということにします。 アドバイスありがとうございました。
119 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 10:17:40 ] >>114 VC++2008のSTLはセキュリティのために色々やっていて遅い。 #define _SECURE_SCL=0を書いてからヘッダをインクルードすると それがなくなってだいぶ速くなる。
120 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 10:41:43 ] >>119 そんなうえーんな事って他のコンパイラにもありうる? 例えば2005とか
121 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 11:42:21 ] むしろ2005からそうなった。
122 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 12:13:34 ] >>115 typo ひどすぎw
123 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:54:03 ] typoはコンパイラが教えてくれるから兵器だもん!
124 名前:デフォルトの名無しさん [2008/06/08(日) 15:03:54 ] defalt:
125 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:34:26 ] カタカナでdefaultとか書こうとすると、typoで酷いことになるよね
126 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:43:43 ] defualt:とtypoしてラベルと見なされた事がある
127 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:47:00 ] >>120 セキュリティとはどんなセキュリティで なにをしているんですか?
128 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:27:56 ] std::vector<int> hoge; int* p = &hoge[0]; // NOT SECURE!!! っていう
129 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:31:09 ] >>119 それわざわざヘッダに書かずコンパイラオプションでいいよな ポータブルなC/C++コードをコンパイルしたいときは その手の呪文をやたらと唱える必要あるよね、VC++8以降だと
130 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:33:15 ] >>127 operator []やイテレータでの範囲チェック。 ナントカ_sって関数に変えないCと違って、 何もしなくていいというのはC++さすがというべきところだけど、 どうしてもお節介という感じは否めない。
131 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:11:08 ] 速度を落としてでも安全方向に振るっていうのは、C++の理念に反発してる。 そんなのはC#でやればいい話だ。
132 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:19:52 ] いつからお前の思想がC++の理念になったんだよ。
133 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:28:20 ] C++自体はオーバーヘッドは抱え込まない。 オーバーヘッドのある冗長なチェックをどこまで行うかは、ライブラリの実装しだいで使用者の自由ってことかな。
134 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:38:38 ] 単なるデータ構造使いたい場合でも、 class使っちゃったら、コンストラクタが呼ばれてオーバーヘッドが起きたりとか・・・ 工夫すりゃ回避できるけど、言語自体は"デフォルト"では、オーバーヘッドだらけでしょ。
135 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:43:07 ] >>134 コンストラクタが呼ばれてオーバーヘッド? どんな場合の話だ?
136 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:43:20 ] プログラミング言語C++とC++の設計と進化をよむと 実効速度を重視して言語を設計してますよね。
137 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:46:30 ] >>134 >class使っちゃったら、コンストラクタが呼ばれてオーバーヘッドが いいえ >言語自体は"デフォルト"では、オーバーヘッドだらけでしょ。 いいえ D&EのC++言語の設計ルールの章に書かれてるけど、 C++には「ゼロオーバーヘッドルール」というのがありまして。
138 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:24:49 ] オーバーヘッドをコントロールできるかどうかが問題だと思う
139 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:56:29 ] 理想論でゼロオーバーヘッド言ってても 実際問題、速度差が出てるんだから、言い訳出来まい。
140 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:58:08 ] 仕方ねーだろコードの肥大でCPUキャッシュからは溢れるし 仮想関数だって投機実行が効かないんだから
141 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:59:53 ] インライン展開するからコードの肥大化は関係なし 理想論だけどね ;-)
142 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:08:26 ] インライン展開するから肥大化すんだろ
143 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:13:07 ] Cでもコンストラクタや仮想関数と同じようなことをしようとすれば同じだけ時間がかかる。
144 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:14:33 ] C++はCのつもりで書けばCと同じ速度で動くんだよね。 ただ、速度を犠牲にして抽象化したくなる誘惑が多いということで。
145 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:21:11 ] わずかなパフォーマンスと引き換えに、抽象化をしてメンテナンスに有利なコードを書くのか。 それともメンテナンスを犠牲にしてベタコードでパフォーマンスを追及するかの選択は使用者が選べるのが利点だわな。
146 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:34:03 ] C++のfstream.writeはどうして第一引数がconst void*ではなくchar*なのですか?
147 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:40:17 ] 理由は知らないけど、現実にvoid*してもキャストが減るわけでもないし、テンプレート書くときvoidの引数があるといろいろエラーが出るしメリットないもんな
148 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:58:28 ] basic_fstream<char>だからcharしか受け取らんという意図なんだろうけど、 バイナリ指向なwrite関数はvoid*が使いやすいよな。
149 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:59:08 ] というかなんでconstが無いのかと
150 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:04:59 ] charの配列しか動作は保証されないんじゃない?
151 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:09:55 ] え?constはあるだろ、流石に
152 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:12:39 ] >>149 実は俺も「マジで?」って思ってググッたw 大丈夫const付いてる。146が省略しただけ。
153 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:22:34 ] 個人的にはmemcpyのsrcにconstが付いてて欲しい。
154 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:33:58 ] >>153 それもconstついているぞ。
155 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:35:51 ] じゃ、じゃあmainの第二引数にconstが付いて欲しい!
156 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:39:31 ] class A :public const B も許して欲しい。
157 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:42:33 ] むしろclass要らなくね? structだけで良いよ。
158 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:59:10 ] >>157 classとstructの違いが分からないとは
159 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:05:22 ] template<struct T> asdf{ typedef T type }; typename asdf<int>::type;
160 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:26:55 ] >>158 分かった上で言ってるんだけど。 class無いと出来ないことってあったっけ?
161 名前:デフォルトの名無しさん [2008/06/08(日) 23:32:05 ] template<typename T> asdf{ typedef T type }; いらねーな、やっぱw
162 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:33:01 ] >>148 basic_fstream<wchar_t> のことを考えると 已む無しなんだろうなあと思う。
163 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:22:27 ] >>160 こんなのとか template <template <typename T> class U>
164 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:25:05 ] template <template <typename T> typename U> もういっその事 template <(template <typename T>) typename U > にしちゃえば良かったのに
165 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:33:24 ] template <typename T> class U { }; をそのまま突っ込む形(現状)がベストだと思うけど。
166 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:38:57 ] template <template <typename T> class U> がよくて template <template <typename T> typename U> template <template <typename T> struct U> がダメな理由がわからん。
167 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:39:49 ] たしかに本質的にはclassは無くてもいいが、構文上は必要だな ただ、元からclassが無ければ↓という構文になっていただろうけどな template <template <typename T> struct U> まぁ、あの偉大な禿も万能なわけじゃないからな
168 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:41:49 ] class でも struct でも OK にして、 それなら typename も OK でいいだろって感じにして・・・ って感じに C++0x でなったりするのかな。
169 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:55:47 ] classの方が打ちやすいYo むしろstructを非推奨に ところで何で、びよよん先生を禿っていうの? ハゲてるから?ハゲだから?
170 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:06:07 ] 英語ネイティブな人間にはclassという単語がしっくり来るからでしょ C++の誕生当時はオブジェクト指向は一般的じゃなかったから 言語側がユーザーを啓蒙する必要があったんだと思う
171 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:36:18 ] classっていうと階級が最初に出てくるんじゃないかな 階級闘争でいうところの階級な 中産階級とか、総中流意識とか ブルーカラー、ホワイトカラーとか そういうイメージ 嘘だけど
172 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 08:52:46 ] classって1年2組のことでしょ
173 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 19:20:37 ] classはsimulaから来たのでしたよね?
174 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 19:58:32 ] 1993に恋をして君に夢中なんでしたよね
175 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:06:43 ] 後ろ後ろ!