1 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:18:41 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.47【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1200464091/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
206 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 11:54:33 ] >>203 その本は読んだ事はないが、サンプルをぽちぽち手で入力して実行してみなされ。 手で入力して試すのが肝心。 付属CDとかダウンロードをクリックして終わりじゃ絶対に理解できない。
207 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:26:37 ] >>200 なるほど。3項演算子は片方がrvalueのときは結果もrvalueになるという ことですね。 試したところでは、static_cast<ostream>(cout)やostream obj(cout); はできないみたいでが、そもそもostreamオブジェクトは生成できないも のなんですか?だとしたらostreamオブジェクトであるcoutはどのように 作成されたのですかね?
208 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:37:27 ] コピーしようとすると見るエラーだな
209 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:55:53 ] >>207 ostreamやistreamには、引数を取るコンストラクタがある。 coutやcinはそれを使って作られるんだろう。
210 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 14:04:36 ] >>207 static_cast<ostream&>(cout) とか ostream out(cout.rdbuf()); ならできる
211 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:06:27 ] >>209 >>210 ストリームとストリームバッファには弱い結合(ストリームバッファの同期) と強い結合(ストリームバッファの共有)ってのがあるみたいですね。 おそらく、コンソールデバイスに関連付けられたストリームバッファ (例えばcdevという名前だったとして)というのがシステムには存在し ていてcoutは、ostream cout(&cdev); というふうに定義されてる んでしょうね。ストリームオブジェクトをコピーできない理由は 無制限にストリームバッファをコピーしたり(メモリの浪費)、 暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。
212 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:07:47 ] ストリームオブジェクトをコピーできない理由は 無制限にストリームバッファをコピーしたり(メモリの浪費)、 暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。 は>>208 さんへのレスでした。
213 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:24:28 ] coutをコピーするというのは意味がわからん、ってのもあるかもね コンソール自体が2個に増えるわけじゃあるまいし
214 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:33:48 ] >>198 つかってやってください ttp://pc11.2ch.net/test/read.cgi/unix/997605845/55
215 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:41:15 ] >>205 環境が用意できないです。 それでもあきらめた方がいいですか?
216 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:49:08 ] >>203 そのままの意味が分からないけど、HDVも圧縮された素材ですよ。 H.264とは異なる方式で。 ttp://ja.wikipedia.org/wiki/HDV
217 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:52:43 ] あ、なんかすげー誤爆ってた。失礼orz
218 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:58:08 ] 環境が用意できないっつー意味がわからん。 Macしか持ってないのにWin32前提の入門書買っちゃったってことかね?
219 名前:203 mailto:sage [2008/02/09(土) 17:03:06 ] すいません。アフォで… 自分は今、第二章で止まってます。 と言うのも、いきなり「では、ソースを見てみましょう」となり、 「開発環境によってコンパイルの手順が異なります」 ↑この時点でわかりません。 自分には向いてないのかな…orz
220 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:05:32 ] void hoge(const char* name){ char* piyo = name + (sizeof(char) * 5); } こんなようなことはなんで出来ないんでしょうか? 文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです error C2440: '=' : 'const char *' から 'char *' に変換できません。 このようなエラーが出るのですが正直ここでなんでこのエラーがでるんだ?といった感じです
221 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:12:11 ] const char *piyo
222 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:13:49 ] >>220 書き換え可能なポインタ(char *)に書き換え不能なポインタ(const char *)を代入しようとしているからです。 void hoge(const char * name) { char const * piyo = & name[4]; } こう書けば問題ありません。
223 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:14:36 ] char *のconst性を除去してるから。入れたいならpiyoもconst char *にする。 hoge内で文字列を弄りたいなら引数をchar *にするべき。 引数は変えられず、どうしてもchar *が必要ならconst_cast<char *>(最後の手段)
224 名前:220 mailto:sage [2008/02/09(土) 17:17:20 ] >>221-223 ありがとうございます。 よく考えたらいじる必要はないのでpiyo側をconstにしました
225 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:18:01 ] >>219 とりあえず、なにか揮発環境は持っているのか?
226 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:18:34 ] > name + (sizeof(char) * 5) 彼は大丈夫だろうか。
227 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:19:23 ] >>225 はい。 ジクロルボスは揮発するので大丈夫です。
228 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:22:30 ] 俺のチームのメンバも先週揮発したぜ。
229 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:23:57 ] ちょっと待て、それは「蒸発」じゃないのか?
230 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:24:28 ] >>226 それって問題あるのか?パッと見わからん
231 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:26:23 ] >>230 char であるときには問題にはならないが int とかになると…
232 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:26:24 ] >>230 >220にはこう書いてある。 >文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです
233 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:26:31 ] >>229 そうだな。揮発は性質で、蒸発は現象だからな。
234 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:27:47 ] >>231 いや、だいじょうぶだろw ちゃんとintの大きさに対応してくれるよw
235 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:27:55 ] >>230 ポインタは自動的にそのサイズ分進むから、sizeofを掛ける必要はない、とかかな?
236 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:28:25 ] >>234 ごめん間違えた
237 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:28:46 ] ConceptGCCで、190のコードのofstreamとifstreamを ostream&&とifstream&&にstatic_castしたものを食わせたらどうなるかと試してみたが、 エラーだったorz。右辺値参照はライブラリまで及んでいなかった。
238 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:29:06 ] sizeof(*name)にするべきとか。
239 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:29:46 ] >>238 阿呆ですか?
240 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:30:00 ] >>219 適当に c 入門 初心者とかでぐぐれば環境の入れ方から説明してるとこがきっと見つかるよ
241 名前:203 mailto:sage [2008/02/09(土) 17:46:21 ] >>225 >>240 すいません。もう一度調べなおしてみます。
242 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:47:29 ] >>238-239 &5[name] でいいだろ。
243 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:49:48 ] >>242 >232
244 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:58:03 ] char ch='a'; cout <<(int) ch << '\n'; // 97 int dt=97; cout << (char)dt<< '\n'; // 'a' とできるのに、 wchar_t ch1='あ'; cout <<(int) ch1 << '\n'; // 33340 int dt1=33440; cout << (wchar_t)dt1<< '\n'; // 0x82a0 と'あ'がでないで、82a0が出るのはなぜですか? (82a0は33440の16進です)
245 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:03:03 ] class test{ char* str; int len; public: test(const char* str); }; test::test(const char* str0){ len = strlen(str0); str = new char[len+1]; } とすると (msvcr80d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xccccccc0 を読み込み中にアクセス違反が発生しました。 こんなようなエラーがでます、いろいろとコメントアウトして試してみていたのですが str = new char[len+1];部分でエラーが出ているようです、これを str = new char[256];のようにするとエラーはでないのですが、定数でなければならないとかないですよね? 一体なんででしょうか?
246 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:10:38 ] 書いてないところのバグを見つけろって言う話?
247 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:10:39 ] >>245 そういう時は先ず、str0の長さが実際にいくつだったのかを確認しましょう。
248 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:10:53 ] >>245 その部分は問題ないように見える。 256にするとエラーが出ないところからみて、 どこかでバッファオーバーフローしてるんじゃない?
249 名前:245 mailto:sage [2008/02/09(土) 18:12:34 ] >>246-247 えっとすみません、str0には固定の文字を入れるようにして試しています 16文字の文字列でして、コンストラクタ内でlenの長さを表示させるときちんと16文字になっています。 また、同じくコンストラクタ内でstr0を表示させるときちんと渡した16文字の文字列が表示されます
250 名前:245 mailto:sage [2008/02/09(土) 18:15:42 ] main内に char* buff = "abcdefghijklmnop"; test hoge(buff); これだけです 余計な部分を全てコメントアウトしてるのでこれでコードは全てです
251 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:16:08 ] 実行部分をみせろ。 test test1("abcdabcdabcdabcd"); ならまったく問題ないはず。
252 名前:251 mailto:sage [2008/02/09(土) 18:22:16 ] ごめん、違うな
253 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:23:47 ] >>245 そこを変えたら動くからといって、バグの出元がそこだとは限らない ぜんぜん関係なさそうな別の場所も疑う必要がある
254 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:24:42 ] strにはアクセスしないの? test内でstrcpyしなくていいのか? なにがやりたいんだ?
255 名前:245 mailto:sage [2008/02/09(土) 18:36:41 ] >>253 提示した部分以外をコメントアウトしているのですがエラーが出る状態です >>254 その部分が原因かとも疑ってコメントアウトさせているのですがエラーが出る状態です test::test(const char* str0){ len = strlen(str0); str = new char[len+1]; strcpy_s(str, len+1, str0); printf("%s\n", str0); printf("%d\n", len); printf("%s\n", str); } こんな具合にしますと abcdefghijklmnop 16 abcdefghijklmnop と表示されますがしっかりエラーがでます
256 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:44:34 ] mainってことは、MFCとかは使ってないわけか…… リビルドしたら直るとか言う落ちはないよな?
257 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:44:45 ] >>255 余計なincludeもコメントアウト。 さらにエラーが無くなるまでコメントアウト。 新規プロジェクトと作成して、必要なコードだけ貼り付けて動かしてみる。
258 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:44:52 ] おかしいなあ、ちゃんと動くぞよ。
259 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:46:07 ] class test{ char* str; int len; public: test(const char* str); }; test::test(const char* str0){ len = strlen(str0); str = new char[len+1]; } int main(int, char**) { char* buff = "abcdefghijklmnop"; test hoge(buff); return 0; } これで、エラーになるって事?
260 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:53:05 ] 少なくともうちでは落ちない。 VC++ 2005 Express Edition SP1 + Win2KSP4
261 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:59:59 ] >>255 どの行で例外発生してるか突き止めたのか?
262 名前:244 mailto:sage [2008/02/09(土) 19:00:55 ] こちらもヨロ
263 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:02:03 ] >>262 wchar_tがただのtypedefの環境ではそうなる。 VC++6とか。
264 名前:244 mailto:sage [2008/02/09(土) 19:05:57 ] >>263 はい、VC++2005EEですので、 そういうものなのですね。 どうもでした。
265 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:06:46 ] 2005はさすがにtypedefじゃないんじゃないか?
266 名前:244 mailto:sage [2008/02/09(土) 19:10:30 ] どうすれば確かめられますか?
267 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:14:15 ] >>266 wchat_tとsizeofが一致するいろんな組み込み型とで、オーバーロードしてみる。
268 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:15:47 ] wchar_tを組み込み型として扱うコンパイルオプションがあったはず
269 名前:244 mailto:sage [2008/02/09(土) 19:25:45 ] >>267 すいません、よくわかりません。 >>268 MSDN ------ Visual C++ コンパイラ オプション /Zc:wchar_t (wchar_t をネイティブ型として認識) /Zc:wchar_t を指定しない場合は、wchar_t を定義するか、または wchar_t が定義された多数のヘッダー ファイルのいずれか (wchar.h など) をインクルードする必要があります。 通常、wchar_t は unsigned short として定義されます。 ---- とあったので、このオプションをON/OFFしてみましたが、 結果は変わりませんでした。
270 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:50:27 ] namespace hoge { int main(int argc, char *argv[]) { } } これをコンパイルすると、↓と言われます。どうすればいいですか? error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
271 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:51:37 ] >>244 coutはワイド文字に対応していない。 wcoutを使えば良い。 wcout.imbue(locale("")); wchar_t ch1= L'あ'; wcout << (int)ch1 << L'\n'; int dt1 = 12354; wcout << (wchar_t)dt1 << L'\n';
272 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:52:06 ] >>270 何がしたいのか考え直すといいです。
273 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:03:51 ] >>270 namespace hoge { extern "C" int main(int argc, char *argv[]) { } }
274 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:18:31 ] テラ反則w
275 名前:244 mailto:sage [2008/02/09(土) 20:24:00 ] >>271 動きました。 私のだと、いろいろな点で駄目でしたね。 ありがとうございました!
276 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:29:58 ] ちょっとお尋ねしたいのですが、 char *p というポインタに、なにかしらのアドレスが格納されていて、 cout << p; とした時に、仮に ss[100] = {a b, c ...}; (ss[100] = \0 とする) p = ss; だった場合は、ss[0]から順に\0が出てくるまで走査して、 cout << p; で、abc... と表示するわけですよね。つまり配列の要素100個分順番に読み込んでるってことですよね。 では、もしポインタpに格納されているアドレスが普通の変数のアドレス p = &a みたいな場合だった時は、 cout << p; では、単純に変数aのアドレスが出力されるだけですよね。 で、ここで疑問なのですが、 p = &a; cout << p; だった時、処理系はどうやってpが「変数」のポインタだと判断するのでしょうか?? 「配列」のポインタの場合もあるので、何かしらの方法で判断していると思うのですが、 「メモリを順番に走査して\0が出てこなかったら変数のポインタ」だとしたら 毎回\0が出てくるまで番地を順番に走査していかなくてはならないので(\0が出て来ないかもしれないのに(変数の場合))何か違う気がします。 ポインタには、アドレスや型の情報だけではなくて、そのアドレスが変数のアドレスか、それとも配列の先頭アドレスかという情報も入っているんでしょうか?
277 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:30:49 ] >>274 正しい。
278 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:43:53 ] >>276 単に何の型のポインタになっているかで決まる。 型が char* のときとそれ以外の T* について operator<< のオーバーロードが違うだけ。 char a = 'A'; char* p = &a; cout << p << '\n' とすると確保されていない領域まで突き抜けて文字列が表示される (はず) 。
279 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:43:57 ] >>276 コンパイルするときに決まる。 それがconst char*だったら文字列、void*だったらアドレスを表示する。 その他のポインタ型は多重定義解決の規則に従って、上のどっちかに振り分けられる。
280 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:47:05 ] >>276 > p = &a > cout << p; > では、単純に変数aのアドレスが出力されるだけですよね。 (aがたとえば int であるとして。) それは間違い。 > p = &a これをやった時点でコンパイラは型が違うとエラーにする。 p = reinterpret_cast<&a>として無理やりキャストをしてpに int * の値を入れることは可能。 >処理系はどうやってpが「変数」のポインタだと判断するのでしょうか?? pを宣言する際に、その型を char* と指定しているから、pが実際にさす先に実際にあるものが charの配列であっても、int型の値であっても、コンパイラはcharの文字列であると扱う。 aの値がたまたま有効な文字の文字コードと'\0'が並んだ物となっていれば、該当する文字列として表示されるし、 そうでなければ制御コードを出力したり文字化けしたりする。
281 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:58:25 ] >>276 は一貫してpをchar*として話しているのでは。 そうすると、 > p = &a > みたいな場合だった時は、 > cout << p; > では、単純に変数aのアドレスが出力されるだけですよね。 は間違い。 aが存在するメモリ位置から始めて、それ以降にたまたま存在するデータを、 無理やり文字列と解釈して出力するだけ。
282 名前:176 mailto:sage [2008/02/09(土) 21:37:59 ] そーかそもそも文字列を扱うのはchar型だけだから、 << がオーバーロードを利用してconst char*型だけ特別に扱うようにしている、ということですね。 ありがとうございましたm(_ _)m
283 名前:デフォルトの名無しさん [2008/02/09(土) 23:57:11 ] こんにちは。角度の比較のよい方法が思いつかずに苦労しています。 角度A,B,Cがあって、BがAとCの中に入っているがを判定する式で悩んでいます。 角度系は時計の3時が0度、反時計回りに360まであります。 (CはAから見て反時計方向に92度離れています) 単純な比較式 A<B && B<C とすると、A=350度、B=0度、C=30度のときうまく成立しません。 A,B,Cそれぞれがどの象限にいるかによって 判別式を変えることも考えたのですが、組み合わせを考えるとあまりスマートな方法とも思えません。 何か簡単な式などでBがはさまれていることを知る方法があれば教えていただけませんか?
284 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:00:30 ] >>283 そもそもどんな値を入れたってぐるっと回ってくれば挟まれてると言えるが? AとCの作る角の小さい方にBがあるかどうかを判定するってことでいいのか? その場合、AとCが180度離れていればBはどのような値であっても挟まれていないと考えていいのか?
285 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:11:50 ] >>283 Aが0度になるようにBとCを回転させればいいよ。
286 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:11:56 ] >>284 > CはAから見て反時計方向に92度離れています って記述があるからそれは気にしなくていいんじゃね? > A=350度、B=0度、C=30度のときうまく成立しません。 ってのは例のつもりだろう。
287 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:15:25 ] >>283 A' = A - A (=0), C' = C - A (=92), B' = B - A とすれば、 BがAとCの間 <=> B'がA'とC'の間
288 名前:デフォルトの名無しさん [2008/02/10(日) 00:15:56 ] 角度を図なしで表現すると難しいですね。 AとCの作る角の小さいほうにBがあることを確認したい。 (大きい角のほうには「挟まれていない」という認識) AとCは180度未満(想定は92度です)離れています。
289 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:21:23 ] B-A, C-Aの角度を-180~+180に換算して、 C-A<B-A<0 または、 C-A>B-A>0なら、AとCの間にBがあるんじゃないかな。
290 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:22:38 ] AとBの角度 + BとCの角度 < 180 なら挟まれてるよ。
291 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:32:45 ] どなたか、助けてください。 #include <iostream.h> #include <stdlib.h> int main(void) { int i,n,*ptr; cin >> n; ptr = (int *)calloc(n,sizeof(int)); for(i=0;i<=n-1;i++) { cin >> *ptr; ptr++; } for(i=0;i<=n-1;i++) { cout << i << "," << ptr << "," << *ptr << endl; ptr++; } return 0; } うまく動きません。 orz... どこが間違ってるでしょうか?
292 名前:291 mailto:sage [2008/02/10(日) 00:38:34 ] 自己解決しますたw
293 名前:デフォルトの名無しさん [2008/02/10(日) 00:39:10 ] すみません。理解できていません >>287 A'=A-A = 350 - 350 = 0 C'=C-A = 30 - 350 = -320 = fmod( -320+360, 360) = 40 B'=B-A = 0 - 350 = -350 = fmod( -350 + 360, 360) = 10 としておいて A' < B' < C' ( 0 < 10 < 40) と比較すればよいのでしょうか?
294 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:49:20 ] C言語より数学を勉強しろよ
295 名前:デフォルトの名無しさん [2008/02/10(日) 00:49:21 ] >>287 うまく行きました。皆さんありがとうございました
296 名前:デフォルトの名無しさん [2008/02/10(日) 00:58:44 ] >>283 リーマン幾何学
297 名前:デフォルトの名無しさん [2008/02/10(日) 02:41:34 ] C++で、以下のようなコードを見たのですが、 int res = 0; int a = 0; res >?= a; こんな書き方はありえないですよね? >?= の書き手の意図は res > a ? res = a: res と思うのですが、macroによる置き換えも、>?=のような書き方に 対してはできないですよね?
298 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 02:49:35 ] gcc拡張
299 名前:デフォルトの名無しさん [2008/02/10(日) 03:53:53 ] >>298 マジで? どういう奴ですか? というか、手元のg++だとコンパイル通らないけど、、、 こんなソースです。(元のソースから問題部分だけ抜き出したもの) int main(void) { int res = 0; int a = 0; res >?= a; return 0; }
300 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 03:58:31 ] ちゃんとC++になってる?
301 名前:デフォルトの名無しさん [2008/02/10(日) 04:26:18 ] >>300 こんな感じです。環境はlinuxです。(version 4.2.1) $ cat test.cpp int main(void) { int res = 0; int a = 0; res >?= a; return 0; } $ g++ test.cpp test.cpp: In function 'int main()': test.cpp:5: error: expected primary-expression before '?' token test.cpp:5: error: expected primary-expression before '=' token test.cpp:5: error: expected `:' before ';' token test.cpp:5: error: expected primary-expression before ';' token
302 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 08:39:32 ] まったくの初心者なのですがC言語を勉強しようと思ってます 入門書で独習Cと独習C++がありますが、どちらを買えばいいでしょうか? また他に良い入門書があれば教えて頂けませんか?
303 名前:デフォルトの名無しさん [2008/02/10(日) 08:42:31 ] >>302 うすい本にしとけ あとはネットで調べればよい 100ページ以下が必須
304 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 08:43:31 ] その二つだったら間違いなく独習C。
305 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 08:48:21 ] >>302 言葉のあやなのかもしれないが CとC++は別物だからね
306 名前:デフォルトの名無しさん [2008/02/10(日) 08:48:40 ] 日本語学者でなくてもしゃべれるのと同じ うすいやつにしとけ ネットで調べたページだけで勉強しても良い なるべく動かし方がわかったらSTLに進むべき 古典的なCプログラムのほとんどはSTLで簡単に書ける
307 名前:デフォルトの名無しさん [2008/02/10(日) 08:50:02 ] たとえばクイックソートや、スタックや、日本語処理など面倒なプログラムは勉強しなくてもSTLなどで置き換えられる
308 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 08:54:23 ] unicodeもろくに扱えない糞ライブラリがナニ言ってるんだか
309 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 09:03:20 ] >とにかく薄いやつ これには同意。 入門書で分厚いの買ってもダラダラ無駄に難しく書いてるだけで理解しにくいだけ 基礎中の基礎さえ理解したら実際作って必要になった処理をネットで調べる方がいい
310 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 09:20:07 ] STLってunicode扱えないんだっけ?
311 名前:デフォルトの名無しさん [2008/02/10(日) 09:21:58 ] つかえる 一語が判別できないのは charでもおなじ
312 名前:デフォルトの名無しさん [2008/02/10(日) 09:41:39 ] ここ勉強すれば良いよ www.geocities.co.jp/SiliconValley-Bay/8490/c/index.html rina.jpn.ph/~rance/c_language/index.html www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html
313 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 09:54:05 ] >>310 STLに限らずC++にろくなUnicodeサポートがないというだけのこと。 特に気にする必要はない。気にするな。 ただのwchar_tか何かをコンテナに突っ込んで使うだけだ。
314 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 09:59:53 ] ああそういうことか STLが何か文字コードに依存してるのかと思ったよ
315 名前:デフォルトの名無しさん [2008/02/10(日) 10:01:29 ] たとえば10文字目が何バイト目とか判別できないだけ
316 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 10:20:58 ] >>301 GCC 4.0.4, 4.1.2 と 4.2.3 のマニュアルには... | The G++ minimum and maximum operators (‘<?’ and ‘>?’) and | their compound forms (‘<?=’) and ‘>?=’) have been deprecated | and will be removed in a future version. Code using these operators | should be modified to use std::min and std::max instead. [Excite 翻訳] | そして、'G++最小の、そして、最大のオペレータ、(‘<?'、‘>、'、)、 | 彼らの合成フォーム(‘<?=')と‘>=') 非難して、将来のバージョンで取り | 除くでしょう。 これらのオペレータを使用するコードはstdに以下を使用 | するように変更されるべきです:分とstd:、:代わりに最大限にしてください。 となってるから、4.2.1 なら使えるはずだが、なんかオプションがいるのかも しれないな。 ちなみに 4.0.4 の一つ前の 3.4.6 のマニュアルには '>?=' 自体の説明がな いから、実験的に付け加えられた拡張に思える。
317 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 10:36:34 ] excite翻訳ひどいなw g++の最小・最大演算子とその合成形はすでに非推奨であり 将来のバージョンでは廃止されます。これらの演算子を使用 しているコードは代わりに std::min と std::max を使用するように変更すべきです。
318 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 11:03:47 ] T"なんたら" を L"なんたら" に置き換えるマクロはどう書くですか?
319 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 11:04:42 ] #define T Lでできなければ無理。 Windowsは関数形式のマクロにして対処している。
320 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 12:13:50 ] template<class L>
321 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 12:17:02 ] gcc だと wchar_t は4バイトで UTF-32 を入れるようになっている。 wchar_t はあくまでその環境で扱える最大の文字コードを格納できる文字型でしかなく、 2バイト固定でもなければ UTF-16 や UCS-2 専用のものでもない。 C++0x ではそこんとこ困るってことで UTF-16 と UTF-32 を直接サポートするようになる予定のようだ。 また VC++ が対応遅らせそうな気がして憂鬱になるが。
322 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 12:36:12 ] NT3.1時代からUnicode使ってきたOSに従うべき。
323 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 13:33:02 ] 先日こちらでアドバイスをいただき、プログラムを 書いてみました。学校でできなかった分を家で作成しようと ソースを持ち帰ったのですが文字化けしてしまい開くことが できなくて困っています。 学校では秀丸エディタで「.cpp」の拡張子で保存をして gccでコンパイルをしているようなのですが、同じ様な 環境を作ることは可能なのでしょうか? winのメモ帳でも開けるものだと思っていたので困っています。 どうかよろしくお願いします。
324 名前:291 mailto:sage [2008/02/10(日) 13:34:37 ] おそらく文字コードが違うんだろ。 nkf使うか、メモ帳以外のエディタでソースコード見れ
325 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 13:36:29 ] まずはまともなエディタを使うんだ 秀丸にあわせるのがよいかと思うがサクラエディタなど他にもいろいろある *.cppをgccでコンパイルというのもなんか引っかかるが・・・
326 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 13:37:13 ] >>323 秀丸のエンコーディングを一時的に変えるか、まともなフリーなエディタを拾って使えばいいんでない?
327 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 13:56:49 ] つーかC/C++全然関係ない問題なのなw
328 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 14:42:18 ] 回答いただきありがとうございます。 327さんの仰るとおり、C以前の問題でした申し訳ありません。 >>325 gccでコンパイルというのは、なにかおかしいのでしょうか? コンパイル時のコマンドがそのようなコマンドを入力すると 教えられたのです。 まずはエディタを探してみることからはじめてみます。 ありがとうございました。
329 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 14:48:08 ] .cppなら普通gccではなくg++を使う。
330 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 14:55:04 ] 結局はgccだけどな
331 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:44:22 ] 質問です。 最近Cを勉強していますが、コンパイルが上手く出来ません。 コンパイラーはBorland C++ Compiler5.5を使ってます。 コンパイルすると、「指定されたパスが見つかりません」となります。 原因は何が考えられますか?
332 名前:デフォルトの名無しさん [2008/02/10(日) 15:45:20 ] #include <iostream> と #include <iomanip> ってどういうとき使うの?
333 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:46:08 ] Pathを通してないのが原因。 setbccでぐぐるとよい。
334 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:46:20 ] 宣言や定義を使用するとき。
335 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:47:03 ] std::coutとかstd::cinとか使いたければ、まず<iostream>をインクルードする。 その上で、引数のあるマニピュレータが集められているのが<iomanip>。
336 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:49:39 ] >>332 レベルの質問する奴に只「マニピュレータ」なんて書いたって通じないだろ と思って解説を書こうとしたけど、うんこしたくなったので中止
337 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:54:56 ] でもそれ見てマニピュレータで検索すればすぐ解決すると思うけどw
338 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 16:08:51 ] 用途としては>>49 みたいな場合に。
339 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:21:50 ] test
340 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:28:40 ] 十進数の入力を二進数表示するコードを書いてみたんですが、 最初MASKを0x01に設定して1とか255とか入力したら桁が上下逆になりました。 0x80000000に設定して頭からチェックさせてやったらうまくいったんですが、 intel系のプロセッサはリトルエンディアンだからビットを上下逆に扱うんじゃないんですか? /* d2b.c */ #include <stdio.h> #define MASK 0x80000000 int main(void) { unsigned int x; int n; scanf("%d", &x); for(n = 0; n < 32; n++){ if( ((x << n) & MASK) == 0) putchar('0'); else putchar('1'); if( (n+1) % 4 == 0) putchar(' '); } return(0); }
341 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:34:58 ] >>340 ×ビットを上下逆 ○バイトの並びが逆
342 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:35:39 ] エンディアン関係ナス
343 名前:340 mailto:sage [2008/02/10(日) 22:37:25 ] >>341 バイト単位で逆なんですね。 >>342 あ、全然関係ないんですか; ありがとうございましたm(__)m
344 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:18:02 ] stdio.hのremove関数の使い方は下記で問題ないでしょうか? remove("ファイルのパス"); 今現在、例えば remove("D:\\test\\test.txt"); こんな具合の1文だけを試しても成功しません、-1が返ってきて失敗しているようです パスは絶対パスで問題ないと思いますし、testフォルダとtest.txtは試しに作ってみたものです プログラム中で開いてもいませんし読み取り専用でもありません 見当がつかず困っています、何かご存知の方いたらよろしくお願いします
345 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:21:13 ] >>344 perror() してみれ
346 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:22:15 ] >>344 そのパスと同じままfopenして開けるのか? つまりほんとにそのファイルをプログラムから認識できているのかをチェキラ! あと、strerrorでエラー内容を取得してみては?
347 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:23:36 ] test.txt.txtだったりして・・・ いやさすがにそれはないか
348 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:26:52 ] Dドライブは実はDVD-ROMドライブだったりして・・・いやさすがにそれはないか
349 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:30:58 ] そもそもDドライブが存在しな・・・ないか ないよな
350 名前:344 mailto:sage [2008/02/10(日) 23:32:54 ] permission deniedというエラーが・・ ファイルのプロパティは読み取り専用とか隠しファイルとかチェック入っていないんですが 全く違う部分なんでしょうか?
351 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:33:25 ] chmod a+w FILENAME
352 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:35:53 ] Dドライブがネットワークドライブ・・ のわけないよな
353 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:36:33 ] >>351 ahodesuka?
354 名前:344 mailto:sage [2008/02/10(日) 23:36:53 ] >>351 うわぁ・・そういうの必要なんですか・・ Cじゃ書けないですよね? Dはあります
355 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:37:30 ] ^^;
356 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:37:45 ] WindowsXP と仮定して 1.コマンドプロンプトを開く [スタートメニュー]-[ファイル名を指定して実行] cmd 2.コマンドプロンプトで下記の三つのコマンドを打つ D: cd \test dir これで test.txt があるかどうか確認する
357 名前:デフォルトの名無しさん [2008/02/10(日) 23:38:17 ] >>351 それはUNIXだろ。 DOSとWindowsは rd /s/q c:\ だろ。
358 名前:344 mailto:sage [2008/02/10(日) 23:39:44 ] ファイル自体はあります 今ファイルのパスを変数に入れて、開いて中の文を出力させたりしてみました その変数をそのまま使っています それとfcloseもしっかり
359 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:39:53 ] >>357 そうだったな
360 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:45:39 ] >>358 っ attrib d:\test\test.txt
361 名前:344 [2008/02/10(日) 23:52:26 ] >>360 そういう方法以外のコード内に記述して済ませる方法って言うとWin32APIってのを使うしかないんでしょうか
362 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:56:03 ] >>360 その前に permission denied ってんだから削除する権利があるのかどうか確認しろよ。 コマンドプロンプトから del してみるとか、エクスプローラから削除してみるとか。
363 名前:344 mailto:sage [2008/02/11(月) 00:08:29 ] >>362 そこら辺は出来ます、管理者権限でログインしてるので間違いないはずです
364 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:12:57 ] >>363 実際消してみた?他のソフトがロックしてるってことはない?
365 名前:344 mailto:sage [2008/02/11(月) 00:14:34 ] 消してみました、remove関数を試す為に作ったファイルなのでそういったことはないと思います
366 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:19:03 ] そのプログラム内でopenしてる状態でremoveしようとしてる、とかいうオチじゃないよね。
367 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:23:02 ] 同じこと何度も確認されまくっててかわいそす
368 名前:344 mailto:sage [2008/02/11(月) 00:23:53 ] >>366 上で言ったとおり、remove関数を使う最低限の文だけで実行してもエラーはでますし closeもしています
369 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:26:22 ] もうみんな思い当たる節が尽きたんだろ・・・
370 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:29:05 ] プログラムを管理者権限で実行してないとか。
371 名前:344 mailto:sage [2008/02/11(月) 00:29:09 ] 絶対パス指定出来ない訳ないですよね・・・なんでだろう
372 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:29:59 ] あとは、ディレクトリ消そうとしてるとかぐらいかな。 ファイルを開いて中の文を出力させたりしてると言うから多分違うだろうが...。
373 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:30:13 ] OS やコンパイラの情報でも出さないとこれ以上どうしようもないだろ。エスパーでもなけりゃ。
374 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:42:31 ] リブートしてみるとか
375 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:53:40 ] エクスプローラなんかでやったときとプログラムでやったときとで権限が違うとか。 Vistaだったらありそうだ。
376 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:54:17 ] おれの経験から予想するとtest.textになってると予想 それで何時間も悩んだことがあるw
377 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:23:03 ] >>318 _T("なんたら") を L"なんたら" で良ければ、 #define _T(x) L ## x でいいんじゃないか?
378 名前:デフォルトの名無しさん [2008/02/11(月) 04:10:31 ] 明日までに1000×1000くらいの行列の逆行列とかを計算することが必要な宿題が 出ました。他の人はmatlabでやるのですが、自分はc++でやろうと思ってます。 逆行列の計算は自分で実装しなくてよいので、ライブラリとかを使おうと思ってます。 今調べたところでは、有名なc++用の行列計算ルーチンは、blitz++, MTL, blas, TNTなどがあることが分かりました。将来性(一度覚えたら長く使える)と性能(一番重視) を考えると、どれを選ぶべきでしょうか? よろしくお願いします。
379 名前:デフォルトの名無しさん [2008/02/11(月) 04:20:20 ] すいません、 > 明日まで じゃなくて、来週までです。
380 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:20:26 ] 俺は LAPACK 使ってるけど、 他の選択肢を吟味した訳じゃないからなあ。
381 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:37:58 ] >>378 将来性はどれを覚えても同じかと。 C++を長く使うのであれば他人のライブラリを実装することも多くなると思う。 性能というのが速度重視であれば自分で実測した方が早いかな? 他には、関連ページの多さ、組み込み易さ、ソースが公開されているか?あたりを重視して決めればいいかと ぶっちゃけmatlab使えるならそっちを使った方がいいようにも思うが・・
382 名前:デフォルトの名無しさん [2008/02/11(月) 05:10:35 ] >>380 >>381 ありがとうございます。自分が一応一番C++ができる(ことになっている)ので、matlabとの 性能比較のために、自分がc++版を実装することを期待されてます。簡単な偏微分を解く課題なのですが、 絶対matlabに勝ちたいので、自分の環境で性能比較してみます。とりあえず、選択範囲としては、 lapack, tnt, blas, mtl, blitz++, ublas(blasのboost版), mkl(intelのマスカーネルライブラリ) くらいでしょうか?
383 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:32:00 ] >>382 無駄な努力だと思うけど。どうしてもってことならコンパイラもiccにすることお勧め。 どうせなら、cublasかClearSpeedでも使ってぶっち切りを狙うのもいいかもねw
384 名前:デフォルトの名無しさん [2008/02/11(月) 09:15:11 ] >>383 どちらも専用ハードが必要じゃないですか。 でもこんなのもあるんですね。知らなかった。 コンパイラはiccとgccを比較します。
385 名前:デフォルトの名無しさん [2008/02/11(月) 09:51:09 ] CloseHandleの前後で、ハンドルが閉じられていることを確認するにはどうしたらいいですか
386 名前:デフォルトの名無しさん [2008/02/11(月) 10:00:18 ] ハンドルが使用中かどうかを知りたいんです
387 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:00:48 ] なぜそんなことをする必要があるのですか
388 名前:デフォルトの名無しさん [2008/02/11(月) 10:06:36 ] たとえばサブディレクトリのファイルリストをひとつひとつ取得したいとき、 同一ディレクトリにまだファイルが残っていれば次のファイルを呼んで、 無ければハンドルを解放して、子ティレクトリへ進めたいんです
389 名前:デフォルトの名無しさん [2008/02/11(月) 10:07:45 ] フラグを別に持っていれば確認できますが、なるべく変数を減らしたいと思います
390 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:09:05 ] かならずNULLで初期化してCloseしたらNULL代入すればいい。
391 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:09:56 ] ファイルハンドルは NULL じゃなくて INVALID_HANDLE_VALUE だ!
392 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:16:38 ] NULLで比較しちゃってるコード多いけどな それで動いちゃってるし 型安全なtypedefでもないかぎり防ぐのは無理ぽ
393 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:17:59 ] ごめん間違えた INVALID_HANDLE_VALUEは-1だった
394 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:19:16 ] >>392 クラス作ればいいじゃん。
395 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:29:42 ] >>388 なんか設計がおかしいように気がするけど... 擬似コードでいいから晒してみてよ。
396 名前:デフォルトの名無しさん [2008/02/11(月) 10:42:25 ] main(){ dirserch dir("c:\\windows"); cout << dir.next(); cout << dir.next(); cout << dir.next(); }
397 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:44:52 ] C だと不完全型を利用して隠蔽する。
398 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:53:10 ] Cでshared_ptrみたいなのはないの?
399 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:55:22 ] テンプレートが無いのが辛い所だな。 マクロで何とかできなくはないが。
400 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:56:52 ] それ以前にデストラクタが無いんだから仕方が無い
401 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:00:54 ] AddRef/Release を自前でやるなら問題ない。 面倒だけど。
402 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:02:11 ] COMを勉強中で、インターフェースを実装したクラスの情報を隠したいのですが 取得したものをみると、CFileの内容がくっついて来てしまいます // idl [uuid(...), version(1.0), hidden, object] interface IFile : IUnknown { HRESULT method(); } [uuid(...), version(1.0), hidden] coclass CFile { interface IFileBase; }; // 簡単なインターフェース取得 IFile * __stdcall create() { IUnknown *iface = new CFile; IFile *base = NULL; iface->QueryInterface(IID_IFile, reinterpret_cast<void**>(&base)); return base; } 属性にhidden指定するだけではだめなんでしょうか? WinXPsp2/.net2003/C++/ATL使用せず
403 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:08:24 ] なんで CoCreateInstance 使ってないの?
404 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:21:28 ] CoCreateInstanceはレジストリに登録しないと使えないと、どこかで見た記憶があり 更にDirectXのレジストリ登録を見る限り、musicしかなかったので この方法でいけるんじゃないかと思っていました CoCreateInstanceの方で調べて試してみます 指摘ありがとうございました
405 名前:388 できました [2008/02/11(月) 11:27:38 ] #include <iostream> #include <vector> #include <string> #include <windows.h> using namespace std; class dirserch{ vector <string> dirname; vector <int > dir[300]; string path[300]; int n; WIN32_FIND_DATA fd; HANDLE hd; public: dirserch(char *ch); int next(string &str); }; main(){ dirserch dr("c:\\windows"); string str; while(dr.next(str))cout<<str<<endl;} dirserch::dirserch(char *ch){ n=0; path[0]=""; dir[0].push_back(0); dirname.push_back(ch); hd=NULL;} int dirserch::next(string &str){ for(;;){ if(hd==NULL){ int k=dir[n].size()-1; if(k<0){ if(n==0)return NULL; n--; continue; } path[n+1] = path[n] + dirname[dir[n][k]] + "\\"; dir[n].resize(k); n++; hd = FindFirstFile((path[n]+"*").c_str(), &fd);} for(;;){ if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ if(fd.cFileName[0]!='.' || ( fd.cFileName[1]!='.' && fd.cFileName[1]!='\0' )){ int k=dirname.size(); dir[n].push_back(k); dirname.push_back(fd.cFileName);}} else { str=path[n]+fd.cFileName; if(!FindNextFile(hd, &fd)){CloseHandle(hd); hd=NULL;} return 1;} if(!FindNextFile(hd, &fd)){CloseHandle(hd); hd=NULL;break;}}}}
406 名前:388 できました [2008/02/11(月) 11:30:24 ] 全ファイル名を順番に出力する機能って基礎的だと思うのですが、標準にないので作ろうと思いましたよ
407 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:39:33 ] 再帰使わないの?
408 名前:388 できました [2008/02/11(月) 11:41:51 ] 再帰はつかいません パソコンにメモリ管理を任せると、鈍くなったり不安定になるからです
409 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:45:04 ] それだとWindowsやLinuxといったOS自体使えない理屈だが・・・
410 名前:388 できました [2008/02/11(月) 11:46:13 ] メモリというより、データをスタックへ積むコンパイラの仕組みでした
411 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:00:59 ] ファイルの列挙くらいは大丈夫だと思うけど
412 名前:デフォルトの名無しさん [2008/02/11(月) 12:02:05 ] 複数のファイル(1000以上)にランダムに書き込みがある時、 HDDの内蔵キャッシュやwindowsの標準キャッシュの効き目が悪くなるので バッファ付きファイル出力クラスを作ります
413 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:05:26 ] そうか。がんばれ
414 名前:デフォルトの名無しさん [2008/02/11(月) 12:09:05 ] double であることを明示的にするには、数字の最後にLをつければいいですか?
415 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:14:08 ] .0でいいんじゃね?
416 名前:デフォルトの名無しさん [2008/02/11(月) 12:20:12 ] >>415 やっぱりそっちの方がいいかな。 100とか1とか切りのいい数字なんだけど、doubleで計算させたいときに、 せっかく切りがいいのに、100.0とかするのがいやだったんだけど、 100だとintとかにみえてしまう感じ。 やっぱり、.0にしときます。 ありがとうです。
417 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:24:19 ] 整数リテラルにLつけてもlongにしかならんだろ
418 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:27:18 ] 100.でもおkだった気がする。すごく中途半端だけど
419 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:27:22 ] 2.0Lもdoubleではなくね
420 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:27:59 ] bccだと100.0Lにするとdoubleじゃなくてlong double(80bit)になっちまう。
421 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:29:00 ] あるとすればdだよな。あるとすれば。
422 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:30:26 ] > 100だとintとかにみえてしまう感じ 見た目の問題じゃなくて、実際にコンパイラにそう解釈されてしまうよ。 暗黙の型変換はおいておくとして。
423 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:30:29 ] bcc以外でもlong doubleだろう・・・
424 名前:漏れは 100. かな。 mailto:sage [2008/02/11(月) 13:16:38 ] C++なら、double(100)でいいよ。
425 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:19:51 ] てゆーかそれでいいならcでも(double)100でいいだろw キャストだけど
426 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:24:28 ] >>391 ここでは有効かどうか区別できれば十分なんだからNULL使ってもいいと思う。
427 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:40:07 ] >>426 有効なハンドルとしてNULL(=0)返されたらどうすんだ
428 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:41:49 ] 正常なハンドルとして0を返すライブラリの設計がおかしいと考えるんだ。
429 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:43:49 ] おかしくても使わねばならんこともある。
430 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:45:03 ] 0と-1が無効というハンドルもあるのさ・・・
431 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:07:48 ] >>426-430 て言うか、ハンドルはポインタとは違うんだから NULL と 比較するなんて発想する奴はどうかしてると思う。
432 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:13:04 ] しかし型の実体がポインタだから困る
433 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:13:06 ] >>431 ハンドルの正確な定義って何?
434 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:19:45 ] PVOID
435 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:26:24 ] >>433 実体を一意に示す値じゃないの? 正確な表現かどうかわからないけど。 ポインタもハンドルの1つの設計としてありえるし、 整数で0から順に付番する設計も考えられる。
436 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:32:01 ] 実態が何かは関係なく、ハンドルはハンドルとして扱わないと。
437 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:49:17 ] >>436 そういう抽象的なことで逃げるのがWindowsプログラマ
438 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:58:02 ] >>437 まあお前はFILEをいじってドツボにはまってろ。
439 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:59:39 ] >435でも似たようなこと言ってるけど将来的に 実体が変わる可能性もあるからねぇ。
440 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:12:46 ] >>438 MSの下僕乙
441 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:17:16 ] いや待て。Windowsとか関係なく、 ハンドルと、ハンドルの実装は切り離して考えるだろ。 ソフトウェアは抽象化が支えているって習わなかったか?
442 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:43:47 ] 抽象化なんては馬鹿には理解できないと言うだけのことだろ。 かわいそうだから、スルーしてやりなよ。
443 名前:デフォルトの名無しさん [2008/02/11(月) 16:04:00 ] stdio.h読み込むと関数使えますが、 zip.hを自作してこれ読み込むだけでDLLを使用してzipの解凍出来るように出来ますか? ソース内でDLLを読み込まないと無理ですか
444 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:23:19 ] >>443 DLLだって元はソースコードなんだからそれを自分で書けばできるよ。難易度は別にして
445 名前:デフォルトの名無しさん [2008/02/11(月) 16:25:54 ] DLLの関数をヘッダファイルの読み込みだけで使えるようには出来ませんか
446 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:26:49 ] >>445 できるよ
447 名前:デフォルトの名無しさん [2008/02/11(月) 16:28:00 ] やりかた教えて下さい
448 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:28:55 ] ヘッダファイルでロードすりゃいい。コンストラクタとかで。
449 名前:デフォルトの名無しさん [2008/02/11(月) 16:29:49 ] #include "zip.h" main(){ zip_init(); } としてロードする方法しか判りません
450 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:31:23 ] Cなのか?環境くらいはまず書いてくれ。 どうでもいいが、その方法がなぜいけないのだ?
451 名前:デフォルトの名無しさん [2008/02/11(月) 16:33:55 ] printfなど標準関数はロードせずに使えて便利じゃないですか DLLの関数も自動でロードしたら便利になります コンストラクタで自動になるかやってみます
452 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:36:06 ] 思いっきりいろいろ勘違いしている。printfはロードとか関係ない。 zip_init()は初期化のために必要な処理だろ。全然別だ。
453 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:37:45 ] printfとか入ってるlibcは標準でリンクするようになってるからな mathだと-lmいるだろ? ようするになんか勘違いしてないか?
454 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:40:12 ] printfはスタティックリンクなので、ビルド時にlibがリンクされている。 DLLは名前のとおりダイナミックリンクなので、プログラムが自分でリンクしなければならない。
455 名前:443 [2008/02/11(月) 16:47:41 ] できましたよ これでヘッタファイルの読み込みだけで解凍しました class UNZIP{ typedef int (WINAPI *zipfnc)(const HWND , LPCSTR , LPSTR , const DWORD); HINSTANCE hd; zipfnc unzip; public: UNZIP(){ hd=LoadLibrary("UNZIP32.DLL"); unzip = (zipfnc)GetProcAddress(hd,"UnZip");} int & operator ()(char *ch) { char buf[256]; unzip(NULL, ch, buf, sizeof(buf));} } unzip; main(){ unzip("d:\\a.zip"); }
456 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:49:37 ] そのDLLからインポートライブラリ作ってリンクしとけ
457 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:52:42 ] 2つ以上unzipしたときの動作とかも考えとけと
458 名前:デフォルトの名無しさん [2008/02/11(月) 16:53:02 ] この方法では、どういつDLLの関数でもハンドルを個別に用意しなくてはならないですが 便利なので主要なDLLの関数は書き換えようと思います
459 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:56:47 ] DLL見付からなかったらあぼーんだな。その対策入れろよ。
460 名前:デフォルトの名無しさん [2008/02/11(月) 17:50:44 ] 自由落下で物体がどのくらい落ちるか計算させたいんですが、めちゃめちゃな計算結果になります。 どこが間違ってますか? float h; DWORD before = timeGetTime(); DWORD after = timeGetTime(); h -= ( 9.8 / 2 * ( after - before ) * ( after - before )/1000000 );
461 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:51:53 ] >>460 hの初期化してる?
462 名前:460 mailto:sage [2008/02/11(月) 18:05:10 ] >>461 hには元の高さの3.0fが入っています。
463 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:05:49 ] afterとbeforeが同一だったら0除算発生しないか? めちゃくちゃなのはその処理だと思うぞ・
464 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:07:34 ] >>460 先ずはtimeGetTime()を使わずに、自分で時間軸を制御してみたら?
465 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:38:08 ] >>460 h=(1/2)gt^2 だったら -= していくのはおかしいだろ。
466 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:41:18 ] 計算結果を普通に代入すれ
467 名前:460 mailto:sage [2008/02/11(月) 18:46:30 ] beforeはウィンドウが作られたときに数値を入れて、afterは重力計算直前に数値を入れています。 (after-before)の部分を手動で数字の1や2に書き換えたら正常に動作しました。 DWORDとfloatの単位とかの問題ですか? >>465 すみません、落下距離じゃなくて必要なのは現在の高さでした。
468 名前:デフォルトの名無しさん [2008/02/11(月) 18:56:48 ] UNZIP32.DLLの解凍時の進行状況を抑止するにはどうすればいいですか
469 名前:468 [2008/02/11(月) 19:02:03 ] 自己解決しました
470 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:20:58 ] >>467 たぶん>>463 だろうな。 数百メガから数ギガHzで動くCPUからしてみたら、 ミリ秒なんて気の遠くなるほど長い時間。
471 名前:465 mailto:sage [2008/02/11(月) 20:56:12 ] >>467 そうじゃなくて。 h = 3.0 - ( 9.8 / 2 * ( after - before ) * ( after - before )/1000000 ); だろ?
472 名前:デフォルトの名無しさん [2008/02/11(月) 21:00:10 ] 先に質問したものです。 iccについての質問なのですが、-Wall付きでコンパイルすると沢山警告がでます。 これらの警告は対応すべきなのでしょうか? $ icc test.cpp -Wall test.cpp(5): remark #1418: external function definition with no prior declaration double g(double s) { ^test.cpp(6): remark #383: value copied to temporary, reference to temporary used return std::max(s - 100.0, 0.0); test.cpp(6): remark #981: operands are evaluated in unspecified order return std::max(s - 100.0, 0.0); ここで使っているソースはこれです。 #include <iostream> using namespace std; double g(double s) { return std::max(s - 100.0, 0.0); } int main() { double x = 150.0; cout << g(x) << endl; return 0; }
473 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:12:06 ] 警告なんだから、気にならなきゃ別に対処しなくてもいいんでないかい。 おれは、気にする性質だから可能な限り対処するけど。
474 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:48:10 ] >>470 0除算は発生しないよ。乗算してるんだから。
475 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:11:40 ] >>472 remarkは警告ですらないよ。
476 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:15:11 ] >>474 orzぼけていた。
477 名前:デフォルトの名無しさん [2008/02/11(月) 22:24:26 ] ものすごく初歩的な質問でごめんなさい・・・ c++で、任意の位置に文字を表示させる方法を教えてください。例えば「1」を上から100ピクセル100ピクセルの位置に表示させるやり方を。 それと、もう一つ。 文字を上書きする方法を教えてください。上記の「1」の文字を消して「2」に書き換える方法です。 色々検索して調べたのですが、わかりませんでした。 お願いします。
478 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:28:22 ] >>4 とりあえず何に表示してるか教えろ winのコマンドプロンプトか?
479 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:29:25 ] >>477 手始めに、VRAMとかフレームバッファとか呼ばれるものにアクセスする方法を探してみてはどうだろうか。
480 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:29:56 ] >>477 環境によって違うので、先ずは環境を明らかにしてください。
481 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:30:27 ] >>479 ちょw
482 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:49:04 ] 「質問の仕方が」初歩的だと、手の施しようがないよな・・・。
483 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 03:40:09 ] すいません、プログラミングとは直接は関係ないのですが、 他に適当なスレが見つからなかったので質問させてください。 Dev-C++を使ってプログラムを打っているのですが、 プログラムを作成してソフトから実行するとコマンドプロンプトが一瞬で消えてしまいます。 ↓のような簡単なプログラムで試してみましたが無理のようでした。 どなたか解決策が分かるかた教えてください。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("test\n"); return 0; }
484 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 03:40:56 ] getchar();でも入れておけば?
485 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:23:58 ] char型、int型の宣言ひとつで何バイトの領域が確保されますか? 環境によって違うってよく聞くけど例えばXP32bitの場合
486 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:25:40 ] sizeof(char) sizeof(int)
487 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:29:08 ] char型は常に1バイトじゃなかったっけ?
488 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:52:00 ] >>486 ありがとう。そういえばそれで見れたね いつもよくsizeof使ってるのにその発想がでてこなかった >>487 char型はかわらないのか。勉強になりました
489 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:56:23 ] 疑問文の内容をまんま受け入れることで「勉強」しないほうがいいのでは。
490 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 07:18:48 ] char型は常に1バイトだが、1バイトが常に8ビットとは限らないからな。
491 名前:デフォルトの名無しさん [2008/02/12(火) 08:16:21 ] >>490 ?
492 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:18:44 ] 生暖かい目で・・ってのはこういうことを言うんだろうな
493 名前:デフォルトの名無しさん [2008/02/12(火) 08:19:52 ] perlをコンパイルしてC言語から使えるDLLを作成できますか
494 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:21:42 ] 1Byte==sizeof(char)が9bitだったり7bitだったりすることもある
495 名前:デフォルトの名無しさん [2008/02/12(火) 08:22:04 ] アセンブラをソースに埋め込めますが、perlとかフォートランはないですか
496 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:26:22 ] >>494 それは既に論外 charこそ1バイトの基準だとでも思ってるのか? 卵が先か鶏が先かとかいうレベルじゃないぞ?
497 名前:デフォルトの名無しさん [2008/02/12(火) 08:29:26 ] >>493 ですが DLLでなくてもC++から使える方法ならいいです
498 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:53:16 ] >>496 客観的な事実として、 - sizeof(char) は常に1。 - もともと、1文字分のデータ量が「バイト」。 - 1バイトは必ずしも8ビットでない(正確に8ビットを表現したい場合は「オクテット」と言う)。 - 1バイトが6ビットや7ビット、9ビットのアーキテクチャが実在した。 - C99では少なくとも1バイトにつき8ビットあることが保証されている(CHAR_BITは8以上)。
499 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:58:38 ] 疑問を投げかけるだけ投げかけて 496は海の藻屑と消えました。
500 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 09:00:25 ] 組み合わせの計算させるようとしたんですが、出力が0になってしまいます。 ブレークポイントで止めて確認したところ、Anの値がAnrの値より小さくなって いるみたいなんですが何故でしょうか? もしかして表現できる桁数を越えてるから? そうだとしたらこれ以上大きな値が扱える型ないですか? unsigned long long int Kumiawase(int); int main(){ int n=36; int r=6; unsigned long long int Ar=Kumiawase(r),An=Kumiawase(n),Anr=Kumiawase(n-r); cout<<An/(Ar*Anr)<<endl; } unsigned long long int Kumiawase(int n){ unsigned long long int Ans=1; for(int i=1;i<=n;i++){ Ans*=i; } return Ans; }
501 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 09:11:10 ] >>500 36! は 371993326789901217467999448150835200000000 であって、 2^64 = 18446744073709551616 を大幅に越えている。 二項係数の値を求めたいのであれば、 パスカルの三角形を使って足し算だけで求めると良い。
502 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 10:43:24 ] >>501 ありがとうございます。扱える数字をオーバーしちゃってるんですね パスカルの定理調べてみたけどよく分からない… 高校の時の数学の教科書引っ張り出してきます
503 名前:デフォルトの名無しさん [2008/02/12(火) 12:50:57 ] >>497 COMの知識があれば使えるかも。
504 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 13:16:35 ] perlembed ? 俺には無理そうだが君なら!
505 名前:デフォルトの名無しさん [2008/02/12(火) 16:04:32 ] クラス内でchar *filename;というメンバ変数を持っているのですが、 コンストラクタ内で、 filename = "memo.txt"; とかやると、 warning: deprecated conversion from string constant to 'char*' と言われます。static_cast<char *>("memo.txt")としても同じでした。 このワーニングが出ないような書き方はないでしょうか?
506 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:09:15 ] >>505 char *filename → const char *filename
507 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:14:45 ] >>484 言われた通り実行すると、確かにコマンドプロンプトは表示されたままで止まりました。 原因は分かりませんが、しばらくはこれでやってみたいと思います。 もし、どなたか原因が分かる方がいれば教えてください。
508 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:26:28 ] >>507 原因ったって、そのプログラムが一瞬で終了するからだろう。 "test\n" を出力したあと、すぐに return してるじゃないか。 プログラムが終了したら窓は消える。
509 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:30:51 ] >>508 今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、 急にでなくなって困っています。 getchar();を入れた場合は止まりますが、キー入力待ちにはなりませんでした。 言っていることが聞かれている事とちがったらすいません。
510 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:42:18 ] >今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、 そりゃぁ、IDEから起動してたからだろ。
511 名前:デフォルトの名無しさん [2008/02/12(火) 17:57:15 ] #include <iostream> using namespace std; namespace HW { class test { public: test(); virtual ~test(); }; test::test() { cout << "FFF" << endl; } }; int main() { return 0; } これをコンパイルできません。 どうしてですか? /tmp/ccsyUc0A.o: In function `HW::test::test()': samp174.cpp:(.text+0x12d): undefined reference to `vtable for HW::test' /tmp/ccsyUc0A.o: In function `HW::test::test()': samp174.cpp:(.text+0x163): undefined reference to `vtable for HW::test' collect2: ld returned 1 exit status
512 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:15:43 ] >>511 デストラクタの宣言があるのに実体がないから。 ついでに言えば、コンストラクタの後にイリーガルなセミコロンがある。
513 名前:デフォルトの名無しさん [2008/02/12(火) 18:19:13 ] VS2005のC++でDXUT,STL使って開発してるのですが、 class A{ std::string m_name; public: void func(std::string str){ m_name = str; } } このコードがデバッグでは何の問題もなく動くのですが、 リリースにするとfuncを呼び出してm_nameに代入した時にthisポインタが0x000001を指し、 バッファオーバーランで落ちてしまいます。 何かご存知の方が居ればどうかご教授ください。
514 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:22:49 ] コンストラクタの後のセミコロンはネームスペースの終わりのとこだべ。 なくてもいいけど。 で、デストラクタはオブジェクトを作ってないから呼ばれないので、通所は無くてもいいが virtual の場合は別。
515 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:24:58 ] それだけじゃ判らんから、気になったことだけ。 ・なんでstd::stringを値渡ししているの? ・そのAの実体はどこにあるの?
516 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:32:17 ] >>511 namespaceの終わりにセミコロンは不要。 仮想関数には定義が必要。定義が無いと仮想関数テーブル (そのメッセージでいうvtable)のエントリーを作れない。 仮想でなければ呼ばれなければ必ずしも定義は必要ない。
517 名前:デフォルトの名無しさん [2008/02/12(火) 18:40:03 ] >>514 セミコロンは付け忘れました、 まだ継承は知らないのでなんとも。。 >>515 値渡しでうまく動いてたので特に意味なく使ってました、 ためしにfunc(string *str) に変えてみたら見事に動きました。。。 なぜこういう結果になるのかよくわかりません。。。 すばやい解答ありがとうございました。
518 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:42:07 ] >>517 どうでもいいが、>514は>512宛てだ。 ついでに言えば、ポインタ渡しじゃなくて参照渡しにするだろ。常考
519 名前:デフォルトの名無しさん [2008/02/12(火) 18:49:20 ] >>518 勘違いしました、、 なぜデバッグだと動いていたのか、と 値渡しだとだめなのかを知りたいのですが。。
520 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:54:58 ] >>519 >515
521 名前:デフォルトの名無しさん [2008/02/12(火) 19:06:43 ] >>520 というか良く見たらDebugモードになってまして、 Releaseだとやっぱりオーバーランしてましたorz だめだめだ。。。 class A{ string m_str; public: func(string str){ m_str=str; ← }; }; class X{ public: func(string str){ A hoge; hoge.func(str) }; }; DWORD WINAPI doloop(LPVOID lpParam){ x.func("test"); ←xはグローバル変数になってます }; 最初はこんな感じです。。
522 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:11:48 ] >>513 mainもないのが、問題なく動くのか……最近のC++は凄いな
523 名前:513 mailto:sage [2008/02/12(火) 19:13:15 ] >>520 Releaseでビルドプロパティの最適化を無効にしたらReleaseでも大丈夫でした。
524 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:14:50 ] >>521 問題が再現する最小のテストコードを作って 検証してから質問してくれ
525 名前:513 mailto:sage [2008/02/12(火) 19:15:45 ] >>522 mainからdoloopをスレッドで動かしてます。。 簡略化しすぎました。。 DWORD WINAPI doloop(LPVOID lpParam){ while(!bMainLoopExit) { EnterCriticalSection(&cs); x.func("test"); LeaveCriticalSection(&cs); } ExitThread(NULL); }
526 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:16:01 ] class A{ std::string m_name; public: void func(std::string str){ m_name = str; } } int main(int, char**) { A test; std::string str = "abc"; test.func(str); } // これでも落ちるか?
527 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:16:44 ] >>525 まて、複数のスレッドからグローバル変数にアクセスしてるのか?
528 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:18:51 ] このあと、衝撃の新事実が!
529 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:21:42 ] D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); D3DPRESENT_PARAMETERS d3dpp = {0}; 結果に違いはありますか?
530 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:23:24 ] STL使っておいてExitThreadってのも相当ヤバイ匂いがするけどな
531 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:27:49 ] そもそも〜Thread系の関数って使いどころあるのかね?
532 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:27:50 ] うむ、少なくともA::funcが問題って訳じゃなさそうだよね。 ってか、なんで値渡し……?
533 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:36:24 ] 構造体のメンバに、名前と番号両方からアクセスしたいとおもっています。 typedef struct particle{ double data[3][3]; typedef data[][0] position[]; typedef data[][1] verosity[]; typedef data[][2] angle[]; /* ようするに、data[][]に、position[]……という名前でもアクセスしたい */ /* data[][]のままで、loopを回して全部に値を流し込む、ということもしたいので、二重配列も残したい*/ }PARTICLE; 当然のようにエラーなのですが、こういうばあいどのように記述すればいいのでしょうか。
534 名前:513 mailto:sage [2008/02/12(火) 19:38:00 ] >>526 mainの中身を >>521 のX::funcにあたる場所に入れて実行してみましたがだめみたいです。 >>527 そうです。。 >>530 書かなくてもいいけど明示的に書いても良いって書いてあったので書いてあります。 クリティカルセクションで排他処理した気分になって 親が実体持ってるクラスを使ってます。。
535 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:44:25 ] 2chcity.myminicity.com/env 環境優先的に修復を。たぶんこの項目が一番減る。 NEJITUのように少し公園を先行させてもいいかもしれん。 ランク 国名 .... 街名 人口 (増減) 前日 --- 1 US1 .LUELand 314897 (. +528) 314369 --- 2 US2 .GoonTown ......187254 (. +490) 186764 --- 3 US3 .CreateMyCity Forum 105044 (. +804) 104240 --- 4 Slovenia1 Staregate 100076 (+1393) .98683 --- 5 Poland1 #debian.pl .... .90733 (. +618) .90115 --- 6 Germany1 isnichwahr.de .89782 (. +224) .89558 --- 7 Japan1 ...2ch_city .... .69147 (+1870) .67277 --- 8 Germany2 deluxebits .59250 (. +279) .58971 --- 9 France1 .FanaZ . .56613 (+1377) .55236 --- 10 . Germany3 upOTia . .54802 (. +130) .54672 20位までのランクは下記URLご参照ください mmc.from.tv/world.html
536 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:49:09 ] 宣伝するのはいいけど、糞重いページだと注意書きしろよ。
537 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:53:41 ] >>533 typedef union particle{ double data[3][3]; struct { double position[3]; double verosity[3]; double angle[3]; } named; }PARTICLE;
538 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:59:41 ] 例外を投げるときどういう型で投げるのが一般的なんでしょうか? エラーメッセージ? エラーコード? それともクラスで投げて型判別? どういう形がスマートでしょうか
539 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 20:03:05 ] CAtlException
540 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 20:20:13 ] >537 ありがとうございます // strtest.c #include <stdio.h> typedef union particle{ double data[3][3]; struct { double position[3]; double verosity[3]; double angle[3]; } named; }PARTICLE; int main(void){ PARTICLE pt; pt.data[0][0] = 10; printf("%lf\n",pt.named.position[0]); return 0; } >gcc strtest.c >./a.out 10.00000 所望の動作が得られました。
541 名前:513 mailto:sage [2008/02/12(火) 20:42:48 ] 答えてくださった方々ありがとうございました。
542 名前:460 mailto:sage [2008/02/12(火) 21:10:50 ] >>471 ! なるほど。そこの部分と、>>460 では省略した速度のvをintからfloatにしたらなんとなくうまくいきそうな感じになってきました。 ありがとうございます。
543 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:18:08 ] Cの基本的なこと(繰り返しや条件分岐、演算子、ポインタ、構造体)をやってからC++(visual C++)をやろうと思ってるんですが他にCで勉強してた方がいいことってありますか?
544 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:35:53 ] STLとATLで、 std::stack<CAutoPtr<Hoge>> hoges; hoges.push(CAutoPtr(new Hoge())); hoges.top()->func(); とすると、Hogeの実体がすでに破棄されているみたいでエラーが出ます。 std::stack<CAutoPtr<Hoge>> hoges; hoges.push(CAutoPtr(new Hoge())); hoge.top().Attach(new Hoge()); hoges.top()->func(); とすれば動きます。 どうして上のだと捨てられているですか?
545 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:52:39 ] すまぽい
546 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:54:00 ] CAutoPtrってSTLのコンテナに突っ込んで平気だったっけ。実装的に。
547 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:03:06 ] auto_ptrと一緒じゃないか? hoge.top().Attach(new Hoge()); で新たなアドレス突っ込んでるから動くだけで。
548 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:13:30 ] >>529 D3DPRESENT_PARAMETERSがPOD型なら無い
549 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:13:52 ] CAutoPtrが原因だね。
550 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:14:39 ] CAutoPtr専用のコンテナがあったはず
551 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:16:31 ] >>548 そいつたぶん釣りか荒らしかただのバカだよ…。
552 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:16:54 ] それかCSharedPtr
553 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:24:25 ] >>534 スレッド中でWindowsAPIのみ使うならCreateThread, ExitThreadでいいよ。 でもCランタイム使うなら_beginthread, _endthread使わないとダメだぜ。 あと、ExitThread等でスレッド終わらせると、スコープ抜けずにスレッドが終わる。 C++使うなら、ローカル変数のデストラクタ呼ばれなくなるからやめた方がいい。
554 名前:460 mailto:sage [2008/02/12(火) 22:48:42 ] すみません、やっぱり無理でした。 ( after - before )の部分をtimeに置き換える。 ・・・・ 正常に動作。 (ただし、事前に float time = 0.1; を宣言しておく。) ( after - before )の部分を数字の0.1に置き換える。 ・・・・ 正常に動作。 ( after - before )の部分をtimeに置き換える。 ・・・・ おかしい (ただし、事前に DWORD time = 0.1; を宣言しておく。) ここから考えるにDWORD型が悪さをしていると思うんですが、 ( after - before )の部分を( float )( after - before )に置き換える。 ・・・・ おかしい 何か特殊な変換をしなければいけないんでしょうか?
555 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:52:40 ] >DWORD time = 0.1; DWORDが何のtypedefか分かってる?
556 名前:デフォルトの名無しさん [2008/02/12(火) 23:19:54 ] すみません質問です。 下記のようなコードでBar::fugaを初期化する方法が よくわからないのですが、教えていただけませんでしょうか? この場合はやはり引数空っぽのコンストラクタを作るほかに手はないのでしょうか? class Foo{ public: Foo( int hoge ){ ... } }; class Bar{ public: Foo fuga[ 3 ]; Bar( void ) : ???? { ... } };
557 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:22:46 ] >>554 おかしいというときは、after - beforeやtimeの値が0になっているときじゃないか?
558 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:34:52 ] timeGetTimeが何を返す関数なのか理解しないで使っているに1ガバス。
559 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:42:03 ] 戻り値で return *(hoge + (sizeof(piyo) + 2); みたいに書くのって非推奨なんでしょうか?*は無くてもいいんだけれども
560 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:52:53 ] ケースバイケース。 つか、それだけじゃ分からん。
561 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:55:35 ] >>559 まあ、非推奨だろうね。 コンパイルできないし。
562 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:57:36 ] >>559 *があるとないじゃ内容が変わるが?括弧の数が合わないのはtypoでいいよね? 個人的には、あんま複雑になるようならローカルに落として欲しいけど、これくらいなら許容範囲。 ってか、ポインタを+2するだけならreturn hoge + 2;でもいいんでねぇの?
563 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:58:57 ] >>559 何がいいたいのかさっぱり分からない。
564 名前:460 mailto:sage [2008/02/13(水) 00:45:52 ] うあああああああああ!できました! >>555 整数型って分かってたつもりなのに小数いれてました! あと、>>557 で言われたとおりにtimeの値調べてたら、 ウィンドウ生成時に before = timeGetTime(); そして計算時にも before = timeGetTime(); ってやって、afterに何も入ってないような状態になってたような感じでした! 今度こそ解決しました!ありがとうございます!
565 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:53:15 ] そもそもさ、めちゃめちゃな計算結果って具体的にどんなんよ
566 名前:460 mailto:sage [2008/02/13(水) 01:11:10 ] 3Dのモデルを動かしてて、チェックするまでは数字の表示の仕方がよく分からなくて数字に出してなかったんですが、 とりあえず物体のy座標しかいじってないのにカメラの位置が変わってました。
567 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 01:53:03 ] 一時的でなくそこからずっと指定の型で宣言したみたいに扱う方法ってないですか? 例えばchar型で宣言したのを一々(int)とかしなくてもずっとint型として扱う みたいな感じで
568 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:02:10 ] >>567 言いたいことがわからない。キャストを毎回するのが面倒ってことか? ずっとintならはじめからintにしとけばいいんでねぇの?
569 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:08:09 ] >>567 union{ char a; int b; }; ちょっと違うかもしれんが
570 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:08:59 ] >567 #define char int なにが起きても責任とらないよ。
571 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:26:22 ] >>568-470 ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える ようにしたかったんです 関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました
572 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:27:27 ] >>568-470 ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える ようにしたかったんです 関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました
573 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:28:44 ] 「charとint」と「void*とchar*」はだいぶ事情が違うだろ・・・
574 名前:デフォルトの名無しさん [2008/02/13(水) 06:39:24 ] >>514 >>516 ありがとうございます。なるほど、仮想関数は定義が必須なのですね。 あと、純粋仮想関数は定義が必要ないけど、デストラクタの純粋仮想関数の場合は やはり定義が必要になる、というのは正しいですか?
575 名前:デフォルトの名無しさん [2008/02/13(水) 08:56:43 ] 質問です。 マルチスレッドプログラムを作った事がないためわからないです。 スレッドAで作ったデータをスレッドBに渡すには普通どうやって渡すのでしょうか?以前お遊びで作った時、グローバル変数を使って渡したのですがデータが化けちゃったんですね。。 【作りたいもの】 ダイアログベースのターミナルソフト。 ・シリアルデータ受信スレッドでデータを受けて表示用(windowsのメッセージループ待ちをしてる)に送りたい 【開発環境】 VC。MFCはつかいません。猫でもわかるレベル
576 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:45:29 ] AはBの作成者、じゃないのね? グローバルデータが化けた理由がわかれば解決すると思うよ。
577 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:49:28 ] 同時に書き込んだんじゃね? もしくは書き込んでない(初期化してない)のに取得したか
578 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:58:22 ] どうせ排他してないだけなんだろうな
579 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:00:48 ] >>575 多分GUIスレッドにはPostMessage()でブン投げてるんだろうが、 GUIスレッドがPostされたメッセージをメッセージキューから読み取るまでの間に 受信スレッド側からの再Postが発生し得るから、その場合グローバル変数では 当然上書きされてしまうだろ。 Post側は毎回malloc()等でメッセージ用の領域を確保して、受け側で メッセージを処理したらfree()するように汁。
580 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:57:14 ] C++の一時オブジェクトについて質問します。gcc 3.2.1です。 下記のようなコードで"taking address of temporary"のWARNINGが出ますが、 この場合は無視しちゃってもいいですか?いいですよね? #include <stdio.h> class CTmp { public: int x,y; CTmp(int a,int b):x(a),y(b){}; }; int Foo(CTmp* pTmp) { if(pTmp) return pTmp->x + pTmp->y; return 0; } int main(int argc,char** argv) { int result=Foo(&CTmp(1,2)); printf("%d\n",result); return 0; }
581 名前:580 mailto:sage [2008/02/13(水) 11:16:23 ] こうするのがスマートかな。 スマートさ以外で>>580 のまずい点あったら教えてください。 #include <stdio.h> class CTmp { public: int x,y; CTmp(int a,int b):x(a),y(b){}; }; int Foo(const CTmp &Tmp) { return Tmp.x + Tmp.y; } int main(int argc,char** argv) { int result=Foo(CTmp(1,2)); printf("%d\n",result); return 0; }
582 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 11:58:15 ] スマートというかそれが普通じゃね。
583 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:01:25 ] >>580 標準 C++ ではエラーになるはず。 gcc のバグっぽいな。 gcc.gnu.org/bugzilla/show_bug.cgi?id=21386 (だいぶ古いけど CONFIRM されてない。)
584 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:02:19 ] んじゃ、列挙。 ・ポインタである必要が内のにポインタを使うな ・どうしても使いたいならconst修飾しろ ・そもそもデータメンバは公開するな ・クラスに依存する関数ならメンバにしろ
585 名前:デフォルトの名無しさん [2008/02/13(水) 12:15:31 ] 下記のように、fstreamの参照に、ifstreamを渡したいのですが、できません。 そこで、fstream *fsというようにポインタにしてやってるのですが、参照で やる方法はないでしょうか void func(fstream &fs) { return; } int main() { ifstream ifs; ifs.open("ttt"); func(ifs);
586 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:19:49 ] return文で計算したりって避けてたけど結構普通にやるもんなんだな
587 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:20:57 ] >>585 fstream は読み書き両用。読み取り専用の ifstream を渡せないのはあたりまえ。 なんで ifstream& にしないの?
588 名前:580 mailto:sage [2008/02/13(水) 12:26:17 ] >>582-583 レスありがとうございます。 まあ動くけど将来にわたって安全とは言い難い、 ってかやはり>>581 推奨ってとこですかね。 >>584 あくまでサンプルなんで御容赦ください。 でもお気遣い感謝します。
589 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:46:25 ] まずい点あったら教えてくれと書いてるのに まずい点を指摘したら言い訳ってどーなんだ
590 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:46:29 ] >>585 ファイルストリームのクラス階層を確認してみるべき。 fstreamとifstreamは継承階層の中で関係が全く無い。
591 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:53:03 ] >>589 いや、質問の主眼が"taking address of temporary"のWARNINGでしたので。 その他は瑣末なことと手を抜いてしまいました。 とりあえずお詫びまで。
592 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:56:48 ] まあありゃ誰がどう見てもただの揚げ足取りだな
593 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:03:19 ] >>585 ちょっとややこしいけど、そのコードには、一般によくある勘違いにかすっている 君独自の勘違いがある。 まず、ifstreamはistreamを継承してる。fstreamは、iostreamを継承してる。 そのiostreamが、istreamとostreamを継承してるから、つまり両者に共通する近い祖先はistream。 iostreamはistreamの子だけど、fstreamはifstreamの子ではない。これが一般に良くある勘違い。 で、君はこれを踏まえて、fstreamにifstreamを渡すという、更なる勘違いをしてる。 読み書き両用クラス「が」読み取り専用クラス「の」子であるのは明白なわけで、つまり君は、 このセンスがまだ身についていないか、あるいは、普通に渡すだけでダウンキャストが可能になるという、 C++の仕様に対する勘違いをしていることになる。
594 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:19:14 ] std::cinをstd::ifstreamに渡しても問題なかですか?
595 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:36:47 ] std::istreamじゃイヤなのか? なぜ f が必要?
596 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:47:04 ] >>593 そんなくどい説明必要ない。 クラス階層見れば一発で分かる。 他人の勘違いまでも決め付けるなんて教えたがりも甚だしい。
597 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 14:10:16 ] >>596 現実に「クラス階層見てない」人なんだし、 他に可能性が無い状況は決めつけとは言わないよ。 変な理屈で変なスイッチ入っちゃった人に絡まれるのってやだなぁ。
598 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:23:56 ] using namespace std; は何かヘッダをincludeした後じゃないとだめなの?
599 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:28:19 ] 書くだけならお好きにどうぞ
600 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:39:47 ] VCで先に書くとstdと認識してくれないのですが
601 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:41:55 ] makeファイルがLinux、Windows、Macを識別する方法を教えてください
602 名前:デフォルトの名無しさん [2008/02/13(水) 15:46:10 ] >>600 これを機会にusing namespace std;をグローバルに置くのを やめちまいなよ
603 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:50:50 ] どこに置くのが正解なのでしょうか? mainの中?
604 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:58:42 ] グローバルに置くのが正解
605 名前:602 [2008/02/13(水) 16:00:48 ] >>603 いや、mainの中の先頭に置いても良いけど スコープはmain内だけであってまぁ・・なんていうか・・・ using namespace std;の宣言自体を俺は勧めない
606 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:11:52 ] >>603 原則 using を使わず全部書くのが推奨だな
607 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:18:05 ] std::vector<int> hoge; 面倒でもこういう記法に慣れるが吉。
608 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:25:19 ] cout cin endlくらいはusing宣言したいな
609 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:39:53 ] (swap内で) using std::swap; using boost::swap; using 俺ライブラリ::swap; (definition内で) using namespace boost::spirit; これしか使ってないな
610 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:44:03 ] >>608 おれもそう思う。stdにいろいろ詰め込み過ぎだ。
611 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:55:48 ] ::boost::mplを使うときに 専用の名前空間に放り込んでusing namespace ::boost::mpl;してから 共通名前空間にエイリアスとなるメタ関数を書くようにする ぐらいは許してください
612 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 18:52:47 ] 専用名前空間って、それのためにしか使わないなら、 名前空間のエイリアスnamespace hoge = boost::mpl;で十分では? それに限らず、cppファイル内ではよくやるんだが。 namespace bll = boost::lambda; namespace algo = boost::algorithm; namespace dr = System::Drawing;
613 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:36:33 ] VC++のusing namespaceは壊れてるから 専用の名前空間でも使わない方がいいよ
614 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:52:15 ] std::mapから登録していないKeyつかって[]で取り出そうとすると 出来立てのValueが返ってきますか?
615 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:55:30 ] うん
616 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 03:32:31 ] _beginthreadでマルチスレッドで実行する関数って戻り値設定できないの?
617 名前:デフォルトの名無しさん [2008/02/14(木) 03:53:29 ] くずたれの質問ですいません class内でのstaticメソドはどういう役割をするんでしょうか csharpやjavaだとわかるんですが C++でのstaticメソッドは、いまいち解りません どなたか解説お願いしていただけないでしょうか
618 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 03:58:05 ] >>616 _endthreadex()を使えば整数は返せる。
619 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 03:58:44 ] >>617 C#やJavaと同じだと思うんだけど。なんで違うと思うの?
620 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 04:26:56 ] win32が名前空間対応してくれればいいのに
621 名前:デフォルトの名無しさん [2008/02/14(木) 10:06:21 ] vectorを初期化するときに、配列を初期化するみたいに、 vector<int> vec = {1,2,3,4,5,6}; みたいな書き方をする方法はありませんか?
622 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:08:44 ] >>621 その書き方は現行の C++ ではコンパイルできない。 「みたいな」という幅がどこまであるのかによっては、 似たような書き方ができることもあるけど。
623 名前:デフォルトの名無しさん [2008/02/14(木) 10:22:11 ] batファイルで、処理の途中でキー入力を求められるとき どうすれば入力できますか? パスワード入力を自動的に行いたいのです。
624 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:32:29 ] >>621 >>10
625 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:34:51 ] 誤爆してしまった… C/C++でGUIを実装する場合、どういった手段が適当でしょうか?(Windows環境) 色々調べてみたところ ・実際の職業プログラマさんなんかはC#やVB.NETみたいなのを使う ・WinAPIを直接、みたいなことは趣味でやる人が使う (山を登るのに、ロープウェイを使うのが賢いが趣味で山登りを楽しむ人がいるみたいな意味で) で、実際人に聞くと今度はMFCという意見が出てきました 調べるとWinAPIを糖衣したようなもののように感じたものの情報がすごく少ない と、こんな感じでして、どっちに進むべきか悩んでいます やりたいのはどっちだ、というのは手段と目的がryってやつでGUIの実装の手段をどうしたものか、という質問です C#/VB.NETというものも一応考慮のうちに入れておきたいです (GUIの実装はC/C++の枠を超えればそれがベターだから、という意見も考慮したいからです) それではよろしくお願いします
626 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:36:58 ] >実際の職業プログラマさんなんかはC#やVB.NETみたいなのを使う 業種にもよるけどMFC使ってる職業プログラマも多いよ むしろそっちの方が多いはず MFCの情報が少ないのは調べ方が悪いと思う
627 名前:デフォルトの名無しさん [2008/02/14(木) 10:44:20 ] template <>の中にかけるのは、classと、typename、それにintだけですか?
628 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:46:03 ] >>623 スレ立てるまでもない質問はここで 第89刷 pc11.2ch.net/test/read.cgi/tech/1202726651/ SET /P password=
629 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:56:59 ] >>627 type parameter non-type parameter(intは可 現規格では幾つか制限アリ) template template parameter(デフォルト引数は考慮されないことに注意) の三つがOKだよ。 (例) template<typename T> template<int I> template< template<typename, typename> class C >
630 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:59:57 ] template<class A, class B> void Foo( B b ){} という関数があったとき、使う側で Foo<int>( bar ); と引数から特定できない型のみを指定できるのは、 C++において正しい仕様なのでしょうか?VS2005では一応コンパイルが通る ようですが…
631 名前:625 mailto:sage [2008/02/14(木) 11:05:33 ] >>626 なるほど・・どうにもうまく調べられないようで、ちょっと離れたプログラム関連の本が多い 書店へ行ったのですが、MFCについての本は独習シリーズを書いている方のものが1冊(古い)と その他薄いものが何冊かしかありませんでした それと合わせて情報が少なくマイナーなのかと思ってしまっていました もうちょっとMFCについて調べてみます
632 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 11:08:19 ] というかそのプログラム関連書籍が多い書店を教えて欲しいw
633 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 11:23:26 ] 池袋にあるジュンク堂ってとこです 大型書店何件か回ったけどあそこが群を抜いて多かったです
634 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 11:30:11 ] あそこいいね 立ち読み客のために椅子まで用意されてたし ちょっと前まで近所だったからよく行ってたよ
635 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 11:49:07 ] ただちょっと会計が面倒ですよね 一応MFCやってみようと思います、WinAPI知らないままで不安ですが独習シリーズの人の本買ってみようと思います ありがとうございました
636 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:18:20 ] 今更MFC?…… 目的にも依るし、ここで続けるのもスレ違いだから詳しくは書かないけれど。
637 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:19:34 ] MFCはこれから落ち込んでいくんじゃないか?.NET系(C#とか)やるべきだと思うの俺だけ?
638 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:31:40 ] 落ち込んでから.NETなり時代に沿ったものに切り替えればいい 目的にもよるけど
639 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:45:38 ] MFCはまあ、最初の枠組みやってくれるのだけあてにして使ったりするな。
640 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 13:07:23 ] >>621 ttp://www.kmonos.net/alang/boost/classes/assign.html
641 名前:デフォルトの名無しさん [2008/02/14(木) 13:28:04 ] サブスレッドがデータ更新した事を知るためにはwhileなどで繰り返しチェックする以外にどのような方法がありますか
642 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 13:29:25 ] >>635 その本は良書だしMFCを少しでも触ったことがあれば難しくはないが、 MFCの情報を探し出せないという検索の腕からいってもお前さんにその本はまだ早い。 というかMFCなんて仕事で必要でない限りは今更初心者が手を出すべきものでもない。
643 名前:641 [2008/02/14(木) 13:32:48 ] イベントドリブンっていうのはきいたことあるのですが、BCBとかでは無い標準のC言語、C++でどうやるのかわかりません
644 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 13:51:27 ] >>641 Windowsならイベントオブジェクト、Unixなら条件変数 >>643 標準のC/C++にサブスレッドなんて概念は無いと思うが…
645 名前:641 [2008/02/14(木) 14:02:49 ] サンクス
646 名前:デフォルトの名無しさん [2008/02/14(木) 14:13:28 ] CreateEvent() の使い方がわからないので適当なSleepいれてwhileでチェックしようかと思うのですが CreateEvent()のほうが断然良いですか? たとえば500msとか、100msとか待ったとき CreateEvent()のほうが即時性とCPU負荷低いですか
647 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:15:07 ] やってみると、それ自体は簡単だからまずやってみろって。
648 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:16:31 ] 断然良いです 即時性は高いです 負荷は100msも寝るなら大差ない
649 名前:デフォルトの名無しさん [2008/02/14(木) 14:18:13 ] DLLにしたいんのですが、なるべく負荷を下げたいんです 一つのサブスレッドがデータを受信したらそれを知りたいのですが、間隔は2〜10秒くらいです whileで監視しても変わらないですか
650 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:20:42 ] 少しでも下げたいならイベントオブジェクトの方がいいんじゃね 通知が来るまで寝っぱなしだし 100msごとに起きるよりは当然
651 名前:デフォルトの名無しさん [2008/02/14(木) 14:22:04 ] 初心者がわかる文書ありませんか
652 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:30:41 ] CreateEventの使い方なんか簡単だ。 HANDLE handle; handle = CreateEvent(NULL, FALSE, FALSE, NULL); これで良い。
653 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:31:42 ] winapiのメリットってなんでsか
654 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:34:42 ] >>653 何に対するメリット?比較対象は?
655 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:41:07 ] ウィンドウプロシージャではよくswitchが使われていますが、 ifではなくswitchを使う理由みたいなものがあるんでしょうか?
656 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:42:24 ] >>655 ifでも書けるから、ためしにifで書いてごらん。 理由がわかると思うよ。
657 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:48:20 ] int main(void){ for(;;) return 0; } これのコンパイルが普通に通って(´・ω・`)?ってなってるんですが、 ぶら下がり文って次の行でなくても許されてるんですか?
658 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:51:34 ] 空白文字(改行含む)はいくらあっても構わない形式なのです。
659 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:51:35 ] for (;;) return 0; って解釈されてるんだろ
660 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:54:21 ] >658-659 なるほど、どうもです。 同じ行か、次の行までしか許されないもんだと思いこんでました。
661 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:54:45 ] >>657 こんなのでも普通にコンパイル出来るよ びっくり? int main( void){ for( ; ;) return 0;}
662 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:58:05 ] >>661 たぶん、そういうのはわかっちゃいるけど、「ついなんとなく」 ぶら下がり文に対してだけ異なる感覚を持ってしまったんだろう。
663 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 15:01:51 ] p r i n t f ( " t e s t \n " ); でもこれは通らないんだね(´・ω・`)
664 名前:641 [2008/02/14(木) 15:02:00 ] サンクス できましたよ #include <iostream> #include <windows.h> #include <process.h> using namespace std; HANDLE handle; unsigned WINAPI fnc(void *x){ int n=(int)x,m; m=3000-n*300; Sleep(m); cout<<n<<"ban "<<m<<"msec Sleep\n\n"; SetEvent(handle);} main(){ handle = CreateEvent(NULL, FALSE, FALSE, NULL); for(int n=0;n<10;n++){ _beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL);} while(1){ WaitForSingleObject(handle, INFINITE); cout<<"main reep ga ugoita\n"; }}
665 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 15:05:42 ] >>656 if(○○ == WM_xxx) ○○ ==の部分を毎回書かなければいけない事くらいしか思い当たりません。 その代わりbreak(もしくはreturn)がいらないので記述ミスが減るかなぁと。 と書いているうちに一つ思い浮かんだのが、breakを挟まないことで case WM_CREATE: 〜処理1〜 case WM_PAINT: 〜処理2〜 break WM_CREATEがきたときは処理1,処理2をどちらも行うという事が出来ますね。 これがswitchを使う理由ですか?
666 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 15:12:56 ] >>665 そもそもswitch文の存在理由を考えてみるといいかと およそほとんどのswitch文はif文で書けるわけだし、 C言語のswitch文って要らないよね、ってのは、 それはそれでひとつの考え方だが…
667 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 15:14:05 ] ぶっちゃけswitchでできることはみんなif-elseでできるし、 while、do-whileでできることはみんなforでできる。 選ぶ基準はどっちが見やすいか、書きやすいか。
668 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 15:23:30 ] >>630 正しい仕様です。
669 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 17:03:06 ] >>668 ありがとうございます。安心して使うことができます。
670 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 18:08:59 ] 店で売ってるソフトって大半がMFC製じゃないの?
671 名前:デフォルトの名無しさん [2008/02/14(木) 18:49:22 ] wchar_tの文字列をcharの文字列に変換したいのですが char buf[256]; wchar_t wbuf[] = _T("Test123あいうアイウ"); int c; setlocale(LC_ALL,"ja"); wcstombs_s(&c,buf,256,wbuf,256); ではwbufに入っている「Test123」までがbufにコピーされ、それ以降は無視されているようです。 理由を教えていただけませんか?
672 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 18:55:03 ] 変換できないワイド文字が検出されたのでその直前で変換を打ち切った
673 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 19:40:47 ] "ja"がロケール文字列として有効なのか怪しいな。 単にsetlocale(LC_ALL, "");で試してみたら? あと、本当のワイド文字列リテラルに_Tは使うな。直接L付けろ。 wchar_t wbuf[] = L"Test123あいうアイウ";
674 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 19:54:01 ] Windows だったら setlocale(LC_ALL, "japanese"); だったと思う
675 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 20:12:53 ] WCHAR
676 名前:デフォルトの名無しさん [2008/02/14(木) 21:13:33 ] >>672-675 ありがとうございます setlocale(LC_ALL, "japanese"); で解決しました。
677 名前:デフォルトの名無しさん [2008/02/14(木) 22:00:06 ] ttp://www.uploda.org/uporg1251163.zip.html (展開時9.7KB程度) Windowsゲーム向けタイマクラスを作ってみたんですが (1/60秒休んで累積の休憩時間からfpsや簡易CPU率を取得する機能) どうにも少しでも負荷がかかるとWindowsタスクマネージャで見てると まだまだCPUが余裕な割に53fpsくらいに落ち込んでしまいます。 もうすこし改良したいと思うのですが、どこか改良の余地はありますでしょうか?
678 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:05:20 ] タイマーをパワーアップ
679 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 00:55:33 ] >>677 あまり詳しく見てないけど、 Sleepが1/60秒以上帰ってこないことが7回/秒あったら53fpsになるのかな? Sleepの精度なんてそんなもんだし。 理論値どおりに増加するフレームカウンタを作り、 実際に処理できたフレーム数がそれに追いついたら休む、 追いつくまでは休まず連続して何フレームでも処理する、 とすれば、平均のfpsは理論値と合う。
680 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 00:57:29 ] こんな感じで見やすくC++の標準関数載せてくれてるサイトありませんか? ttp://cham.ne.jp/piro/p_stdfunc.html
681 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:03:00 ] ttp://www.cppll.jp/cppreference/
682 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:15:08 ] >>679 「どうしても追い付けなければスキップすることも辞さない」も入れとくべきではないか?
683 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:17:05 ] バイナリファイルについての質問です。 とあるバイナリファイルの中に、12ビット単位でひとつの要素となるデータが99バイト分入っています。 これを3バイトずつファイルから読み出して12ビット単位で区切り、short型に変換して 再度バイナリファイルに書き出したいと思っています。 この場合、バイナリモードでファイルを開いて、char data[3]にread関数で3バイト格納しても シフト演算子が使えないため、上手く12ビット単位でデータを取得することができません。 何か良い案ないでしょうか?
684 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:24:09 ] >>683 「シフト演算子が使えない」と思い込む根拠は? まぁ、環境依存上等でビットフィールドを使うか、自前でビット演算するかの違いだけどね。
685 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:24:18 ] やり方は色々あるけど、とりあえず3byte読んでから4byteの整数に格納sすれば?
686 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:27:43 ] >>683 short a1 = (unsigned short)data[0] << 4 | (unsigned short)data[1] >> 4; // 前半12bit short a2 = (unsigned short)data[1] << 8 | (unsigned short)data[2]; // 後半12bit これでだめかや?
687 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:31:54 ] 訂正 short a1 = (unsigned short)data[0] << 4 | (unsigned short)data[1] >> 4; // 前半12bit short a2 = (unsigned short)(data[1] & 0x0f) << 8 | (unsigned short)data[2]; // 後半12bit
688 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:33:49 ] a1とa2もunsigned shortでいいと思う。 俺の個人的嗜好だけど。
689 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:38:19 ] a1, a2はunsigned shortにすべきだな。 それはそうと、 a1 <- data[0].u data[0].l data[1].u a2 <- data[1].l data[2].u data[2].l って並びなのかな。 a1 <- data[1].l data[0].u data[0].l a2 <- data[2].u data[2].l data[1].u って並びの可能性もありそうだが。
690 名前:デフォルトの名無しさん [2008/02/15(金) 01:47:13 ] VC++のインラインアセンブラで64bitの整数の掛算(UInt32x32To64のような物)をやりたい訳ですが どのようにすれば良いのでしょうか。 32bitなら以下で良いみたいですが64bitのやり方がわからず・・・。 int mul(int a, int b) { _asm{ mov eax, a mov ebx, b mul eax, ebx } }
691 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:54:36 ] >>685 〜688 お〜なるほど、とても助かりました。 シフト演算が使えないと言ったのは自分の知識不足です。 3バイトのデータを一気にシフト演算しようとしていました。 上手くいきました。ありがとうございます。
692 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:55:49 ] 解決したと思ったら、もう一個質問ができました。すいませんが、こちらもお願いします。 読み込んできたデータを次の関数で共用体に格納して、bit単位でいじってるんですが、どうも上手くとれません。 いろいろ省略していますが、以下のような感じです。 テストデータ(バイナリ) 11111111 11111111 11111111 共用体 union UNION{ unsinged char data[3]; struct { unsinged short element1 : 8; unsinged short element2 : 3; unsinged short element3 : 5; unsinged short element4 : 1; unsinged short element5 : 7; }FILED; } 処理 UNION A; read (fd , A.data , 3): printf("%d\n" , A.FILED.elemnt1); ←255が出力される printf("%d\n" , A.FILED.elemnt2); ←7が出力される printf("%d\n" , A.FILED.elemnt3); ←31が出力される printf("%d\n" , A.FILED.elemnt4); ←何故か0が出力される printf("%d\n" , A.FILED.elemnt5); ←127が表示される 4番目の要素が1と表示されるません。 これはなんででしょう?
693 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:00:33 ] unionの使い方間違えてないか?
694 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:02:51 ] >>690 64ビットの値を返すときは、EDX:EAX。 こんな関数をコンパイルさせたら、 long long mul(int a, int b) { return static_cast<long long>(a, b); } こんな出力だった。 ; Line 3 mov eax, DWORD PTR _a$[esp-4] imul DWORD PTR _b$[esp-4] ; Line 4 ret 0
695 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:02:56 ] >>692 試しに、printf("%u\n", A.FILED.element4)にしてみたら? >>693 適切かどうかは兎も角、間違ってはいないんじゃないか?
696 名前:692 mailto:sage [2008/02/15(金) 02:19:25 ] >>695 上手くいってないような雰囲気です。 どっか自分が処理を間違えているかもしれないので、 原因を探してみます。
697 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:47:09 ] 手元のgccだとちゃんと1になるけどなぁ。
698 名前:デフォルトの名無しさん [2008/02/15(金) 02:47:14 ] >>694 上位32bitがEDXに格納されるのは解りました。 それをどうやってUINT64の変数に代入するのでしょうか。 一応、以下みたく物凄く邪道な感じでやってみたり・・・ UINT64 mul64(UINT a, UINT b) { FILETIME c; _asm { mov eax, a mul b mov c.dwHighDateTime, edx //mov dword ptr [ebp-8],eax mov c.dwLowDateTime, eax //mov dword ptr [ebp-4],edx } return *(UINT64*)&c; } >mov dword ptr [ebp-8],eax >mov dword ptr [ebp-4],edx のインラインアセンブラでの正しい記述方法が解らないです。
699 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:54:44 ] >>698 C側で対処するならこんなんとか。 union { struct { uint32 l; uint32 h; } s; uint64 w; } c; _asm { mov c.s.l, eax mov c.s.h, edx } return c.w;
700 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:56:12 ] これでいいよ。 __declspec(naked) UINT64 __cdecl mul64(UINT a, UINT b) { _asm { mov eax, a mul b ret } }
701 名前:デフォルトの名無しさん [2008/02/15(金) 03:29:18 ] >>699 なるほど、適当に構造体定義してやればいいのか。 >>700 これは警告も出ないしスマートだし関数でやるならこちらが良いですね。 解決です。ありがとうございました。
702 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 04:57:05 ] >>681 ありがとうございます。C++はCの標準関数+これらが使えるのね
703 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 05:17:09 ] こんな感じでも行ける UINT64 res; _asm { mov eax, a mul b mov dword ptr[res], eax mov dword ptr[res+4], edx } return res;
704 名前:デフォルトの名無しさん [2008/02/15(金) 14:36:08 ] DLLから要求があるまで動作を停止したいのですが、どのようにしたらいいんでしょうか? メインのグローバルハンドルを共有出来ないですよね?
705 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:01:58 ] >>704 環境とやりたいことを具体的に。どうせ、Windowsだろうけど。
706 名前:デフォルトの名無しさん [2008/02/15(金) 15:33:29 ] すみません 似たような質問なんですが WaitForSingleObject( HANDLE hHandle, // オブジェクトのハンドル DWORD dwMilliseconds // タイムアウト時間 ); ってHANDLEがNULLになるまで待つんですか?どういう価でうごくか教えて下さい
707 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:36:24 ] hHandleがシグナル状態になるか、タイムアウトになるまで待つ。 シグナル状態は、そのhHandleが何かによって変わる。 CreateEventしたやつならSetEventしたやつ、とかね。
708 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:40:37 ] >>706 もしそれが、WinAPIのWaitForSingleObjectならば>707。 詳しくは、MSDNかAPIスレへ。 もしそうでないなら、環境を提示すること。
709 名前:デフォルトの名無しさん [2008/02/15(金) 16:13:48 ] サンクス
710 名前:デフォルトの名無しさん [2008/02/15(金) 20:52:12 ] HTMLの文字コードをS-jisにしたいのですが、インターネットエクスプローラで読み込んでS-Jisで書きだというのをC言語でできませんか
711 名前:デフォルトの名無しさん [2008/02/15(金) 20:53:50 ] 文書全体をS-jisに変換してタグを書き換えるというのでは正しく表されないことが多いです インターネットエクスプローラは変換精度が高いです
712 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:16:31 ] すいません、質問があります。 { A a; B b; } と二つのクラスを確保したとき、デストラクタの呼ばれる順番というのは仕様で 定められているのでしょうか?それとも不定なのでしょうか? よろしくお願いします。
713 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:21:15 ] デストラクタは、コンストラクタが呼び出されたの全く逆の順で呼ばれる。
714 名前:デフォルトの名無しさん [2008/02/15(金) 21:23:44 ] すいません。1次元固定配列をを積み重ねて、 2次の動的配列にしたいのですが。 data[4]固定 data[4] data[4] ↓ 動的 typedef std::vector<int> Four; std::vector<Four> data; にすれば確かに動作するのですが、 これでは両方1次も2次も動的です。 よそのスレで typedef int Fou[4]; std::vector<Four> data; とすればいいと言われましたが スレ違いでこれ以上尋ねるわけにも行かずこちらへ 来ました。 Four four; for(i=0; i<5; i++){ for(j=0; j<4; j++){ four[j]=j; } data.push_back(????); } ここの????の書き方が分かりません。 よろしくお願いします。
715 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:27:13 ] >>713 すばやい回答ありがとうございます。継承の時と同じなのですね。
716 名前:デフォルトの名無しさん [2008/02/15(金) 21:31:00 ] >714 すいません、コピーがうまくいきませんでした。 書き込みがTABを上手いこと反映してくれないみたいですね。
717 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:32:58 ] >>710-711 日本語でおk
718 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:48:34 ] >>714 push_back は無理。 構造体にするならいける。 struct Four { int four[4]; };
719 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:50:00 ] boost::array<int, 4>ってvectorの要素にできない?
720 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 22:19:07 ] できる
721 名前:デフォルトの名無しさん [2008/02/15(金) 23:03:34 ] 関数の中でたまにでてくる参照引数 (int & みたいな・・) ってどういうとき使うんですか?? 複数の関数内で1つの変数を使いたいときとかですか?
722 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:04:13 ] >>721 コピーコンストラクタ作るとき
723 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:05:43 ] >>721 ・ 呼び出し元の変数の値を変更したい時 ・ 巨大なオブジェクトをコピーせずに関数に渡したい時
724 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:12:44 ] //身長を整数値として読み込んで標準体重を実数で表示 #include <stdio.h> int main() { int na; int weight; printf("身長を入力してくれ:"); scanf("%d", &na); weight = (na - 100) * 0.9; printf("標準体重は%4.1f Kg", weight); return 0; } これを実行しても標準体重が0.0 Kgになるんだけどどこを改善すればいいのでしょうか?
725 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:14:04 ] >>724 ×int weight; ○float weight;
726 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:17:22 ] >>724 そのコードでちゃんと警告を出してくれるコンパイラに換えるか、そのように設定する。
727 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:36:08 ] >>725-726 こんなのも分からん馬鹿でサーセン。cygwin使ってるんだけどロクに設定もできていないもんでして。 ありがとうございます。
728 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:36:33 ] △float weight; ○double weight;
729 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:41:41 ] >>727 つ[gcc -Wall foo.c]
730 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:46:09 ] gcc -ansi -pedantic -Wall オススメ
731 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:47:50 ] 寧ろ、gcc -std=c99 -Wall -pedantic で。
732 名前:デフォルトの名無しさん [2008/02/15(金) 23:59:03 ] >718 構造体にしたらできました。 ありがとうございます。
733 名前:デフォルトの名無しさん [2008/02/16(土) 00:01:46 ] >719 boost::array自体が定義できないけど、必要なヘッダファイルとか あったら教えてください。 VC6.0を使っています。
734 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:10:27 ] >>733 まずはBOOSTでぐぐって来るんだ
735 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:35:37 ] VC6 でコンパイルできるかなあ。 まあ array くらいならできるか。
736 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 01:41:19 ] 環境ってMicrosoft Visual C++ 6.0って書けば分かる?
737 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:04:52 ] 考えてある程度予想してみたんですが、この考えで合ってますか? 質問大量ですみませんが (1)char *p="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";やc="aaaaaaaaaaaaaaaaaaaaaaaaaaaa" ↑ポインタってアドレスを格納するのに何で文字列を入れれるの? これはどこのアドレスを入れてるの? 自動的に領域を確保して"aaaaaaaaaaaaaaaaaaaaaaaaaaaa"を入れてそのアドレスを入れてるってことですか? もしそうだとしたら、関数内で宣言してその関数からでた場合はその領域は開放されるんでしょうか? (2)cout<<sizeof(c)<<endl;とした場合4になる どうみてもaは5つ以上あるのになんで4なの? これはchar *pのサイズ(参照するアドレスを入れる領域のサイズ)だからですか? ちなみにstrlenだと35でした。 (3)sprintf(c,"aaaaaaaaaaaaaaaa");や strcpy(c,"aaaaaaaaaaaaaaaa");でコンパイルして実行するとエラー これは確保されていない領域に無理矢理文字列を突っ込もうとしてるからですか?
738 名前:737 mailto:sage [2008/02/16(土) 04:07:15 ] ごめんなさい間違えました。cを全部pとして考えてください ついでに言うと(1)の2つめはこんなの char *p; p="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
739 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:14:11 ] 文字列リテラル(" " で囲んでるやつ)は、 その文字列の置いてあるアドレスを返す。
740 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:18:58 ] ありがとうございます。ということは プログラム起動した時点でa〜zや日本語,記号の全ての文字がメモリのどこかに 自動的に置かれるってことですか? それとも"aaaa"の部分を実行した時点で文字列"aaaa"がメモリに置かれる?
741 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:19:58 ] 起動した時点で置かれてる。
742 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:20:42 ] 起動した時点で、"aaaa" が置かれる、ね。
743 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:27:32 ] >>741-742 ありがとうございます。今まで知らずに使ってきました。 ずっと気になってたので教えてもらえてスッキリした
744 名前:デフォルトの名無しさん [2008/02/16(土) 08:26:22 ] >735 げ、自分でコンパイルするのか。 c++標準なのかと思った。
745 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 08:33:14 ] >>744 Boostは事実上の準標準。 一部のライブラリ以外はヘッダのincludeのみで使える。
746 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:08:08 ] >>737 > (3) sprintf(c,"aaaaaaaaaaaaaaaa");や strcpy(c,"aaaaaaaaaaaaaaaa"); > でコンパイルして実行するとエラー > これは確保されていない領域に無理矢理文字列を突っ込もうとしてるからですか? 違う。 領域は確保されているが、文字列を突っ込めない (要は、書けない) 領域だから。 エラーになるかどうかは環境によって異なる。 素直に書き換わる環境もあるし、単に書き換わらないだけとか、全然別の場所の 文字列が勝手に書き換わるとかすることもある。 要するに、文字列の領域を書き換えるのは基本的にやってはいけない。 >>741-742 規格でそんなこと決まってたっけ?
747 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:25:51 ] >>746 staticな変数と同じ寿命に決まっている。
748 名前:デフォルトの名無しさん [2008/02/16(土) 09:39:06 ] HTMLファイルの構文を解析して、UTF8形式をS-JIS形式に変換するにはどうすればいいですか?
749 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:40:49 ] >>748 っ NKF
750 名前:748 [2008/02/16(土) 09:41:44 ] インターネットエクスプローラで読み込んで、S-jisで保存するのをプログラムでやりたいんです
751 名前:748 [2008/02/16(土) 09:43:06 ] >>749 すみません よんでませんでした NKFはやったのですが、エンコード属性が指定されていたりして、文字化けしてしまいます タグを解析する必要があるんです
752 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:59:59 ] >>747 そもそも static な変数の寿命なんて決まってたっけ? 例えば、自動変数の寿命ははブロックに入った時から出るまでじゃないだろ。 利用されている区間がかぶらないとわかれば、違う変数を同じレジスタに割り 当てるコンパイラは珍しくない。 それと同じで、利用されてる区間がかぶらない static 変数を同じ領域に割り 当てちゃいかんのか?
753 名前:デフォルトの名無しさん [2008/02/16(土) 10:08:02 ] インターネットエクスプローラの名前をつけて保存 (エンコード指定) だけを利用するには どうすればいいですか?
754 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 10:40:02 ] >>752 のいう同じ領域っていうのは物理メモリの領域を指してるの?
755 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 10:44:34 ] >>753 「IEコンポーネント」で調べてみては?
756 名前:デフォルトの名無しさん [2008/02/16(土) 10:52:38 ] >>753 HTMLの解析とコード変換はMSXMLとADODBを使えばできるがお前には無理。
757 名前:デフォルトの名無しさん [2008/02/16(土) 10:55:58 ] インクルードファイルだけ入れて boost::array<int,4> d; std::vector<d> data; と定義だけはエラーが出ないのはいいのですが 実際はどのように使えばいいのでしょうか。 d[0]=0; d[1]=1; d[2]=2; d[3]=3; data.push_back(d); //この部分がエラー としてもコンパイルエラーが出ます。
758 名前:デフォルトの名無しさん [2008/02/16(土) 11:06:03 ] >757 すいません。できました。別に原因があったようです。
759 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 11:31:11 ] #include <stdio.h> class Test{ public: static int ary[4]; }; int Test::ary[] = {0,1,2,3}; int main(){ printf("%d\n", Test::ary[2]); } すみません。上記のように1次元配列だと初期化できるのですが 2次元配列にするとどう記述しても初期化できません。 例えば static int ary[2][4]; }; int Test::ary[] = {0,1,2,3, 5,6,7,8}; にすると error C2040: 'ary' : 'int []' は 'int [2][4]' と間接操作のレベルが異なります。 となりますし 多次元配列のメンバ変数を初期化する方法はないものでしょうか?
760 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 11:42:03 ] >>759 int Test::ary[] = {0,1,2,3, 5,6,7,8}; これはおかしいよ。 int Test::ary[2][4] = { { 0,1,2,3 }, {5,6,7,8} }; とかじゃないの?
761 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 11:51:33 ] >>760 有難うございます。上手くいきました。 int Test::ary = { { 0,1,2,3 }, {5,6,7,8} }; や int Test::ary[][] = { { 0,1,2,3 }, {5,6,7,8} }; や int Test::ary[0][0] = { { 0,1,2,3 }, {5,6,7,8} }; で試してみて上手くいかなかったのでどうやるのかと思っていました。 [2][4]と書けば良かったのですね。
762 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:04:02 ] >>752 厳密には寿命と記憶期間は別物だが、 大抵の人は普段は記憶期間の意味で寿命という言葉を使う。
763 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:16:55 ] 記憶期間なんて言う俺俺用語を語られても...
764 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:23:50 ] 記憶域期間だった
765 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:43:32 ] auto_ptrについて質問です。 以下のコードを実行したとき、throw(A)のあとで TTestクラスのデストラクタが呼び出されると思っていたのですが呼び出されません。 auto_ptrってこういうものなのでしょうか? TTest* TTest::NewL() { std::auto_ptr<TTest> self(new TTest()); throw 1; // A return self.release(); }
766 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:47:54 ] 例外を投げた際、デストラクタが呼ばれるのは例外が捕捉された時。 例外が捕捉されなければ呼ばれないかもしれない(環境依存)。 auto_ptr の問題じゃなくて、C++ の仕様の問題。
767 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:48:27 ] >>765 catchしたか
768 名前:765 mailto:sage [2008/02/16(土) 12:53:01 ] すみません、catchしたかどうかが重要とは知らず書いてませんでしたが、catchはしています。 ちなみに、std::auto_ptrの部分を自作のsmart_ptr(スマートポインタの解説サイトを参考に作成) にした場合はきちんとデストラクタが呼ばれました。 コンパイラはBorland C++ Compiler 5.82 なのですが、これのauto_ptrがポンコツなのかも…
769 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:58:41 ] memory ヘッダの中を読んでみたら?
770 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:01:09 ] とりあえず gcc だと呼ばれる。
771 名前:765 mailto:sage [2008/02/16(土) 13:12:49 ] う〜ん、中身見てみましたがおかしいと思えるところは見つからず… auto_ptrのソースをちょこっと改造して試したところauto_ptrのデストラクタ自体が呼ばれてないようでした。 ただ、gccだと正常に呼ばれるとのことなのでBCCが悪いということで解決します。 どうも、ありがとうございました。
772 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:16:48 ] BCC の「どこが」悪いかちゃんと調べないと、 他の所でも沢山困る所があるかもしれないぜ。
773 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:19:46 ] とりあえず俺がチェックに使ったコード。 どう表示される? #include <iostream> #include <memory> class Test { public: Test(int n) : n(n) { } ~Test() { std::cout << "~Test(" << n << ")" << std::endl; } static Test* New() { Test test1(1); std::auto_ptr<Test> test2(new Test(2)); throw 1; return NULL; } private: int n; }; int main() { try { Test* test = Test::New(); test = test; } catch(int n) { std::cout << "catch" << std::endl; } return 0; }
774 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:26:09 ] >>773 BCCで試したところ、以下のように表示されました。 やはりtest2が削除されないようです。 ~Test(1) catch >>772 確かに…引き続き調査はしてみます。
775 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:27:49 ] memory をいじってコンストラクタで文字列表示するようにして、 それが表示されるかチェックしてみれ。
776 名前:デフォルトの名無しさん [2008/02/16(土) 13:56:28 ] HTMLファイルの構文を解析して、UTF8形式をS-JIS形式に変換するソースありますか
777 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:00:52 ] >>776 あるけどおまえにはそれすら無意味
778 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:28:58 ] >>752 staticな変数の生存期間はそのプログラムが起動されてから終了されるまで。 絶対に外部から参照される恐れが無い場合でもなければ、使い回しはできない。 例えば、strtok()やlocaltime()は内部のstaticな領域を返すように実装されていることが多い。 従って、その関数を呼び出した先で参照する可能性があるからコンパイラはこれを取り除くことができない。
779 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:07:48 ] > 絶対に外部から参照される恐れが無い場合でもなければ そのときの話をしてるんだが? アドレス取られたら削除できないのはあたりまえ。 また、絶対に外部から参照されないケースなんてほとんどないので、 大概の実装ではそんな最適化をしていないと思う。 問題にしているのは、規格としてそう言うことをしていいかどうか だよ。
780 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:23:33 ] >>779 規格を云々したいのなら折角そういうスレがあるんだからそちらへどうぞ。
781 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:25:24 ] 異なるオブジェクトは異なるアドレスを持たないという規定がなかったかな? 仮にあったとしても、779の状況では、 プログラム上から異なるアドレスであることを確かめるすべはないと思うけど。
782 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:08:56 ] とりあえず、同じ内容の文字列リテラルが複数箇所に書かれた場合、 それらは同じアドレスに置いても構わない。 また、"abc" というのと "bc" というのがあった場合、 "bc" のアドレスが "abc" + 1 であっても構わない。
783 名前:デフォルトの名無しさん [2008/02/16(土) 18:00:20 ] struct f_point{ float x, y; }; f_point square[4]; // 正方形の頂点が入る for(float angle=0;angle<PI*2;angle+=PI/16){ ... } 構造体squareに正方形の頂点4点の平面座標が入るとして、 その正方形の中心を軸に回転させるには forの中でどういう風に書けばよいでしょうか?
784 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:08:56 ] そういう扱い方するんだったら、 正方形を中心と、どれか1つの頂点の角度とで扱えばいいんじゃね?
785 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:13:27 ] >>783 宿題スレでもいけばいいんじゃね?解答もらえるよ x, yをx + y iの複素数とみなして cosθ + i sinθを掛けた値の実部と虚部を取る 計算を行うようにするとか x * cosθ-y * sinθ, x * sinθ+y * cosθ になるんじゃなかったかな多分
786 名前:デフォルトの名無しさん [2008/02/16(土) 18:15:37 ] 中心px,py 半径r 角度θ x度回転するには、σ(n) = θ + (x+90n) *π/360 px + r cosσ(n) , py r sinσ(n)に変換する
787 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:17:45 ] ループ変数に float 使うなよ・・・。 誤差で境界条件が重い通りにならないかもしれないんだから。
788 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:19:30 ] ×構造体square ○構造体f_pointの配列square つ[アフィン変換]
789 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:22:09 ] (原点ずらす移動の変換行列) × (回転行列) × (原点戻す移動の変換行列) をかければいいんだろ
790 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:27:16 ] 境界条件っつーと、微分方程式の特種解を決定する物を思い浮かべてしまう なんかビミョーな違和感
791 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:38:47 ] // オレ言語ならこれで逝けるぜw f_point center = average(square, square + 4); for (int angle = 0; angle <= 360; ++angle) { for (int ic = 0; ic < 4; ++ic) { print ([square[ic].x square[ic].y] - [center.x center.y]) * [cos(angle * rad) sin(angle * rad); -sin(angle * rad) cos(angle * rad)] + [center.x center.y]; } } // 要は、正方形の中心が原点になるように移動して、回転してから再び移動(≒>789)
792 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:43:04 ] >>785 ほんとごめんなさい、よく読んでませんでした 原点中心回転してました
793 名前:デフォルトの名無しさん [2008/02/16(土) 19:51:23 ] 文字列で入力された char a ; を、関数の中で数値に変換して int a ; にしたいんだ 同じ変数名aなんだけど char → int ってできますか?(´`)
794 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:55:18 ] スクリプト言語を使った方が幸せになれそうな予感
795 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:00:53 ] >>793 それだと1文字だろうし最初からintで受け取ればいい
796 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:01:01 ] >>793 文字とか文字列を数値にしたいとかじゃなくて char型変数を名前そのままにint型変数に変えたいんだな?無理です
797 名前:783 mailto:sage [2008/02/16(土) 20:04:07 ] >>784-792 ありがとうございます。無事できました。 float fCenterX = ( x1 + x2 ) / 2; float fCenterY = ( y1 + y2 ) / 2; float fR = ( float )hypot( fCenterX - x1, fCenterY - y1 ); float fX[] = { x1, x2, x1, x2 }; float fY[] = { y1, y1, y2, y2 }; float fA_[] = { 7, 5, 1, 3 }; for( int i = 0; i < 4; i++ ){ fX[ i ] = fCenterX - fR * cos( fAngle + D3DX_PI / 4 * fA_[ i ] ); fY[ i ] = fCenterY + fR * sin( fAngle + D3DX_PI / 4 * fA_[ i ] ); }
798 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:18:21 ] VisualStudio2008買いました。 重くなるかな?と思ったら、逆に軽くなりましたねw やっぱVistaとVS2005との相性が悪かったんでしょうか。 感激です。
799 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:22:36 ] はぁ?相性だぁ?
800 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:01:00 ] >>798 単純に2005より最適化されて軽くなっただけ
801 名前:デフォルトの名無しさん [2008/02/16(土) 22:39:14 ] C++クラスのstaticについて質問です。 親クラスに作ったstatic変数は、 全子クラスで共有するのでしょうか? それとも、各子クラスに一つずつ、 オーバーライドした同名のstatic変数ができるのでしょうか? それとも、static変数は継承できず、 各子クラスで同名のstatic変数を宣言しなければいけないのでしょうか?
802 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:51:28 ] 実験すればいい。 その結果の通りだ。
803 名前:801 mailto:sage [2008/02/16(土) 22:53:37 ] 確かに。。。 めんどくさくて質問してしまいました。すいません。 試してみます。
804 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:54:13 ] >>801 その中では全子クラスに共有というのが一番近いが、 正確には親クラスにしか存在しない。 ただし、protectedやpublicなら子クラスからでもアクセスできる。
805 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:56:06 ] 実験してこうなったけど、これって規格通りなのですか? という質問なら良し。
806 名前:デフォルトの名無しさん [2008/02/16(土) 22:58:58 ] >>795 >>796 ありがとうございました!!
807 名前:801 mailto:sage [2008/02/16(土) 23:02:26 ] >>803 ありがとうございます。 具体的に何をやりたかったかというと、 各子クラスのstatic変数にアクセスするstatic関数を、 親クラスに作りたかったのです。 static変数は各子クラス別々のものを使うけど、 それに対して行う処理は全子クラスで共通だったので。
808 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:05:56 ] 何か想像付かない処理だ。 本当にその実装方法しか無いんけ? static 変数は基本的には再利用性を阻害する癌のような物だから、 ないならないで済むのが一番いいのだが。 まあ、使い勝手と天秤にかけたら static 変数に軍配が上がることもあるけど。
809 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:19:34 ] CRTPと言って、親をクラステンプレートにするという手がある。ATLがよく使っている。 template<typename T> class Base { //T::Hogeを使う。 }; class Derived : public Base<Derived> { public: static const int Hoge = 10; };
810 名前:801 mailto:sage [2008/02/16(土) 23:22:31 ] >>808 説明しづらいのですが、 シューティングゲームで、敵ユニットを表すクラスを作っています。 まず親クラスUnitがあって、敵の種類ごとにUnitを継承したクラスを作っています。 敵一匹がUnitのインスタンスになるのですが、 ユニットに使う画像はインスタンスごとに持っている必要は無く、 ユニットの種類ごとにあればいいので、Unit各子クラスのstatic変数にしてます。 だけど、その画像に対して行う処理は、 敵の種類に関わらず全クラス共通なので、親クラスのUnitに作りたい。 そんな感じです。 C++も、ゲーム作るのも初めてなので、 もっといい実装方法案があったら、教えてもらえると嬉しいです。
811 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:25:32 ] >>810 とりあえず一旦動くところまで組み上げてしまうんだ どんなにソースコードが汚くなろうとも その後で、こうしているんですが もっと良い方法はありませんか? と質問するヨロシ
812 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:31:23 ] それなら static 変数でもいいかもしんないけど、 画像が要らなくなった時に破棄したくなったとき少し面倒かもね。 俺なら敵ユニット作成クラスと画像管理クラスを作るかな。 でも、とりあえずそれで組んでみてもいいんじゃね。
813 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:31:50 ] お聞きしたいのですが 参考書に array[index]の結果は*((array)+(index))と同じなので char ch = p[3]; と char ch = 3[p]; (pはポインタ) は、同じ処理だと書いてあったのですが、データ型がintの場合は3が12バイト分になってdoubleの場合は3が24バイト分になるはずなので 一概に「3+pに格納されてるアドレスの数値」って言えない気がしたのですが何か考え方が間違っているのでしょうか?
814 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:33:59 ] *(p+3) と *(3+p) で結果が違うわけなかろう
815 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:35:29 ] >>813 ポインタとアドレスは違う(似ているからややこしいが) char a[2]; double b[2]; printf("%p %p\n", &a[0], &a[1]); printf("%p %p\n", &b[0], &b[1]);
816 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:40:10 ] 例えば p の示すアドレスが 0xb1832100 の時、 p が char* なら p + 3 は 0xb1832103 に、 p が int* (int は4バイトとする)なら p + 3 は 0xb183210c に、 p が double* (double は8バイトとする)なら p + 3 は 0xb1832118 になる。 だから、一概にそう言える。
817 名前:801 mailto:sage [2008/02/16(土) 23:41:36 ] >>809 ありがとうございます。 テンプレートというのは知りませんでしたが、使えそうな気がします。 >>811 確かにそうですね。 後から実装を作り替えるのは手間ですが、 実際動くと、モチベーション上がりますよね。 >>812 画像破棄用の全画像リストは、ユニットとは別に作ってます。 ユニットは敵の種類ごとに画像をロードすると同時に、 画像マスターリストにロードした画像を登録して、一括で破棄してます。
818 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:45:31 ] >>817 なるほど。 あと、ある敵ユニットから派生して新しい敵を作りたい時に困るかもね。 そういうことがあるかどうか、だが。 画像オブジェクトへの参照のようなもの、 あるいは画像リストのインデックスのようなものを保持させるなら、 ユニットごとにそういう情報を持っていたのでも 大した容量圧迫にはならないと思う。
819 名前:813 mailto:sage [2008/02/16(土) 23:49:56 ] そーか、ポインタ=アドレス みたいに考えてしまっていました。 腑に落ちました。ありがとうございましたm(_ _)m
820 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:00:03 ] >>812 static変数の初期化は各子Unitじゃなくて、別の何か(親Unit?)がしてるの?もしそうなら 設計ミスだと思うよ。 それじゃstatic変数をグローバル変数として使ってるのとかわりがない。 static変数の初期化は子Unitが行うべき。 ところで >各子クラスのstatic変数にアクセスするstatic関数を、 これがイメージできないんだけど、具体的に何をする関数を作りたかったの? parentStaticFunction( childStaticImage ); みたいな感じで子Unitが呼び出しちゃダメなの?
821 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:03:45 ] 画像管理クラスに対する処理にはできないものなのかな。 あるいは仮想関数にするか。
822 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:13:42 ] WIN32 APIのSetROP2と同じ様な機能を持つ、CarbonAPIをご存じの方いませんか? 開発環境:Winは.net2002 + SDK, MacはCordWarrier pro 5 + Carbonです。
823 名前:822 mailto:sage [2008/02/17(日) 00:15:40 ] 使用言語はCです。
824 名前:801 mailto:sage [2008/02/17(日) 00:18:43 ] >>818 ユニットクラスが持ってるのは画像のポインタなので、容量はたいしたことないと思いますが、 大量に敵が出るので、オブジェクトごとにそれを作る負荷がどんなもんか想像つかなくて、 なるべく共有できるものは共有しようと思いました。 >>820 初期化はちゃんと各子Unitでやってます。 >parentStaticFunction( childStaticImage ); これはできます。 今までJavaしかやったことなくて、決まりきった引数を指定するのが嫌だったのです。 神経質ですいません。 でも、割り切ってこれが一番現実的でいいかもしれませんね。 >>821 >画像管理クラスに対する処理 ありがとうございます。 難しそうですが、それは一考の価値があるかも。
825 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:23:25 ] 敵の大量具合によるんじゃないか? 1億体出るなら馬鹿にできないし
826 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:24:10 ] ごめん、JavaこそparentStaticFunction(childStaticImage); のようなことをするしかない気がするんだけど。
827 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:26:03 ] ポインタなんて大抵4バイトだし、 敵5000体出した所でたった20キロバイト。 これ以上敵を出そうとしても処理落ちひどくて無理だでよ(5000体でもキツいだろう)。 誤差の範囲だ。
828 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:26:55 ] >>822 QiuckDrawのPenModeかなぁ。 ttp://developer.apple.com/DOCUMENTATION/mac/QuickDraw/QuickDraw-59.html ttp://developer.apple.com/DOCUMENTATION/mac/QuickDraw/QuickDraw-75.html
829 名前:801 mailto:sage [2008/02/17(日) 00:29:38 ] >>825 >1億体 出ませんw 最大でも1500くらい。 >>826 そういえばJavaでstatic変数をオーバーライドなんてやったことなかったですw Javaに比べて、C++とWin32APIは引数が多くて嫌だなと、なんとなく思ってただけです。 すげー悩んで試行錯誤しながら、今の形になってきたんですが、 要件を聞いただけで、ぱっと思いつくなってみんな凄いですね。 破棄のための画像管理クラスなんて最初全然考えてなくて、後から作りました。
830 名前:822 mailto:sage [2008/02/17(日) 00:58:39 ] >>828 PenModeの8つのモードすべてで試したのですが駄目でした。私もPenModeだと思ったんですが。。。 SetROP2のように前景モードで動作するのではなく、GrafPort自体に描画しているようです。 Carbonを使い始めて2ヶ月程度なので、間違いがあったらごめんなさい。
831 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:47:40 ] >>830 んー。前景と背景の合成方法を設定するAPIだから、やってることは同じだと思うけどね。 PenModeは現在のGrafPortに対して作用するんで、SetPortPenModeでポートを指定したらどうかな。 もうやってるかもしれないけど。 俺はCocoaな人なので、あんまり力になれなくてすまん。新・mac板の方が詳しい人いるかもね。
832 名前:822 mailto:sage [2008/02/17(日) 12:07:03 ] >>831 書いてなかったけど、ラバー バンディングを実行したくて行き詰まってしまいました。 マウスをドラッグしている間、直前に描かれた線を上書きで消して新しいPointに対する 線を描くという動作なんですが、最後にInvalWindowRectするとエンティティ自体は 正常に描かれます。エンティティ自体を移動させても余計に描画された線は消えます。 長くなって済みません。Macの開発環境がまだ自宅にないので明日会社でSetPortPenMode を適用してみます。ありがとうございました。
833 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:19:09 ] 1999/12/31 23:59:59 2008/02/17 11:53:59 みたいな日付をint型もしくはunsigned int型にしたいのですがどうすればいいのでしょうか? 秒に変換する事も考えましたが2008*365*24*60*60だとintに収まり切りません。 そのまま文字列で保存すればいいかもしれませんが、 この値をstlのmapのキーにしてソート等を行いたいので文字列だと遅そうなのでint型にしたいです。 スレ違いかもしれませんが何か良い方法があれば教えてください。 お願いします。
834 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:27:22 ] もろ環境依存だけど、__int64とか使えればそのまま入れられるんじゃないかな
835 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:34:17 ] 区切り文字をあり得ない数字の連続に置き換えるとか
836 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:34:32 ] >>833 年だけ別にしたら? struct Date
837 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:35:41 ] すまん送信ミス。 struct Date { unsigned int year; unsigned int sec; }; みたいに。
838 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:39:52 ] >>837 それをそのまま使おうとしてmapで使えないと質問しにくるとみた
839 名前:833 mailto:sage [2008/02/17(日) 12:53:46 ] みなさんレスありがとうございます。 >>834 自分の環境では__int64使えるみたいだったけど、他のPCで実行したらどうなるか分からないので今回は辞めておきます。 >>835 えっと、どういう意味ですか? >>836-838 なるほど。そういう手もありましたね。 つまり、比較演算のオペレーターを自作するって事ですよね? ちょっと、その方法でやってみます。
840 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:56:41 ] 今64ビット化が進んでいるtime_tはどう?
841 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:05:02 ] 閏秒とか考慮しなくていいならそれでいいか 暦法の微妙な問題に足突っ込みたくなければ全部秒で表した方が無難 しかし使えるならboost::gregorian使っとくのが楽ではある
842 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:06:27 ] >>833 年が1999年以降しかなくて、2099年までしか使わないのであれば unsigned intでも収まりそうな気がする
843 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:10:27 ] キーワード: 通算秒 time_t
844 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:21:04 ] て言うか、「文字列だと遅そう」って思ってるだけじゃないのか? まずはこれで実装してみて、ほんとにそこがネックになってるなら いろいろ工夫すればいいと思う。
845 名前:833 mailto:sage [2008/02/17(日) 13:55:31 ] みなさんいろいろなアドバイスありがとうございました。 キーを構造体にするという>>836-837 さんのやり方で出来たので今回はこれでいこうと思います。 >>840 ,843 time_tと言う変数は知りませんでした。今度調べてみようと思います。 >>841 閏秒の問題は考えてませんでした。 そこまでの制度の秒を管理する訳じゃないので今回はこれで・・。 boost::gregorianと言うのも知らなかったので調べておきます。 >>842 確かに年を3桁にすれば入りそうですね。 そんなに広い範囲の年を扱う訳じゃないのでそれで良いかもしれませんがなんかなw >>844 一応、キーをUINT, string, struct{UINT, UINT}の3パターンで挿入の時間を計ってみた所、 UINT > struct{UINT, UINT} > stringの順で速かったです。 Cは文字の扱いにあまり優れていないと聞いたことがあるのでそう思ってました。すいません。 とりあえず、これで解決とさせて頂きます。ありがとうございました。
846 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:05:06 ] time_tは型だ
847 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:08:39 ] time_tは__int64をtypedefしただけだったりな 環境にもよるが
848 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:13:50 ] 標準かどうかが大きな違い。
849 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:20:16 ] longだったりする可能性があることを考えたら、 素直に__int64使ったほうがマシだと思うけど
850 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:21:27 ] せめてlong longがいいな。
851 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:26:08 ] 案外void*だよ
852 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:37:03 ] >>845 1970年の1月1日とかからカウント始めれば、精度が秒くらいならunsignedな32bitで十分収まる。
853 名前:デフォルトの名無しさん [2008/02/17(日) 14:42:10 ] googleでかなり調べたのですが、RC4が うまくコンパイルがとおらないので、教えてください。 fedora core1で、コマンドラインからc++でコンパイルしてます。 --------------------- #include <stdio.h> #include <openssl/rc4.h> int main(){ RC4_KEY key1; const char *keystring = "HOGEHOGE"; RC4_set_key(&key1, 4, (unsigned char *)keystring); return 0; } --------------------- コンパイルすると下のようになります。 ---------- /tmp/ccuOdmEl.o(.text+0x30): In function `main': : undefined reference to `RC4_set_key' collect2: ld はステータス 1 で終了しました ------------- 未定義の関数を用いているようなエラーですが、 rc4.hをインクルードしているのですが、 どこがいけないのでしょうか?
854 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:43:57 ] どうやってコンパイルしたの?
855 名前:デフォルトの名無しさん [2008/02/17(日) 14:48:34 ] >>854 コマンドラインから %c++ main.cpp としました。 すると、上記のエラーが表示されます。
856 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:51:51 ] ライブラリリンクしようよ(´・ω・`)
857 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:52:16 ] WindowsのVARIANT型だとdoubleじゃなかったかな 普通は専用のAPIで触ることになるが、 1989/12/30からの日数(1日=1.0で、1秒が1/86400)という単純な仕様 だったと思うんで、自分で計算するのも別に難しくは無いはず 精度(有効範囲)は流石に2038年でオーバーフローする32bitのtime_tよりは ずっとマシ
858 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:52:30 ] >>845 time_tなら標準関数の支援を受けられるし、説明も楽だな。
859 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:53:35 ] >>857 今時、time_tは64ビットですが。
860 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:55:30 ] >>859 そりゃ環境による、でしょ ま、言い方が悪かったか。「time_tが32bitだ」と言ってるんじゃなくて、 「time_tが32bitであるような環境では〜」と読んで欲しい。
861 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:57:43 ] たとえばMSVCでは、6までは32bit 未だに現役で使われてもいるコンパイラなので、注意な
862 名前:デフォルトの名無しさん [2008/02/17(日) 14:59:15 ] >>856 すみません、そのライブラリリンクとは どのようにやるのか教えていただきたく。。。
863 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:04:51 ] いただきたく。。。なんなんだ? 。。。とかね、もう質問の仕方なんて義務教育中に学べと
864 名前:デフォルトの名無しさん [2008/02/17(日) 15:05:16 ] VCで プログラムからキーを押すプログラム作りたいのですが mouse_event みたいな関数教えていただけないでしょうか?
865 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:07:03 ] それだけじゃいまいちはっきりしないがgetch()とか
866 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:09:08 ] すみません、質問の仕方がわるかったです。 プログラムからキーボードの'A'ボタンを押したいのです。 どうすればよろしいでしょうか。
867 名前:デフォルトの名無しさん [2008/02/17(日) 15:15:23 ] >>863 義務教育での勉強不足で失礼いたしました。 今後は、質問の仕方を改めますので、 ご教示のほどよろしくお願いいたします。
868 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:18:05 ] >862 RC4を使ったことがないのでどのファイルをリンクすべきなのか俺にはわからない。 一般に、よほどのことが無い限り、コンパイルするときは関数の実体が入ってるファイルをコンパイラに教えてあげないと コンパイラが迷子になってしまう。 /usr/lib/libRSAglue.a /usr/lib/libcrypto.a /usr/lib/libssl.a さらっとぐぐったかんじだとこのへんのどれかじゃないかとは思うけど。 >866 やっぱりわかんない。 関数に引数として'A'をあげてやればいいだけなのでわ?と思ってしまう。
869 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:19:40 ] >>864 mouse_eventときたらkeybd_eventだろ
870 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:20:28 ] >>865 getch('A')だと、Aボタンが押されたことを感知する命令ですよね。 putch('A')みたいな命令があればと思ってお聞きしたのですがm(_ _)m
871 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:21:17 ] >>869 keybd_eventですか、 使い方をググってみますね
872 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:28:41 ] >>859 Windows の VARIANT 型とか言ってる奴は、どうせ Excel ぐらいしか 触れないんだから、スルー推奨。 >>862 目立関係者か? 「いただきたく」なんてローカル用語使うなよ。
873 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:31:58 ] >>869 ご教授感謝です、その方法でドンピシャであります!
874 名前:デフォルトの名無しさん [2008/02/17(日) 15:51:29 ] >>868 /usr/lib/libssl.a で無事動きました。 ありがとうございました。
875 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:44:00 ] >866 keybd_event
876 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:46:00 ] 更新し忘れ。 >872 どうでもいいが、目立関係ないうちの会社でもこの用法の「いただきたく」はたまに使われてる。
877 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 18:26:26 ] 教えて頂きたく存じます だろ。
878 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:16:26 ] >教えていただきたく そもそも話題になってる意味が分からんのだが。
879 名前:デフォルトの名無しさん [2008/02/17(日) 22:26:04 ] x86_64環境でiccでc++のソースをコンパイルできません。 > icpc ./exercise.4.1.cpp ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.so when searching for -lstdc++ ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.a when searching for -lstdc++ ld: cannot find -lstdc++ これはどうすればよいですか? googleしてみたけど、似たような人がみつけられませんでした。 どうかお願いします。
880 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:30:05 ] 標準ライブラリが見つからないというエラーに見えるが
881 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:33:52 ] >>879 iccのインストール先のbinディレクトリ内にある、環境設定用のスクリプトを動かしてみたら?
882 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:33:06 ] 参照を戻り値にする関数 (例えば int &sample(); ) って、呼び出す時 int hoge = sample(); って呼び出しますよね。 (ポインタを返す関数は呼び出すときに * を使うけど参照を返す関数は & を使わない。) ってことは int &sample(); が定義されてる時は int sample(); は同一モジュール内で定義できないってことなんでしょうか。 呼び出すときの名前が同じですよね。 一応自分で試したらエラーが出たのでやはり不可ってことなのだと思うのですが合ってるでしょうか?
883 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:36:09 ] 戻り値の型のみが異なる関数は2つ以上同一スコープ内に作る事が出来ない。 引数に違いが無いとオーバーロードはできない。
884 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:46:15 ] たとえばC言語で昔よく使ったprintfやscanfは戻り値はint型だ。void型ではない。 けど、戻り値を使っていないプログラムを見たことあるよな? 関数の戻り値を必ず使う必要はないわけだ。 sample(); こういう呼び出しがあった場合、どちらを使えばいい? コンパイラには判断しようがないため規格上できないようになっている。
885 名前:884 mailto:sage [2008/02/17(日) 23:52:55 ] >>883 さん レスありがとうございます。 あれ、そもそも int sample(); と int &sample(); は、戻り値の型が同じではないんですか? どっちもint型ですよね? &sample(); そのものが参照で、その参照が指しているアドレスの値をint型のhogeに戻り値として返す、ということだと思ってたのですが、違うんでしょうか?? >>884 さん なるほど。 int hoge = sample(); と int hoge = &sample(); みたいにして、使い分けはできんのかなと思ったのです。 int hoge = &sample(); とするとエラーが出るし、やっぱりできないということなんですね。 ありがとうございましたm(_ _)m
886 名前:↑884 mailto:sage [2008/02/17(日) 23:54:30 ] 884じゃなくて882でした。
887 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:55:40 ] >>885 違う。 int & sample()は、「intの参照型」を返す関数だ。
888 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:57:32 ] どこかに C++ 標準ライブラリの 完全なリファレンスマニュアルってないですか? 検索してみたのですか、ほとんどが一部しか載ってなくて… ソースか書籍しか無いのでしょうか…?
889 名前:882 mailto:sage [2008/02/18(月) 00:02:07 ] >>887 さん レスありがとうございます む それなら int &hoge = sample(); みたいにhogeの前に & が必要な気がするのですが int hoge = sample(); でもエラーにならないのはなんでなんでしょう?(sample(); は参照を返す関数だとして) int hoge = sample(); だとhogeはint型の参照じゃなくて普通のint型として定義されてますよね。
890 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:09:12 ] int &x; があったときに int y = x; ってできるのと一緒
891 名前:882 mailto:sage [2008/02/18(月) 00:19:53 ] >>890 さん レスありがとうございます。 なるほど、てことは &sample() { ... } int hoge = sample(); とあったとき、hogeもsample()そのものも、どっちとも参照型ってことでいいんでしょうか?
892 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:22:02 ] int hoge = だったら、hogeは参照じゃないだろう sample() の戻り値が参照してる先の値をコピーしてるんだよ
893 名前:882 mailto:sage [2008/02/18(月) 00:22:24 ] &sample() → int &sample() ですね...
894 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:24:04 ] 横から質問させてください。 >>890 は(暗黙の)型変換の一つであり、 T&からTへの型変換はdereferenceである と考えて正しいですか?
895 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:29:37 ] >>894 型変換じゃないと思うよ。ただの dereference というか。
896 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:30:20 ] >>888 C++ referenceでググっても軽くこんなに見付かる。 www.cppreference.com/ www.cplusplus.com/reference/ msdn2.microsoft.com/en-us/library/cscc687y.aspx
897 名前:879 [2008/02/18(月) 00:31:47 ] >>880-881 ありがとうございます。環境設定用のスクリプトは呼び出してるんですが、、、 どうも変なところにstdc++を探しにいっているような、、 どこに探しに行っているかをしらべるコマンドってなかったでしたっけ?
898 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:33:28 ] >>888 完全なっていうなら JIS の閲覧用クソ重いやつか、 ISO のドラフトがいいかもね。
899 名前:882 mailto:sage [2008/02/18(月) 00:38:22 ] >>892 さん レスありがとうございます。 うーむ int &sample() { ... } int hoge = sample(); hoge = 10; とやるとエラーが出ずに普通にコンパイル出来ました。 hogeが参照だったら hoge = 10 みたいに再定義できないと思うので、 やっぱりこの場合hogeは参照じゃない・・?
900 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:42:17 ] >>899 hogeは参照ではない。分解して書けば一目瞭然。 int& sample(); int hoge; // どう見てもint型です hoge = sample(); > hogeが参照だったら hoge = 10 みたいに再定義できないと思うので、 int hogehoge = 0; int& hoge = hogehoge; // hogeが参照だったら hoge = 10; // 参照先のhogehogeに10が代入される
901 名前:882 mailto:sage [2008/02/18(月) 01:01:31 ] >>900 さん ですよね。 ありがとうございましたm(_ _)m
902 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:16:17 ] visual studio 2008 express版を使っていたんだが error C2057: 定数式が必要です。 error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。 というエラーが出たのですがこれはどういったエラーなの?
903 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:20:58 ] エラーでた個所のソースを張り付けては? 後ろの方はint i[];とかしたときにでるかな?前はよく見るけど忘れた。
904 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:26:08 ] >>902 メタプログラミングでもやってんのか?
905 名前:902 mailto:sage [2008/02/18(月) 01:42:27 ] ARToolKit を使って連続MQOファイルを表示しようとしてます #define CAMERA_CONFIG_FILE "Data/WDM_camera_flipV.xml" // カメラ設定ファイル #define CAMERA_PARAM_FILE "Data/camera_para.dat" // カメラパラメータファイル #define PATT_FILE "Data/patt.sample1" // パターンファイル #define MQO_FILE "Data/output_0.mqo" // MQOファイル(座標軸) int MOTION_NUM = 60; int motion_total = 60; int MOTION_FPS= 30; MQO_OBJECT g_mqoModel[MOTION_NUM]; // メタセコファイルから読み込んだモデル
906 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:57:25 ] >>905 static const int MOTION_NUM = 60;
907 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:58:34 ] >896 上2つでは<utility>や<locale><stdexcepts>等の情報が見あたらなかったのですが MSDNのはかなり情報量多そうですね。しばらくMSDNを頼りにしてみます。 >898 JISに行ったら購入とかあったので有料?と思ったのですが 閲覧だけなら出来るみたいですね。 どうやら、保存は出来ないみたいですが。 C++ ISO Draft で調べたら幾つか見つかりました。 英語なのでちょっと大変そうですが、頑張ってみます。
908 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:59:00 ] MQO_OBJECTが正しく宣言されていないからだと思うが? その環境がわからんから俺にはこれ以上は答えられん・・・ってこれくらいのこと試してそうだけど・・・
909 名前:908 mailto:sage [2008/02/18(月) 01:59:38 ] はぅ、そっか・・・おれはずかしす・・・
910 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:36:27 ] 超初心者です char *a[]={"あ","か","さ","た","な"}; printf("%s",a[0]); こんな時、なぜ*が必要なのかいまいちピンときません。 どなたか教えてください…
911 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:43:14 ] >>910 aはポインタ配列だからです。
912 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:52:47 ] int a = 5; int a[] = {1, 2, 3, 4, 5}; char* a = "あ"; char* a[] = {"あ", "い", "う", "え", "お"};
913 名前:910 mailto:sage [2008/02/18(月) 10:06:32 ] こんがらがってきた(ヽ'A`) 文字列の扱い方はこんな感じでおかしくないでしょうか char a='N'; char a[]={'N','M'}; char a[]={"NM"}; char *a="NNNN"; char *a="あ"; char *a[]={"NNNN","MMMM"}; char *a[]={"あ","い"};
914 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:14:24 ] >>913 ああ、だいたいそれでいい。あとは char* じゃなくて char const* にしとけば完璧だ。
915 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:21:50 ] >>913 次は配列とリテラルの違いに苦しむが良い
916 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:43:58 ] const char*
917 名前:910 mailto:sage [2008/02/18(月) 10:44:53 ] みなさんありがとうございます。なんとなくわかった気がします 次はどうしてこうなるのか簡潔に説明できるように頑張ります…
918 名前:879 [2008/02/18(月) 10:48:57 ] すいません、誰かたすけて。。 x86-64のマシンでiccでC++のソースがコンパイルできません。 icc : l_cc_p_10.1.008 g++ : g++ (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux) iccvars.shはsourceしてます。 icc samp.cのように、ただのCのソースならコンパイル+実行できます。 でもicpc samp.cppのように、C++のソースをコンパイルしようとすると、 ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../ libstdc++.so when searching for -lstdc++ となって、コンパイルできません。 ちなみに、-lstdc++は、 $ file /usr/lib64/libstdc++.so.6.0.8 /usr/lib64/libstdc++.so.6.0.8: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), stripped ちゃんと存在してます。
919 名前:879 [2008/02/18(月) 10:56:31 ] すいません、自己解決したかも、です。 x86-64:~> /opt/intel/cce/10.1.008/bin/icc as/samp1.cpp => これはコンパイルでき、実行もできた。 x86-64:~> /opt/intel/cc/10.1.008/bin/icc as/samp1.cpp ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.so when searching for -lstdc++ => これは上に書いたとおりコンパイルできない。 cceを使えばいいみたいです。 お騒がせしました。
920 名前:デフォルトの名無しさん [2008/02/18(月) 11:00:15 ] >>919 ???何故、一つ上のdirectoryに上がるのです??? 其の場所に"stdc"が置いて在るのですか?
921 名前:デフォルトの名無しさん [2008/02/18(月) 11:31:47 ] 単精度と倍精度でどの程度性能が違うのか、簡単なテストプログラムを書きたいと思っています (Programming Pearls の コラム6 練習問題) gcc -O0 で最適化をオフにして、何らかの計算をループさせて時間を計ろうと思うのですが、こういうのに手ごろな計算ってあるでしょうか?
922 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 11:37:42 ] >>921 単純な性能差を求めようとしても余り意味がない。 何故ならば、最適化なしの指定にすると恐らくはx86ではfpuを使うコードを出力するが、 それはfloatでもdoubleでも同じCPU命令を使うことになるから。
923 名前:879 [2008/02/18(月) 11:40:20 ] >>920 レスありがとうございます。 >???何故、一つ上のdirectoryに上がるのです??? というのは、libstdc++の場所のことですよね?自分も調べてみたのですが、結局その位置は、 /usr/lib64/libstdc++.so.6.0.8 になってて、これがlibstdc++のようです。 cceのディレクトリ以下のコンパイラだとリンクできて、cc以下のコンパイラだとリンクできない 理由は分かってないですが、。。
924 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 11:42:37 ] そりゃぁ、ccはx86-32でcceがx86-em64tだからだ。
925 名前:879 [2008/02/18(月) 12:01:30 ] >>924 ありがとうございます。 なるほど、そういうことですか。 でも、なんでx86-64環境にインストールしたのに、iccとやると、デフォルトで32ビットの バイナリを作ろうとするんですかね。自分は、 alias icc64="/opt/intel/cce/10.1.008/bin/icc" しときました。
926 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:05:45 ] >>925 cce配下のbinにあるスクリプトを使えばcceにPATHが通る。
927 名前:879 [2008/02/18(月) 12:22:03 ] >>926 以下のようにやると通りました。 source /opt/intel/cce/10.1.008/bin/iccvars.sh ありがとうです。
928 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:22:58 ] 文字列を初期化するにはどっちがいいのでしょうか? 1, ZeroMemory( str, sizeof(str) ) 2, memset( str, '\0', sizeof(str) )
929 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:24:25 ] 両方同じ
930 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:31:27 ] '\0'=0ってことなんですか?
931 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:32:53 ] >>928 >1, ZeroMemory( str, sizeof(str) ) 一部の環境にしか存在しないことを承知で使うのならこっちでもいいが、 そもそも文字列を初期化するのに0クリアはナンセンス。
932 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:33:01 ] 2なら環境をWindows以外に変えても修正しないで済む。
933 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:52:19 ] ZeroMemoryもマクロで結局memsetになる。
934 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:06:59 ] 文字列の初期化だったら、「*str = '\0';」でいいじゃない。
935 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 22:37:43 ] #include <new> class CBase { public: /** new */ void* operator new(std::size_t aSize) throw(std::bad_alloc); /** delete */ void operator delete(void* aMemory) throw(); /** placement new */ void* operator new(std::size_t aSize, void* aPtr) throw(); /** placement delete */ void operator delete(void* aMemory, void* aPtr) throw(); }; Effective C++にあった配置newを試そうと上のクラスを作ってみたのですが、 BCBでコンパイルすると下記のエラーが出てしまいます E2238 'CBase::operator delete(void *) throw()' の宣言が複数見つかった ボス助けて
936 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:02:54 ] >>935 visual c++ 2005では問題なくコンパイルできました。 bccがポンコツということで処理します。
937 名前:デフォルトの名無しさん [2008/02/18(月) 23:30:10 ] GetCurrentDirectory()は最大260文字くらいしか読み取れないね なんとかなりませんか?
938 名前:デフォルトの名無しさん [2008/02/18(月) 23:37:18 ] 937です 自己解決しました 途中まで(250字程度)は返してくれるのでそこまで 移動してからディレクトリを進めていって、たとえば適当なファイルを生成してそれを見つければよいです
939 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 00:01:14 ] GetCurrentDirectoryWでも260文字越えはだめ?
940 名前:デフォルトの名無しさん [2008/02/19(火) 00:11:17 ] GetCurrentDirectoryWでも250程度しか行きませんでした
941 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 00:15:38 ] オレ様のGetCurrentDirectory()にはそんなちゃちな制限はないぜ。
942 名前:デフォルトの名無しさん [2008/02/19(火) 00:34:58 ] 247文字までは取得できますが、それを越えると一つ上のディレクトリまでしか返さないようです
943 名前:デフォルトの名無しさん [2008/02/19(火) 00:36:52 ] だからたとえば50文字で返却されたとしてもそこがカレントディレクトリとは限りません 200文字のディレクトリ内かも知れない為
944 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 01:13:09 ] 時々ファイル名が長すぎてリネームできないファイルがありますが 私はいつもネットワーク共有状態にしてUNC名でリネームしてます
945 名前:デフォルトの名無しさん [2008/02/19(火) 01:28:08 ] 階層の深いフォルダをドライブに見せかける命令ってどうやるんでしょうか これが出来れば読めるところまで進めてくりかえせばいいのですが
946 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:13:51 ] Linux 2.6.18-6-686 #1 SMP Sun Feb 10 22:11:31 UTC 2008 i686 GNU/Linuxで wtmpの中身をみて遊んでて出た疑問です。 struct utmp u; sizeof(u)をしたら384が出力されたのですが/usr/include/bits/utmp.hを みてメンバー変数のサイズを合計したら382となりました。 下記のサンプルで出したのですがメンバー変数に見落としがあったのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> #include <utmp.h> main(){ struct utmp u; printf("size utmp %d \n", sizeof(u)); printf("size ut_type %d \n", sizeof(u.ut_type)); printf("size ut_pid %d \n", sizeof(u.ut_pid)); printf("size ut_line %d \n", sizeof(u.ut_line)); printf("size ut_id %d \n", sizeof(u.ut_id)); printf("size ut_user %d \n", sizeof(u.ut_user)); printf("size ut_host %d \n", sizeof(u.ut_host)); printf("size ut_exit %d \n", sizeof(u.ut_exit)); printf("size ut_session %d \n", sizeof(u.ut_session)); printf("size ut_tv %d \n", sizeof(u.ut_tv)); printf("size ut_addr_v6 %d \n", sizeof(u.ut_addr_v6)); printf("size __unused %d \n", sizeof(u.__unused)); }
947 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:15:24 ] どこかにパディング入ってんじゃね
948 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:21:17 ] >947 なるほど。wtmpはバイナリーデータなんですけどutmp.hの構造体のサイズ信じて バイト単位でデータにアクセスした場合ほしい値がもらえない場合があるわけですね。
949 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:32:44 ] offsetofでも使えばいいんじゃね
950 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 04:11:21 ] >949 なるほど、パディング入った位置はわかった。
951 名前:デフォルトの名無しさん [2008/02/19(火) 05:01:29 ] 質問です。 itpro.nikkeibp.co.jp/article/COLUMN/20061204/255878/ のプログラムがコンパイルできないのですが、 msg[i] += 'A' - 'a' の処理ってどうやればコンパイルできるようになるのでしょうか? というか、どんな処理型だったらコンパイルできるのでしょうか? gcc -std=c99では駄目でした。
952 名前:デフォルトの名無しさん [2008/02/19(火) 05:11:17 ] >>951 お前にはVB6がお似合い
953 名前:いいこと教えてやるヨ [2008/02/19(火) 05:19:15 ] いつもこのスレにお世話になってるんで、お前らに恩返ししてやるよ。 あのな、クラスの中で、大文字のTっつー名前のメンバ変数を定義すんなよ。 そのあと、クラス内でtemplate <class T>とかするとハマる。 おれはこんな時間までハマった。 じゃあな。
954 名前:デフォルトの名無しさん [2008/02/19(火) 05:26:02 ] いや、 msg[i] += 'A' - 'a' msg[i] -= 'A' - 'a' の処理が大文字と小文字をひっくり返す処理くらい 俺でも分かるよ。 でも、コンパイルできねーんだもん。
955 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 05:26:49 ] >953 申し訳ないけど笑ってしまった。
956 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 06:09:39 ] >>954 #include <string.h> とかか?
957 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 07:09:34 ] コロンなのがあかんのんやろ
958 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 07:15:33 ] >>951 (msg[i] -= 'A' - 'a') と括弧で括ればいい。 あるいは、C++処理系でコンパイルすればいい。
959 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 10:28:20 ] #include <iostream>やusing namespaceは.hに書くのがよいのでしょうか?それとも.cppに書くべきなのでしょうか?
960 名前:デフォルトの名無しさん [2008/02/19(火) 10:28:46 ] まさか、'A'がchar型だと思ってるバカはいないよな?
961 名前:デフォルトの名無しさん [2008/02/19(火) 10:55:47 ] >>959 それぞれのスタイルでしょ。でも、 using namespace を.hに書くのはやめとけ。というか、c++を使いつづけると、 そのうち自然に止めたくなると思う。
962 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:30:34 ] ソースファイル毎に名前空間分けてるWindows用某フレームワークは名前空間一つにまとめてくれといいたくなる。
963 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:08:56 ] 特定のクラスだけパディングして欲しくない 事があるんですが、何か手はあるでしょうか?
964 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:16:05 ] #pragma pack
965 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:40:34 ] >>964 おーあるのね。感謝!
966 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:35:49 ] ofstreamのmemcpyで落ちる場合があるんですが何が原因でしょうか?
967 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:03:21 ] ofstreamでmemcpy使うことなんてあったっけ? ここにソース書いてくれ。
968 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:09:37 ] じゃあofstreamじゃないのかもしれません。 CStringA str; str = wstrData; fout.write( str, DATA_SIZE ); この様なことをやっていて 何回も動かしていると落ちてしまうんですが マルチバイトとワイド文字の変換にCStringAを使ってるのでここかもしれません
969 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:17:52 ] 原因を予想してもらうより、まずどこで落ちるのか確定するにはどうすればいいかを聞いたほうがいい気が・・・ スタックのトレースも無さそうだな
970 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:33:57 ] >>968 DATA_SIZE
971 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 20:44:05 ] fout.write(str, str.GetLength()); じゃないの? あるいは fout << str;
972 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:53:25 ] プログラムの勉強に飽きたとき息抜きで何やる?
973 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:54:55 ] 一人で電機屋で1980円で買った麻雀ゲーやってる あと最近興味ないクラシックを聴いて10分で眠くなる特技が出来た
974 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:10:05 ] えーとごめんなさい。VC使って5年ぐらい経つんですが 未だに普通のウィンドウにコントロールを貼り付けるような リソースエディタ的なソレを知りません。 ダイアログなら直球なんですがウィンドウでそういうの出来ますか?
975 名前:974 mailto:sage [2008/02/20(水) 00:11:14 ] 使ってるのはVC6です。
976 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:11:23 ] 日本語が使えないんじゃ何年VC使っててもだめだろうね
977 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:13:42 ] こんくらいは分かるだろ。 とりあえず VC ではそういうのは知らない。
978 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:14:29 ] 普通のウィンドウにあんまりコントロールをはっつけるなってことじゃないのかな。 Windows 的には。
979 名前:デフォルトの名無しさん [2008/02/20(水) 00:15:28 ] >>974 初心者は、C#かBCBつかえよ 無理
980 名前:974 mailto:sage [2008/02/20(水) 00:21:42 ] >>976 んじゃ0年でもOK てゆかVC6のウィンドウエディタはリソースエディタしかないから それでやってたけど、ダイアログしか作れないのはおかしいだろ、 とか思いながらやってたんだけど、その疑問をはらしたくてな。 >>977-978 あれ?やっぱこれでOKなのか。 要するに「VC6に"ウィンドウ"エディタは無い」でOK?
981 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:22:26 ] てゆか
982 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:26:09 ] BCB にはありそうな気がする。
983 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:34:32 ] >>980 ダイアログをウィンドウに張ることはできますが。
984 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:51:48 ] ダイアログにウィンドウクラスを割り当ててしまえば、 もはやダイアログではないウィンドウができる。 でも俺は983のようにすることが多いけど。
985 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:54:52 ] アンマネージドでも.NETくらい楽にUI作れるようにならんかなー
986 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:38:22 ] ちなみにBCBでダイアログ作るとダイアログもどきな普通のウィンドウになる
987 名前:デフォルトの名無しさん [2008/02/20(水) 05:25:33 ] virtualデストラクタを持つ親クラスを継承して、子供クラスを作りました。 その子供クラスを、親クラスのポインタをつかって扱ってます。そのとき、 親クラスのポインタに対して、delete ptr;とやると、まず子供クラスの デストラクタが呼ばれた後で、親クラスのデストラクタが呼ばれるのですが、 これって正しい動きですか? 親クラスのデストラクタは呼ばれないと思ってた。
988 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 06:16:06 ] >>987 正しい。 親のが呼ばれなきゃ親のリソース開放できないじゃん。
989 名前:デフォルトの名無しさん [2008/02/20(水) 06:21:51 ] >>988 その通りですね。 ありがとうございました。
990 名前:デフォルトの名無しさん [2008/02/20(水) 11:16:24 ] vectorをnewを使って確保するというのは出来ますか? (vector<int>とか) 色々やってみたんですが、なぜかどうやってもコンパイル失敗してしまいます。 もしかして、できないのかな、と思った。
991 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:31:28 ] >>990 #include <vector> int main() { std::vector<int> *p = new std::vector<int>; delete p; }
992 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:46:47 ] >>990 なんでまたそんな希代なことしようと思ったのかが気になる。
993 名前:デフォルトの名無しさん [2008/02/20(水) 12:25:18 ] >>991-992 ありがとうございます。なぜそんなことをしようと思ったかというと、vectorを関数間でやりとり したかったからです。適当にクラスを準備して、その中にvectorを保持してましたが、単体でも newで出来るかなと思いました。
994 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:28:17 ] 次立てて埋めようとしたらたてらんねえ
995 名前:デフォルトの名無しさん [2008/02/20(水) 12:34:23 ] 立てたよ。
996 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:36:34 ] 【初心者歓迎】C/C++室 Ver.49【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1203478421/ >>995 乙
997 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:47:08 ] >>993 別にわざわざnewする必要なんか無いだろ。そのための参照渡しがあるんだから。
998 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:54:35 ] でも複数の場所にたらい回しにするときは、 boost::shared_ptr<std::vector<int> >(new std::vector<int>()); とかやる?
999 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:56:51 ] 梅て次いこう
1000 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:57:38 ] ほいほいほい
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。