1 名前:デフォルトの名無しさん [2007/06/25(月) 12:01:46 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.38【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1180877635/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 12:04:06 ] >>1 乙
3 名前:ちんこ [2007/06/25(月) 12:33:43 ] 乙
4 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 12:36:12 ] チン腰ね
5 名前:デフォルトの名無しさん [2007/06/25(月) 13:26:07 ] / / / ヽ ヽ /^ 7 / // i /| .ト、 !ハ . ,′// }. |ハト、{ヽ! ヽ! ヽト/ハ ! ! 三 | / / | ハ ,=、 =、 ☆ | | _| / ミ /ノ,, ,, ___ ,, | ! j| \ /三L」 ミ / 二コ、ヽ . _ .ノ ,イ / . ′ X/ .| | ミ / xく | > ┬ イリ. / / // \ | |__ / .!斗―/.! / ./ /__{ .{_ __ / ̄ヽj 从| トイヽ_/{ { ∧  ̄_ {___人 / /` .。ノ ___ \ //∨ } \< / ′ ※亠‐┐ 〉 //ミ ノ_人 \{ { j!| }|/!
6 名前:デフォルトの名無しさん [2007/06/25(月) 15:08:41 ] C言語 XP Borland C++ Compiler 5.5 ファイルから別のファイルに内容をコピーする場合 コピー元のファイルを開いて中身を配列に格納してコピー元のファイルを閉じ、 コピー先をファイルを開いて配列に格納した内容をコピー先に送ってコピー先のファイルを閉じる ってやり方でOKでしょうか? それともコピー元とコピー先のファイルを一緒に開いて直接コピーする事は可能ですか?
7 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:11:17 ] 同時にオープンしてても大丈夫
8 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:25:43 ] >>6 と言うかメモリに収まりきらない巨大なファイルをコピーする場合は 同時にオープンするしかないでしょ。 seekg()とかでちょっとずつコピーする事もできるけど現実的じゃないし。
9 名前:デフォルトの名無しさん [2007/06/25(月) 15:28:02 ] 有難うございます 同時にファイルを開く場合、書き方としてはこれで大丈夫でしょうか? FILE *fp1,*fp2; char ch; if((fp1 = fopen(argv[1],"r")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } if((fp2 = fopen(argv[2],"a")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } while((ch = fgetc(fp1)) != EOF){ fputc(ch,fp2);
10 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:35:53 ] fclose()も忘れずにな それから"a"で開いてるのはどうして?
11 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:42:42 ] >>9 ・引数の数チェック汁 ・fgetc()はgetc()と機能は同じだがfgetc()のほうが速いことはまずない fputc()も同様 まぁどっちもファイルコピーに使うには遅すぎだが ・つかファイルをコピーしたいんならバイナリで開け ・開けなかった時はperror()を使うと処理系定義のエラーメッセージを出してくれる
12 名前:デフォルトの名無しさん [2007/06/25(月) 15:46:45 ] >>10 w+ に変更しますた >>11 今日、ファイル入ったばかりでまだバイナリまでいってないんす・・・ でこんな感じで書いてみたのですが、何故かコピー先のファイルから結果が表示されない・・・どちて? int main(int argc,char *argv[]) { FILE *fp1,*fp2; char ch; if(argc != 2){ printf("使用法:<プログラム名> <コピー元ファイル名> <コピー先ファイル名>\n"); exit(1); } if((fp1 = fopen(argv[1],"r")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } if((fp2 = fopen(argv[2],"w+")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } while((ch = fgetc(fp1)) != EOF) if(fputc(ch,fp2) == EOF){ printf("ファイル書き込みエラー\n"); exit(1); } fclose(fp1); while((ch = fgetc(fp2)) != EOF) putchar(ch); fclose(fp2); return 0; }
13 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:49:49 ] - if(argc != 2){ + if (argc != 3) { それと while((ch = fgetc(fp2)) != EOF) putchar(ch); の前に rewind(fp2); 入れろ
14 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:52:27 ] >>13 できました ありがとうごぜいます
15 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:12:16 ] windows、C++Builderです。 バックアップソフトを作りたいと思ってます。 フォルダの中身を、違うパーティションにコピーするだけです。 ’曜日’と’時間’だけ、タイムテーブルのようなものに 記録しておいて、時間が来たらコピーする。ということを 永久に繰り返します。 月曜日は、5:00と13:00と18時 火曜日は、5:00 水曜日は、3:00 ・・・ など、曜日によって回数も様々です。 どういう仕組みを使うのが、良いでしょうか? time_t current; time(¤t); で、1秒ごとに時刻を取得して比較してたら 大変ですよね。
16 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:14:42 ] 基本的にはタイマー設定すると思うけど。
17 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:17:10 ] >>15 1.次のバックアップまでの時間に応じてチェックする間隔を変更する(時間に応じて2時間、30分、5分、1分のように) 2.Windows付属のスケジューラを使う 3.多少の誤差は気にせず指定時間までSleep
18 名前:デフォルトの名無しさん [2007/06/25(月) 16:27:43 ] RHEL3環境で、gcc(ver 2.95.3であると思われます) c++でcursesを使ったプログラミングをしているのですが、 string str[2] str[0] = "hoge0"; str[1] = "hoge1"; str[2] = "hoge2"; for(int i=0; i<3; ++i){ printf("%s\n",str[i]); refresh(); sleep(1); } のように行うことで出力したいのですがうまくコンパイルできません。 stirng型を出力する方法はないでしょうか? 教えてください。
19 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:31:49 ] >>18 つ str[i].c_str() つか、君の読んでる本には載ってないのか?
20 名前:デフォルトの名無しさん [2007/06/25(月) 16:32:52 ] >>18 です。 追記です。 出力に●や彡を出力したいので、charではうまくいかず、 stringを使っています。 %sがchar*だからstringの出力ができないと思うのですが、 %sの代わりの変換指定子が分かりません。 お願いします。
21 名前:デフォルトの名無しさん [2007/06/25(月) 16:34:39 ] >>18 です。 >>19 さんの書き込み見る前に>>20 を書き込んでしまいました。 今試して見ます。 ありがとうございます。
22 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:35:08 ] >>18 - string str[2] + string str[3]; >>20 >>19 を嫁 c_str()はconst char*を返すから%sでいい
23 名前:デフォルトの名無しさん [2007/06/25(月) 16:38:53 ] 文字列の表示に変換指定子の「%s」を使っての ひらがな、カタカナ、漢字などの全角文字の表示に問題なかったのですが 実際は半角英数字以外使ってはいけないとかあるのでしょうか? 初心者向けの書籍だとみな半角の英語を使って説明されているので 全角文字でも問題がないのかどうか判断に困っています。
24 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:42:18 ] >>23 ためせ
25 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:01:14 ] 試してOKだったけど、どうなの?って話だろうに。 >>23 char* なら、ASCII だろうと多バイト文字列だろうと問題ナス。
26 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:02:42 ] >>12 その場合 char ch; は間違い。 int ch; にすべし。
27 名前:24 mailto:sage [2007/06/25(月) 17:03:40 ] ああ、「問題なかった」と言ってるんだから「試せ」も糞も無いな ごめん 実際には ・その特定のエンコーディングのソースをコンパイラが処理できるか ・実際に表示(端末に出力)した際に、その特定のエンコーディングの文字列を 端末が表示できるか といった問題が関係してくる まあ日本語に対応したOSや端末で、日本語に対応したコンパイラを使っている 分には通常問題が無いが、 例えばEUC-JPやISO-2022-JPやUTF-8なソースをVC++は食えない 最近のgccは-finput-charsetだの-fexec-charsetだのを適切に指定することで 多国語に対応する
28 名前:デフォルトの名無しさん [2007/06/25(月) 17:07:16 ] >>18 です。 >>19 さん のように行ったらできました。ありがとうございました。 私の使っている、「やさしいC++」にはc_str()は載ってませんでした。 これが分かった上でもうひとつお聞きしたいのですが、 string str[2]; str[0] = "hoge0"; str[1] = "hoge1"; str[2] = "hoge2"; char* s[2]; s[0] = str[0].c_str(); s[1] = str[1].c_str(); s[2] = str[2].c_str(); が行えません。 char*にchar*を入れているのでいけると思ったのですが。 これはなぜでしょうか?
29 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:08:28 ] >>28 >>22 で指摘したのに…… 配列str[]のサイズは2ではなく3にしろ
30 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:10:00 ] なんでダメかというと char*にconst char *はそのままでは代入できないからだ const char *s[3]; とするか(こっちが推奨)、 s[0] = const_cast<char*>(str[0].c_str()); とでも汁(こっちは非推奨)
31 名前:デフォルトの名無しさん [2007/06/25(月) 17:11:53 ] >>29 さん すみません、これは単純な書きミスでした。 string str[3]; str[0] = "●"; str[1] = "●●"; str[2] = "●●●"; char* s[3]; s[0] = str[0].c_str(); s[1] = str[1].c_str(); s[2] = str[2].c_str(); としてます。
32 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:16:47 ] >>30 非推奨っつーか、やっちゃだめ
33 名前:デフォルトの名無しさん [2007/06/25(月) 17:17:48 ] >>30 さん ありがとうございます。 やってみたらできました。 みなさんありがとうございました。 # 書き込む前に新しいレスがあるかリロードでチェックしなくてはいけませんね。 # 何か自分が書き込むタイミングが一歩遅いようで。申し訳ないです。
34 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:18:39 ] >>32 char *s = "hello"; と犯罪性は同じだと思うけど。 でもこれは合法だしな未だに。
35 名前:23 [2007/06/25(月) 17:20:24 ] >>25 >>27 詳しい説明ありがとうございます、 助かるとともに勉強になります。
36 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:21:18 ] >>34 そんな負の遺産も使っちゃダメ。
37 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:23:44 ] >>36 〃〃 _, ,_ ⊂⌒( `Д´) < ヤダヤダ! `ヽ_つ ⊂ノ ジタバタ
38 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:54:43 ] main で catch(...) ってどう思います? 例外がキャッチされなかった場合、 デストラクタが実行されるかどうかは未定義で、 実際 g++ だと実行されなかったりします。 それを考えると、main で catch(...) しといた方が 安全なのかな・・・とか思うのですが。
39 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:03:13 ] #include<stdio.h> #include<stdlib.h> char *search_r(char *s,char *p){ char *x; int i; x=p; i=sizeof(p); while(1){ p=x; if(*s=='\0')exit(1); while(*s==*p){ if(*s=='\0')exit(1); s++; p++; } if(*p=='\0')break; s++; } return s-(i-1); } int main(){ char *x; x=search_r("konbanhasensei","hasen"); printf("%s",x); return 0; } 文字列pから文字列sを検索するプログラム このプログラムで結果を 「hasensei」と表示したいのですが「sensei」となってしまいます。 どこがおかしいのでしょうか。 よろしくお願いします。
40 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:08:15 ] >>39 マンドクセーからちゃんと読んでないが > i=sizeof(p); sizeof(p)はポインタpのサイズ(4とか)が分かるだけだ。 pが指してる文字列の長さを測りたいのなら、strlen()を使え。
41 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:08:25 ] sizeof(p) → strlen(p) s-(i-1) → s-i exit(1); が凄い気になるが・・・。 NULL 返したのでいいんじゃないかな。 for 使ってないあたりも読みづらい。
42 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:11:37 ] >>40 >>41 ありがとうございます。
43 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:19:29 ] それ以外にもバグはあるけど、 まあそれは自分で確認してくれ。
44 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:19:09 ] 環境はC++です 今日自分の作ったサブルーティンを上司がチェックしたみたいなんですが この構造体はインパラメータだから値渡しにしろ と言ってきました。 サブルーティンの引数に構造体を渡すときに値渡しって使いますか? このサブルーティンで使っている構造体のサイズは決して小さくはありませんし、 自分的には構造体のサイズが小さくても値渡しは使わないと思っていたので ちょっと衝撃的でした。
45 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:25:18 ] 場合による
46 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:25:36 ] >>44 const参照渡しをしててそう言われたんなら上司を鼻で笑ってやれ constのつかないポインタ渡しでもしてたんなら君も悪い
47 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:47:18 ] つうか値渡しでどうやって受け取るんだ
48 名前:47 mailto:sage [2007/06/25(月) 21:48:37 ] あぁ読み込みパラメータね 勘違いした ごめんよ
49 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:56:24 ] const ポインタ渡しするのが普通だな。 小さい構造体の場合は別な事もあるけど、 まあ場合によるな。
50 名前:44 mailto:sage [2007/06/25(月) 22:21:39 ] >>46 上司を鼻で笑ってやったら首になりました。 貰ってやって下さい。
51 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:24:29 ] >>50 早っ!
52 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:24:49 ] >>50 うちに来い。Cだが、ひどいデスマも無い。 残業代は0だけど・・・
53 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:43:57 ] >>16-17 15です。 曜日、時間でのバックアップの件でしたが、 お礼遅れてすみません。sleepで行きます。 ありがとうございました。
54 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:02:28 ] >>49 C++ならconst参照だろ
55 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:03:36 ] あ、C++ だったか。 大きな構造体って時点で C かと思ってしまってた。
56 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:07:00 ] C++です。 struct S { int a; int b; int c; }; という定義の構造体があったとして、 S s = {0}; と書いた場合、b と c が 0 になることは保証されますか?
57 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:09:31 ] されます。
58 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:16:54 ] 8.5.1p7 に書いてあるね。 int() すなわち 0 で初期化される。
59 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:24:54 ] >>57 ,58 ありがとです。
60 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 01:00:48 ] C++Builderです。 builderのウィンドウで、タブ(Astandard,Additional,Win32,System,,,) ってありますが、こういうことする場合は、どんな部品を 使用すればよいでしょうか?
61 名前:60 mailto:sage [2007/06/26(火) 01:03:49 ] タブをクリックしたら、なにか表示させたり、 追加、削除もしたいんです。 よろしくお願いします。
62 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 02:34:19 ] >>38 あんたの思ってるとおり、しといたほうが安全だよ。 その前に std::exception は別でキャッチしてエラー表示してね。
63 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 05:55:44 ] 変な状態のままデストラクタが呼ばれたら、 それはそれで危険という気もしなくもない。 どっちがいいのかね?
64 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:36:20 ] 例外と言えば、例外指定って使ってる? 俺は使ってない。
65 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:37:35 ] 正常にインスタンスができたかどうかフラグ持っておけばいいんじゃないか
66 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:41:34 ] まあ、たとえ例外が起きても メンバ変数が変にならないように気をつけるべきということで、 キャッチされても問題ないように作るべき、なのかな?
67 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:55:33 ] >>63 ,65,66 www.boost.org/more/generic_exception_safety.html boost.cppll.jp/HEAD/more/generic_exception_safety.html 「まるで例外は、正しいコードに対するミステリアスな攻撃であり、 我々が自らをその攻撃から守らなければいけないようなものであると 見なされているかのようである。 言うまでもなく、これはエラー捕捉との 健全な関係に繋がらない!」
68 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:00:32 ] >>64 boost や標準ライブラリの方針によれば、使わないほうがいいってことになる。 www.boost.org/more/lib_guide.htm#Exception-specification
69 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:08:14 ] 最適化の問題で使わない方がいいという話もあるのか。なるほど。
70 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:17:40 ] 標準ライブラリで std::exception::what だけ例外的に例外指定を持ってるのは、 catch 中で別の例外起こされたら面倒だからかな?
71 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:23:55 ] >>67 確かに健全な関係ではないけど、 無視できないんだよなあ。 例外指定を普通使わない以上、 どの関数がどんな例外を投げるか パッと見分からないことも多いし、 思わぬ例外を投げられたらそれは ミステリアスな攻撃と思われてもしゃーない気がするよ。 全ての関数が例外を投げる可能性があるって感覚で プログラムを組むのがいいのかね。
72 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:35:26 ] >>71 安全側に倒すという意味で、そう思ってかかってもいいだろう。 思わぬ例外を投げられてもきちんと動作するように書くべきだし、 極力そう書くことができるように言語や標準ライブラリが整備されている。
73 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:36:45 ] >>70 標準ライブラリの中でも throw() はいろんな関数についてるよ。 型付で指定してるのはグローバルな operator new () ぐらいかな?
74 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:44:20 ] >>73 あ、そうなんだ。 std::exception::what はオーバーライドすることがあるから 目立つってだけのことか。
75 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:46:24 ] >>72 Joel タンが例外嫌いなのも、そのあたりが気持ち悪いからなんだろうな。 でも、標準ライブラリやキーワードが例外投げる以上、 無視するわけにもいかないと思うんだけどね・・・。
76 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:26:57 ] >>75 あの話は戻り値についてもいっしょだろ。 ただ単に戻り値でのチェックに慣れているから、 戻り値をチェックしていないコードのほうが見つけやすいって話。 例外に慣れてしまえば、例外安全でないコードは同じぐらい 簡単に見つけられる。ただし現状では、↑の理由で他の人に 伝わらないことが多い。 敢えて言い切ってみたけど、ホントのところはちょっと自信が無い。 新しい言語をデザインするなら、 try ブロックじゃなくって nothrow ブロックを作ればいいんじゃないかと思う。 「オレはここでは例外が飛ばないと仮定して書くぜ」っていう ブロックね。
77 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:31:57 ] どうなんかねえ。 例外をうっかり無視するコードより、 戻り値をうっかり無視するコードの方が危険性は高いと 個人的には思うんだけど。
78 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:35:19 ] つーかC++の例外が糞で使いにくいだけ
79 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:35:24 ] 例外は「うっかり無視」できないのがいいんだよ。
80 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:43:09 ] そうそう。
81 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:55:16 ] 例外は戻り値と違って発生源や内容の概要が簡単に特定できるから エラー→復旧っていう処理に使いやすい エラーしたら即一連の処理を中断するだけなら戻り値でもいいけど エラー内容によってstrategyパターンを使って処理を色々と変えるなら 例外の方がやりやすい と思ったんだけどどうかな? 軽く試してみてちょっと良いかもって思っただけで使い続けられるとは限らないけど
82 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:05:12 ] std::fstream のコンストラクタに渡すファイル(パス)文字列って、 ネイティブなフォーマットのものなの?それとも POSIX 準拠じゃなきゃいけない?たとえば UNIX では /home/hoge/test.txt で Windows では C:\home\hoge\test.txt ? どういうフォーマットのパス文字列を取りうるかに関する 規約って定められてるの??
83 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:39:34 ] POSIX かんけーねー。 処理系で好きに決めりゃいいべさ。
84 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:48:09 ] そうか・・・標準の C++ のライブラリではそこまでは 決められていないんだね。 boost::filesystem では native/ portable が厳密に切り分けられていたので、 fopen や fstream でもそうなってるのかと思った。
85 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:51:43 ] >>82 const char*なのが困り物 たとえばVC++8.0ではlocale依存の方法でUTF-16に変換する それ以前ではコードページ依存の方法でUTF-16に変換する いずれにせよ、NTFSのUTF-16なパスを正しく扱えるとは言いがたい UTF-16なパス名をちゃんと扱いたければ、fstreamを捨てて カスタムのストリームバッファを作れという話になるだろう
86 名前:デフォルトの名無しさん [2007/06/26(火) 21:17:53 ] ofstreamやifstreamでファイルを開くとき、 ios::binary指定というのは、意味があるのでしょうか? コンパイラはg++です。 いままでとくに指定してもしなくても結果は同じになりました。
87 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 21:23:21 ] >>86 UNIX系は関係ない。 WIndowsはstd::endlや\nを書き込むと0x0d0x0aになって書き込まれ 読むときは0x0d0aが0x0aになる。
88 名前:デフォルトの名無しさん [2007/06/26(火) 21:26:02 ] ios::binaryしない奴は死ねっていつも思う。
89 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 21:27:15 ] >>86 テキストファイルを特別扱いする(というよりC++としては特別扱いしなければならない)環境も結構ある 有名どころではDOS/Windows系のテキストファイルでは改行コードがCR+LFになっていることが挙げられる そういう環境では、テキストファイル特有の処理を行わせたくないときに、バイナリモードを指定する必要がある 逆にUnix関係では大抵違いがないが、移植性向上のために必要に応じバイナリモードを意識的に使うのは良いことだ Unixとかでもワイド文字ストリームなら、文字コード変換をどうするかで テキストモードとバイナリモードの違いが表れるはず
90 名前:デフォルトの名無しさん [2007/06/26(火) 23:37:20 ] while(!feof(fp1)){ ch = fgetc(fp1) if(!feof(fp1) fputc(ch,temp); } ファイルの中身を別のファイルにコピーする場合の例題に書かれていたコードなんですが whileの式で(!feof(fp1))と記述されているにもかかわらず何故さらにif(!feof(fp1)と書いているのは何故なんでしょうか? 何か意味があるんですか? whileの式でファイルの末端にきたらループ終了なのでifの式は必要ないように思えるんですが
91 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:44:12 ] >>90 意味以前にその例題、コンパイルできるか?
92 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:45:19 ] >>90 fgetc()で読みに行ってみないとEOFだとわからんことがあるから。 その場合、whileの条件式の時点ではEOFではないと判断して 読みに行ってみたらEOFだった(読めませんでした)というカタチになるので 下のチェックが要る。 だがこんなのは糞コード。 while ((ch = getc(fp)) != EOF) putc(ch, temp); とするがよい。
93 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:12:20 ] >>92 バイナリファイルを操作する場合は>>90 の方がよい
94 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:13:20 ] >>93 なぜ?
95 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:16:51 ] >>94 int型と比較した時、EOFと同じ値のバイトが存在する可能性があるから
96 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:17:02 ] とても初歩的な質問ですが short i; long k; float f; double d; としたときに @ (f+15)/(long)(d-15) A k+20.0 B (int)d/i の型(double,longなど…)はどうなるでしょうか? こういう場合は計算式の中でもっとも高精度な変数の型になると理解すればいいのでしょうか?
97 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:17:55 ] >>95 あ、chがcharだと仮定しているわけね。 それならば、単にint chと宣言して>>92 のコードで良い。
98 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:21:04 ] >>96 整数拡張、型の昇格
99 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:23:00 ] というかgetc()の戻り値をcharで受け取る奴がアホ
100 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:13:04 ] C++でのバイナリファイルの読み書きは、ifstreamのreadとか、ofstreamのwriteを使うんですよね。 気になったのは、どちらも char * を指定するところです。freadは void * だったと思うんですが。。。 ifs.read(reinterpret_cast<char *>(&hoge), sizeof(unsigned)); という感じで、毎回キャストしないといけないんですか?
101 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:27:57 ] >>100 残念ながらキャストが必要。 毎回キャストするのが嫌なら、適当な関数で包め。
102 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 04:13:44 ] 別にfread使っても一向にかまわないわけだし。 適材適所。
103 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 09:36:59 ] freadはvoid*の代わりに、サイズと数の2つを指定するだろう
104 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 09:42:16 ] fread()/fwrite()は(Unixの)read()/write()のインタフェース 真似れば良かったのにな
105 名前:デフォルトの名無しさん [2007/06/27(水) 10:16:53 ] データがBIG ENDIANかLITTLE ENDIANのどちらかで 単純に&hogeで受け取れない場合もあるし。 つまり、CPUとデータの並びが逆の場合。 今回みたいに並びが合ってるのなら、union使えばいいんじゃないか?
106 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 10:26:23 ] ネットワークを跨ぐとか、別PCでもそのファイルを r/w するのならエンディアン気にするけど… たかだか、同じPC内で完結するのならそのまま保存するよね?
107 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 10:41:33 ] そりゃファイル仕様に因るべさ。
108 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 10:49:46 ] ああ、先にファイル仕様があって(当然エンディアンも明示されてて)それを 読む→(なんかする)→(書く) なら、それに従うしかないね。
109 名前:デフォルトの名無しさん [2007/06/27(水) 12:14:06 ] >>87-89 なるほど、ではテキストでないときには、 ios::binaryを付けるようにします。
110 名前:デフォルトの名無しさん [2007/06/27(水) 14:39:49 ] 基底クラスのポインタを継承クラスの動的配列でオーバーライドすることはできませんか? class Base{ public: Base(){val0=0;}; virtual ~Base(){}; virtual void show(void){cout << val0 << endl;} int val0; }; class Deriv:public Base{ public: Deriv(){val1 = 1;}; virtual ~Deriv(){}; virtual void show(void){cout << val1 << endl;} int val1; }; int main(int argc, char *argv[]) { Base *test; int num = 10; test = new Deriv[num]; for(int i=0;i<num;i++) test[i].show(); } を実行すると,main()の中のfor文2回目のループ(i=1)で 0x0041e12c でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000005 を読み込み中にアクセス違反が発生しました。 。 というエラーが出ます。 test[0]は無事Derivにオーバーライドできていますが,test[1]以降が不可能なようです。 何か良い方法はないでしょうか? 環境:WindowsXP + VisualC++ Ver.7
111 名前:110 [2007/06/27(水) 15:02:56 ] オーバーライドの意味間違ってますね。 何と呼んで良いのか分からないですが、領域確保? とにかくnewするという意味です。
112 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:11:45 ] >>110-111 BaseとDerivのメモリ上の大きさが違うのに、配列でどう動けと。
113 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:34:55 ] 無理するなら↓ ((Deriv *)((char *)test + sizeof(Deriv) * i))->show(); もしくは↓ ((Deriv *)test)[i].show();
114 名前:110 [2007/06/27(水) 15:51:45 ] >>112 ,113 ありがとうございます。 なんとなく分かりました。 new Deriv[num]が失敗してるのではなく、 forループのなかでのindexの指定が間違ってるということですね。 *testがBase型のポインタなので test[i]はtest[0]からBaseを基準にアドレスを進めることになるのか。 >>113 さんの方法で動きましたけど、 そもそもこういう状況が必要になる設計はまずいでしょうか?
115 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 16:28:34 ] >>114 一般的にはまずい。 でも、テンプレートを使って下のようにやればできないことはない。 template<class T> class poly_array { template<class U> poly_array(U *ptr, int array_size) : ptr_(ptr), size_(sizeof(U)) ... {...} T *get(int i) {return (T *)((char *)ptr_ + size_ * i); } private: T *ptr_; size_t ptr_size_; ... };
116 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 16:34:21 ] 基底クラスへのポインタの配列を作って、 それぞれに対してまたオブジェクトを作っていくのが、 まあ一番安全なのかね。 メモリ管理が複雑になるという点では、 安全とは言えんかもしれんが。 >>115 はちょっと感動したよ。
117 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 17:51:04 ] 下記を左側の数字のキー値で、ソートしたいです。 (8,x),(2,y),(3,z)・・・ ソートして、 (2,y),(3,z),(8,x)・・・ を出力。(int,std::string)の形です。 どういうデータで扱って、どのような方法がよいでしょうか。 mapとか自動でソートされるみたいですが、 自分で比較して並べ替えたいです。 よろしくお願いします。
118 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 17:58:37 ] int, std::string をメンバに持つ構造体の配列? それなら構造体で < 演算子をオーバーロードするか 比較関数を定義するかすれば std::sort でソートできるけど。
119 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:00:21 ] >>117 つ[std::vector]
120 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:12:57 ] 訂正お願いします。 ×キー値で、ソート ○キーでソート >>118 ごめんなさい。 「(int,std::string)」 これは、余計でした。(数字,文字列) なんです。 どのデータに入れて、どんな風に処理するのか知りたいです。 >>119 std::vectorに、キーを入れてソートするんでしょうか? 対応する値は、どうやって対応させて出力を。。。
121 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:19:20 ] 何がしたいのかよく分からない。 int 値はキーで、std::string はキーに対応する値? std::map を使うのがベストだと思うけど、 std::map を使わない理由は何かあるの?
122 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:22:08 ] >>117 とりあえず、すんごい単純で愚直な方法。 #include <iostream> #include <string> #include <vector> #include <utility> #include <algorithm> typedef std::pair<int,std::string> nspair; bool cmp(const nspair& a, const nspair& b) { return a.first < b.first; } int main() { int n; std::string s; std::vector<nspair> vec; while (std::cin >> n >> s) vec.push_back(nspair(n,s)); sort(vec.begin(), vec.end(), cmp); for (std::vector<nspair>::iterator i = vec.begin(); i != vec.end(); ++i) std::cout << '(' << i->first << ',' << i->second << ')' << std::endl; }
123 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:25:51 ] >>116 つboost::ptr_vector
124 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:41:02 ] >>121 (数字,文字列),,,, をキーでソートするんですが、どんなデータに格納して どんな処理をするのか知りたかったんです。 >>122 プログラムも、書いていただきありがとうございます。 数分しかたってないのに。(汗 中身がstd::pairのstd::vectorですか。 typedefの使い方もすごい勉強になります。 ありがとうございました。
125 名前:119 mailto:sage [2007/06/27(水) 19:10:32 ] ちっ、プログラムを書いてみたけどstd::pairとstructの違いだけで殆ど同じだから貼るのやめよ。
126 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:01:34 ] >>124 (数字,文字列) 全体がキーなの? じゃ、それに対応する値もあるの? それとも set みたいにキー=値なの? そして、数字が同じ時には文字列も比較するの? と、質問攻めになってしまった。
127 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:30:26 ] 結局ポインタって何に使うんですか? 違った名前の変数で同じ値を参照できるってことですか? でも同じアドレスの値を参照するだけならわざわざポインタの方の変数を作る必要は無い気が・・・・ ていうかそもそもいろんなソースコードを見ててもポインタを使ってるのはあまり見かけませんが・・・・
128 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:32:29 ] >>127 C はポインタが無ければ配列も関数に渡せない言語です。
129 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:34:24 ] ポインタ使いまくりw ポインタを理解していないみたいだが君も知らない内に使ってるよ
130 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 22:04:33 ] >>127 scanfを使ったことはないのかい?
131 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 22:08:35 ] ポインタより似たような文法上の特徴を持つC++のイテレータの方から覚えた方がいいかもね 概念としては似たようなもんだし、イテレータ理解できるならポインタも理解できるようになるか どうしてもポインタが駄目ならC++でイテレータから入るのも十分ありだよ
132 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 22:54:19 ] ポインタの概念を理解できないレベルでイテレータを理解できるか疑問
133 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 23:05:18 ] イテレータ自体がデータをポインタライクに扱うようなもんだしなぁ
134 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 23:08:52 ] ポインタのノリでイテレータが使うとそれはそれでバグの元に・・・
135 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 23:10:27 ] アドレスがどうのという話が無いぶんイテレータの方が簡単だと思うな 概念的な話より、何が出来るかの方が理解しやすいだろう
136 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 23:25:39 ] 抽象概念を理解できない香具師にはどっちみち理解できない罠。
137 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:07:25 ] ポインタがわからない→Javaへ行く Javaのダメプログラマがまた一人。
138 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:17:46 ] >>127 a = 5; /* aに対応する箱に5を入れる */ b = a; /* bに対応する箱に、aに対応する箱から取り出した値を入れる */ おんなじaでも式の右辺と左辺ではぜんぜん意味が違うのだが、それを理解してるかな? 物を入れるには箱が必要で、Cで箱そのものを値として取り回すための 仕掛けがポインタだ。 どういう時に必要になるかはいずれ分かる。
139 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:47:44 ] Cでのポインタの必要性が特に大きいのは、配列や左辺値を渡す手段が 他に存在しないから。関数は全部値渡しだし。 参照渡しが存在するならポインタの必要性は大分減るが、リストや木のような 配列より複雑なデータ構造を扱うようになれば、ポインタの有用性が自然に 理解できるだろう。
140 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:14:41 ] >>127 関数とのデータ受け渡し時に構造体とかそのまま実体渡すとコピーされるのでメモリの無駄だし速度的にもデメリットがある それに不定なサイズのデータを扱おうと思ったらポインタ使うと思うが。
141 名前:デフォルトの名無しさん [2007/06/28(木) 14:42:29 ] vc++2005で警告レベルを/W4にした時、 stlのアルゴリズム使って代入処理とかイテレータを用いたコンテナの初期化とかすると > xutility(1685) : warning C4244: '+=' : '__int64' から '__w64 unsigned int' への変換です。 > データが失われる可能性があります。 とかコンパイラ様が仰られて出力窓がカオスになって困るのでこれをどうにかしたい訳ですが こういうのは#includeディレクティブの羅列全体に(つまりxutilityを使ってるライブラリ全体を) #pragma warning(disable:4244)と #pragma warning(default:4244)やpush, pop使って抑制を適用しちゃっていいんでしょうか? 一応、ライブラリ以外の部分ではちゃんと/W4で警告が行われますし問題ないと思うんですが なんか良い解決法ってございませんかね?
142 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 14:47:55 ] >>141 __w64 は 64 ビットにするんじゃなくて、 32 ビット環境でコンパイルする時にも もし 64 ビットにしたとしても整合性が取れるかチェックするだけ。 つまり、__w64 unsigned int は 32 ビット環境では 32 ビット符号無し整数型になる。 __int64 は 64 ビット符号付き整数型だから、 そこから 32 ビット符号無し整数型への暗黙変換で警告が出るのは当たり前。 それで本当に大丈夫なのかをまず確認した方がいい。
143 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 14:53:54 ] boost::serialization ってクロスプラットフォームで 使ってもおk?つまりできたファイルはプラットフォームを またいで移動してもおk?たとえば endian の異なる プラットフォームに持っていっても安全?
144 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 15:32:13 ] >>142 なるほど、助言をヒントに 使用するされているイテレータの差の型にsize_tを指定して定義すればあっさりと消えました どうもです><
145 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:04:11 ] >>144 > イテレータの差の型 difference_typeのことならstd::size_tよりも 符号付のstd::ptrdiff_tのほうがいい。 it = begin(); it2 = begin(); ++it2; このときit2 - itは1になるはずで、it - it2は-1になるべきだから。
146 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:25:10 ] >>143 あれの出力形式にはいろいろあって、 バイナリは知らないけど、xmlなら間違いなくできる。
147 名前:デフォルトの名無しさん [2007/06/28(木) 17:51:43 ] API の話ではないが、質問していいですか。 _tprintf(_T("あいう")); とするとコンソールに正常に表示されないのですが、 どのようにしたら正常に表示できるでしょうか?
148 名前:デフォルトの名無しさん [2007/06/28(木) 18:00:43 ] setlocale(LC_ALL, ""); でできた。
149 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:02:18 ] イテレータの差ならiterator_traits<hoge_iterator>::difference_typeだろ。
150 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 23:31:40 ] 板違いで流れてきましたw 01011010みたいに 日付が4桁4桁になってる 8桁の数字一覧の出力方法教えてください
151 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 00:53:49 ] >>128-140 関数内で宣言した変数はほかへは渡せないから、同じ中身を参照できるポインタを使って ほかの関数内でも関数内で変更した変数を渡せるようにするのがポインタですか? 自分で書いててわけがわからない文だな・・・・ とりあえずまだまだ自分は未熟なのがわかったのでまた最初から勉強しなおします!
152 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 07:50:22 ] >>150 それは、西暦101年10月10日か、01年1月10日10時なのか、1月1日10時10分なのか、101日目、10時10分なのか、 或いはそれ以外の表現なの? そもそも一覧とはなんなの?
153 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 09:46:27 ] お客様の中にESP能力者の方は・・
154 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 09:48:43 ] %04d%02d%02d
155 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 13:59:10 ] 同じ内容の関数を、マルチスレッドで動かして ログファイルに処理内容を、追加書き込みで 書き出してます。 std::ofstream ofs( FileName.c_str(), std::ios::out|std::ios::app); ofs << message; 結構、同じタイミングで書き込むときあると思うのですが、 排他処理したほうがいいでしょうか? そもそも"ファイルが壊れる"っていうのは、どんな壊れ方があるのでしょうか? 真っ白になっちゃうのか、混ぜこぜで書き込みされる。などですか?
156 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:04:07 ] >>155 混ざります。しかも、通常バッファリングされるので行の途中でもお構いなしに混ざることになります。 運が悪いと、書き込んだ筈の分がロストしたり以前の分がロストしたりするかもしれません。
157 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:06:54 ] 俺の認識な。 ファイルが壊れる = ファイルアクセスに失敗してしまう。 居るように見えて実体が居なかったりする等 マルチスレッドのロギングで、同期取ってない場合 出力が途中で差し込まれたようなデータ列になる等、意図してないフォーマットで出力されてしまう
158 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:07:57 ] >>156 混ざるのは、構わないと思ってたのですが 無くなるときもあるんですか。 じゃあ、ファイルロックとかで、ロックするようにします。 ありがとうございました。
159 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:09:19 ] >>157 ふむふむです。勉強になります。 ありがとうございます。
160 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:12:02 ] >>157 もみもみです。あぁ〜ん♪ 感じちゃう?
161 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:24:45 ] >>155 使っているlibc++がマルチスレッド対応してるなら(今時なら普通してると思うが) istream/ostreamの関数呼び出しの単位で排他してくれてるはずだ。 つまり、例えばあるスレッドでoperator<<()が呼ばれた場合、その間は streambufがロックされるので、streambufの内部状態が壊されることが無い。 ヘルプなどのドキュメントに明記されていないなら、ソースを読むんだね。 ただ、排他はあくまで関数呼び出し単位なので、例えば ofs << n << ":" << s << endl; のようなことをやっているコードでは、operator<<()が4回呼ばれている間に 他のスレッドからの出力が割り込む可能性は当然あって、その場合は 出力がぐじゃぐじゃになる。 それを避けたければ、常に1行単位で出力関数を呼ぶようにするとよいだろう。 無論自前で排他をするという手もあるが。
162 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:25:36 ] バッファリングはどーなのよ
163 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:28:01 ] >>162 バッファリングを管理しているのはstreambufで、これがstdioのFILEの対応物。 i/ostreamはstreambufへのポインタを保持しており、排他はstreambuf自体を ロックするような形でやっていることが多いはずだ。 つかソース嫁よ。
164 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:31:06 ] 結局スレッドセーフなカスタムストリームを実装するしか無いなね…orz
165 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:35:55 ] 無いなね
166 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:36:41 ] OTL
167 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:51:26 ] >>163 別に聞いたわけじゃない。 >>161 のように排他してもバッファリングしてたら意味無いだろ、と
168 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:56:17 ] アンダーバーで始まる関数 _stprintf_s みたいにアンダーバーで始まる関数があるのですが、 アンダーバーで始まる関数には何がしの意味があってアンダーバーをつけてるのですか? たとえば、MSによって拡張されたことを示すために付けられたとか
169 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:59:44 ] バッファへの操作込みで排他処理されてるんじゃないのか?
170 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:03:59 ] >>168 ttp://www.microsoft.com/japan/msdn/security/demo/runtime.aspx
171 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:05:18 ] って前の _ か 標準じゃないやつにつけるべ
172 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:07:11 ] MS は独自の拡張関数に _ つけるよね。
173 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:16:35 ] >>168 アンダーバーから始まる名前は処理系のために予約されている と規格で決められている
174 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:25:35 ] >>169 バッファリングされる場合、実際にファイルに書き出されるのはどのタイミングか判って言ってる?
175 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:31:43 ] それが何か関係あるの?
176 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:33:57 ] バッファ単位での実書き出し最中に、別スレッド側のバッファ操作はどうなるか
177 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:37:59 ] 失敗するー だから入出力関数の戻り値は常にチェックしてけって話ですか?
178 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:39:21 ] 同じバッファ使って操作するわけじゃなくて、 別々のバッファで操作しようとしてるの?
179 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:47:23 ] そりゃ別スレッドなんだからバッファは違うだろう
180 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:49:43 ] 同じファイルに追記するだけなら、 別スレッドで同じオブジェクトを共有して 操作したんでいいんじゃないの?
181 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:58:37 ] OS管理下のファイル本体 ↑↓ OS管理下のバッファ ↑↓ ライブラリ管理下のバッファ なんとなくライブラリ管理下のバッファの排他がかかってればうまくいきそうだが…
182 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 16:00:15 ] スレッドセーフ版のライブラリを名乗るからには そうなってんじゃないの?
183 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 16:59:25 ] >>167 バッファリングされていようが、何の問題もないよ。 脳内の想像でいい加減なことを言っていないで、ソースを読むかせめて 実験したらどう?
184 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 17:18:33 ] >>172 _snprintf() と snprintf() の挙動の違いにしょんぼりした。
185 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 17:24:42 ] 今のgnustdc++ってMT safeなんかな? VC++だと、basic_ostream<>::sentryを利用して排他制御をやってるんだが、 3.4.4ぐらいのgccだと、何もやってないように見えるな。
186 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 17:29:58 ] もしかして>>167 は、同じostreamオブジェクトに複数スレッドから 書き込むのではなく、 同じファイルに複数スレッドから別々のostreamオブジェクト経由で書き込むという 状況を想定してたのか? 無論、その場合はostream内部で排他制御しても何の意味も無いぞ。
187 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 17:34:42 ] >>186 >同じファイルに複数スレッドから別々のostreamオブジェクト経由で書き込む こっちのほうが複雑な排他制御になりそうだな…
188 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 17:49:39 ] ログ出力のように行レベルではアトミックであって欲しい&必ず追加書きって ケースを想定するなら、 例えばUnixだと、O_APPENDでopen()してwrite()一発で1行を書き込むように している限りは、マルチスレッドだろうがマルチプロセスだろうが、 何の排他制御も要らない。
189 名前:デフォルトの名無しさん [2007/06/29(金) 20:46:52 ] Visual C++ 2005を使用しています。 xmlの書式で書かれたデータがint型の配列に入っているとします。 その配列から、xmlのあるタグ(例えば<script>という文字列)が あるかどうかを検索したいと思います。 この場合、どのような方法がお勧め(簡単な実装、早い検索)でしょうか? 以下のいずれかを考えていますが、どうでしょうか? (1) memcmp()を使いながら、<Script>に対応する数字を探していく (2) string型に変更し、string.find()で探す そのほかにお勧めの方法はあるならご教授願います。 (2)をすべきなら、どのようにint→stringに変換するのでしょうか?atoiを使うので しょうか?
190 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 20:49:38 ] > xmlの書式で書かれたデータがint型の配列に入っているとします。 ここから既にイミワカンネェ
191 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 20:56:43 ] どうやって読み出してきたら、int型配列になるんだ? ひょっとして、UCS4なのか?
192 名前:デフォルトの名無しさん [2007/06/29(金) 21:05:29 ] xml形式のデータがint型の配列に返ってくるメソッドがあるのです。 void method(int *value) というメソッドを使うと、valueの中にxmlが返ってくるケースがあります。 xmlデータじゃないのも返ってくるのでint の配列で返ってくるのだと 思います。 すいませんが、教えていただけないでしょうか?
193 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:12:22 ] エスパー募集中☆
194 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:16:38 ] intにどうやってxmlを入れるんだ?
195 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:20:22 ] >>192 だから、その int 配列の中にどういう形式で文字列が入ってるんだ? と。 >>191 の言うように UNICODE (しかも32ビットの UCS4)なのか。 コード体系によってその "<script>" だって表現の方法が変わってしまうから、 そこが分からなければ意味がないし(というかそれこそがこの問題の本質)、 そこを君が述べていないので「ESP」とか言われてしまうのだよ、と。
196 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:20:27 ] 無理矢理入れます。処女マンコ犯すように
197 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:21:27 ] >>195 xmlで入ってます。
198 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:22:01 ] xmlを扱うなら専用ライブラリ使う、もしくは作るべし
199 名前:デフォルトの名無しさん [2007/06/29(金) 21:22:18 ] ご返信ありがとうございます。 "<?xml" だったら "60 63 120 109 108"とそれぞれの値が int型の配列に入っております。 String型でデータをもらえればいいのですが、メソッドの仕様の 関係上、int配列でしか受け取れません。
200 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:22:34 ] もはや釣りにしか見えん
201 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:22:57 ] なんで言葉で説明しようとするのかね。 データをそのまま貼り付ければいいのに。
202 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:23:48 ] とりあえず文字列形式に変換してから、 ライブラリ通して解析すべき
203 名前:199 [2007/06/29(金) 21:23:59 ] Asciiコードで入っております。 みなさんを混乱させる状況にしてしまってすいません。
204 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:24:23 ] >>199 漢字が入ってる場合はどういう具合に返ってくる?
205 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:24:42 ] 文字化けして返ってきます。
206 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:25:03 ] >>205 文字化けじゃわからんから、実例で示せ
207 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:27:33 ] ってか、漢字ってこの話で関係あるのか?
208 名前:199 [2007/06/29(金) 21:27:41 ] 返ってくるデータに漢字は含まれないのでわかりません・・・ みなさんを怒らせてしまってすいません。int→stringの文字列 変換を行うことを考えて実装してみます。 本当にすいませんでした。
209 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:28:29 ] 失礼しちゃうわ!
210 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:29:20 ] >>207 エンコーディングを判別したかったんだが。 XMLライブラリを使うんなら必要なことだろ。
211 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:30:10 ] asciiって言ってるじゃん。
212 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:31:09 ] >>211 漢字は文字化けするとも言ってるが。
213 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:32:17 ] まあ本人がもういいつってんだからどうでもいいやな。
214 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:32:20 ] >>212 だから、Asciiだから漢字は含まれていないし、 含まれていたらどうなるか分かりませんって言ってるんでしょ。
215 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:32:33 ] VCのデバッガで見て言ってたんじゃないかな
216 名前:199 [2007/06/29(金) 21:35:06 ] たびたび出てきてすいません。 205は私は書いておりません。ASCII文字です。 215さんのおっしゃるとおり、デバッグで確認して 回答していました。
217 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:35:45 ] 失礼しちゃうわ!
218 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:38:01 ] 191が指摘しているとおりなのだが、 intが4バイトならUTF-32、2バイトならUTF-16と見なして構わないはず。 そのまま適当なXMLのライブラリへ投げてしまえ。
219 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:38:19 ] > xml形式のデータがint型の配列に返ってくるメソッドがあるのです。 > "<?xml" だったら "60 63 120 109 108"とそれぞれの値が > int型の配列に入っております。 もしかして、単にテキストファイルを読み込んで各文字(ASCII)のコードを int型の配列に格納しているだけ? 1行ずつとか、ファイル全体とか。XMLの構造に関係なく。
220 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:38:29 ] 質問です。 配列の要素数をキーボードからの入力によって定めさせたい場合、どのような方法があるでしょうか。 int n; int a[n]; という宣言だとa[n]の宣言がエラーになってしまい、scanfによってnの値を決定した後にa[n]を宣言してみてもやはり「そこで宣言は出来ない」とエラーになってしまいます。 どなたかよろしくお願いします。
221 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:40:02 ] int *a; nを読み込む。 a = (int*)malloc(sizeof(int)*n);
222 名前:199 [2007/06/29(金) 21:42:18 ] 219さんのおっしゃる通りでした。xmlなどの概念を理解せずに 使用してしまって混乱を招いてしまったようです。 >もしかして、単にテキストファイルを読み込んで各文字(ASCII)のコードを >int型の配列に格納しているだけ? >1行ずつとか、ファイル全体とか。XMLの構造に関係なく。 この場合、XMLのライブラリを使えるのでしょうか?
223 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:42:21 ] >>220 CかC++か、どっちだい Cならmalloc/freeで検索 C++ならnew/deleteで検索、もしくはstd::vectorで検索 でもそのレベルだとnを十分大きく取るって解決策の方が いいかもしれない
224 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:45:24 ] >>222 もし非ASCII文字が入っていないなら、>>219 の言うとおりにやればいい。 と言いたい所だが、sizeof(wchar_t) != sizeof(int)のときに、 int配列をそのまま処理してくれるXMLライブラリってあるのかな。 俺は知らない。 ただ、非ASCII文字が無いのなら、stringなりchar配列に変換するのは 難しいことでも何でもない。受け取ったint配列の値をそのまま 突っ込んでいくだけだからな。
225 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:45:58 ] >>199 とりあえずXMLのライブラリを探してきて、その仕様を調べること。 仕様を見て理解できないようなら、まずはC言語の基本とかXMLについてもっと勉強すること。
226 名前:199 [2007/06/29(金) 21:47:54 ] みなさん、本当にありがとうございました (1) XMLのライブラリを調べる、勉強する (2) int型配列をStringに変換することを考える で、がんばってみたいと思います。ありがとうございました。
227 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:49:54 ] 100年後にまた会えるといいな
228 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:50:56 ] 真面目にやれば数日後だと思うけど、まあ頑張れ
229 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 22:01:06 ] ところでさっきからStringといっているのが気になるが、 もしかして.NET FrameworkのSystem.Stringのことか? それならUnmanagedMemoryStream + StreamReader + UTF32Encoding 必要ならそれにXmlTextReaderでいいような気がする。
230 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 22:04:48 ] >>168 です。 お前ら、ありがトン。 アンダーバーで始まる関数: アンダーバーから始まる名前は処理系のために予約されている。 そして、これを利用してMS は独自の拡張関数の名前の最初に_ つけている。 ということだな。
231 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 22:06:12 ] 違うよ?
232 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 22:14:24 ] >>231 230でないけど何が違うか教えてください
233 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:58:49 ] >ということだな。 違うよ?
234 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 04:16:48 ] 「処理系のために」ではないだろ。
235 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:22:32 ] ハード的なクリックでは無くソフト側で移動・クリック・入力の繰り返しをさせるプログラムを作りたいのですが MSDNの見方がよく分からなくてmouse_eventを使うかもしれないという程度しかわかりませんでした・・・ 使えるAPI・サンプルなどがあったら教えてください よろしくお願いします
236 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:39:51 ] SendInput
237 名前:デフォルトの名無しさん [2007/06/30(土) 09:01:14 ] 質問です!! C言語のボーランドでコンパイルしたら元のメモ帳と、コンパイル後のファイルとって感じでいくつか手元にファイルできますよね。 そのとき作ったメモ帳が消えてしまったのですが(プログラムの実行はできる状態)。 コンパイル後のファイルからもとのメモ帳ってもう見ることができないのでしょうか・・・? わかる方よろしくお願いします。
238 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 09:02:16 ] メモ帳って何だ?
239 名前:デフォルトの名無しさん [2007/06/30(土) 09:03:12 ] んと、メモ帳にmainやらintやら打ち込んで、ボーランドでコンパイルしてコマンドプロンプトで実行って形でやってます。 そのとき書き込んだメモ帳です。
240 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 09:11:39 ] 先ず最初に、「メモ(すなわちファイル)」と「メモ帳(アプリ)」を区別するところからはじめる必要がありそうだ。 で、あんたはその「メモ」をなんて名前で保存したんだ? そいつはコマンドプロンプトでdirしても見えないのかい?
241 名前:デフォルトの名無しさん [2007/06/30(土) 09:15:54 ] dir でも見えないし、元の場所からは特に動かしてないので・・・ お恥ずかしながら消しちゃったみたいなんです・・・・ コンパイルの逆、みたいなことってできないのでしょうか?
242 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 09:22:53 ] >>241 それは無理。
243 名前:デフォルトの名無しさん [2007/06/30(土) 09:23:43 ] う・・・・orz ありがとうございました。
244 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:32:14 ] >>234 >17.4.3.1.2 >Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace. implementationだから処理系でいいんじゃない? JISの方も処理系て訳されてるし。
245 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:37:12 ] 一応逆コンパイラはあるけど、 元のコードがそのまま出てくるわけじゃないからなあ。
246 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:46:10 ] デコンパイラでぐぐれ
247 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 18:46:38 ] スレッドで、複数の引数を受け取りたいとき、 std::vector<std::string>で渡したいと思ってます。 //スレッド関数 void Thread(void* vector){ std::vector<std::string> *vec=(std::vector<std::string>*)vector; //エラーでません。正しい? vec->clear(); //コンパイルできても、例外がどうのと出て止まります。vec.clear()のつもりです printf("%d",*vec[0].c_str()); //これだめです } ○vectorの関数push_buck(),insert(),clear()など、使用したり、 vec[0]、、、の中の値が知りたいのですが、方法ありますでしょうか。 ○vec.clear()とかしたいので、左辺にvecのままにして、いろいろ試しました。 std::vector<std::string> vec=(std::vector<std::string>)vector; これは、コンパイルできませんでした。右辺がおかしいみたいです。どうすれば。。。 ---------------------------------------------------------------- ○構造体の場合: vectorがstd::vectorではなく、自分で作った構造体の場合は、 Data *data = (Data *)vector; data->hoge; の要領で、できました。 よろしくお願いします。
248 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 18:53:01 ] >>247 たぶんスレッドに引数渡してるところがおかしい。
249 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 18:54:17 ] >>247 ・C言語の形式のキャストではなく、C++のキャストを使ったほうがいい。 ・コール元からThread()に渡したstd::vector<std::string>オブジェクトの寿命は大丈夫? ・vec[0]を見たいなら、std::cout << vec[0]; で良いんじゃない?
250 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 19:08:19 ] >>248 複数渡したいとき、構造体か配列などなどとあったので。。。 正直よくわからないです。すみません。 >>249 ・C++のキャスト検索してみます。 ・std::vector<std::string>オブジェクトの寿命ですか、 良く、無いものを参照して、プログラム止まります。 同じ症状なので、これかもしれません! ・vec[0]で、大丈夫ですか。了解しました。 ありがとうございました。
251 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 19:54:57 ] >>250 >>249 が指摘してるが、多分スタック上に確保したvectorのアドレスそのまま 渡してるだろ。それじゃクラッシュするのは当たり前だ。
252 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 19:56:01 ] >>250 ごめん、まちがえた。 × vec[0] ○ (*vec)[0]
253 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:32:10 ] //void* のポインタキャスト行ったりきたり実験 std::vector<std::string> vec2; vec2.push_back("hoge" ); void *vo=(void *)&vec2; //void*型、準備OK //ここから、スレッドの関数で受け取ってから、std::vector<std::string>に戻す。 std::vector<std::string> *vec=(std::vector<std::string> *)vo;//キャストしました。 std::vector<std::string> vec3=*vec; cout << vec3[0].c_str()<< endl; cout << (*vec)[0].c_str()<< endl;//おまけ。std::vector<std::string>にしなくても、これでもいい。 これは、正常に動きました。キャストの仕方とか大丈夫みたいなので、 参照しようと思ったデータが無いみたいです。 >>251 >多分スタック上に確保したvectorのアドレスそのまま >渡してるだろ。それじゃクラッシュするのは当たり前だ。 スタック?検索すると、 ”処理中のデータや戻りアドレスなどを一時的に退避する場合に使うことが多い” ってありました。 vectorは使用しなくなると自動的に、 開放しちゃうっていう、あれのことでよかったでしょうか?
254 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:38:10 ] なぜ新訂版More Effcitive C++の訳本は糞なのでしょうか?
255 名前:247 mailto:sage [2007/06/30(土) 20:39:16 ] vector、map、pairなど、いろいろあると思いますが、 こういうの使いたいときは、どうすればよいでしょうか? 自動で開放してくれなくても、いいので 構造体使うのが、わかりやすいですか。
256 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:42:28 ] >>253 > vectorは使用しなくなると自動的に、 > 開放しちゃうっていう、あれのことでよかったでしょうか? ほんとに意味を分かって言ってる? Javaなどのガベージコレクションと勘違いしないか? ここで問題にしてるのは、C/C++で関数(またはブロック)内で宣言した変数は その関数(またはブロック)を抜けると破棄されるということ。 いつの間にか勝手に消えるわけじゃない。
257 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:51:30 ] 使用しなくなったら開放、って理解でいいと思うよ。 考えるな感じるんだ。
258 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:57:05 ] >>255 vector, map, pairなどはそれぞれ特徴が異なる。 データ同士の意味的なつながりとか、検索/更新の方法や性能など。 複雑なデータの管理をするときに、その使用方法にあったデータ構造を選択すればいい。 単にいくつかの型が異なるデータをひとまとめにして扱いたいだけなら 構造体でいい。
259 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:57:17 ] あぁ〜ん!感じちゃう♪
260 名前:247 mailto:sage [2007/06/30(土) 21:12:13 ] >>256 詳しい解説ありがとうございます。 >>257 どもです。^^ >>259
261 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 03:24:35 ] 何を突っ込もうとしてたんだ、>290にw
262 名前:247 mailto:sage [2007/07/01(日) 06:54:52 ] >>258 255って、自分でした。 構造体でよかったですか。ありがとうございます。
263 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:16:49 ] template<class T> inline void ZeroMem(T& dest) { memset(&dest, 0x00, sizeof(T)); }; っていうのを作ったんですがこれって危険でしょうか?
264 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:18:02 ] めっちゃ危険
265 名前:263 mailto:sage [2007/07/01(日) 10:19:58 ] 用途はwinapiで使う構造体の初期化です 一応実際のものは、POD以外渡すとコンパイルエラーになるようにboost::type_traitsとか作って 細工してあります
266 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:30:09 ] >>265 クラスの中に、newなどで確保済みポインタがあったらどうするんだい?
267 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:36:33 ] それはそういうのを渡さないように気をつけるとしか。。。 でもそんな事いったらmemsetも使えませんし MSG msg; msg.hwnd = 0; msg.wParam = 0; とか打っていくのが面倒なんで考えたので 初期化済みかどうかを判別する方法があればいいのですが
268 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:39:35 ] >>267 MSG msg = {0}; // 全部 0 で初期化 msg = MSG(); // 全部 0 を代入
269 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:42:44 ] そういう手があったんですね、トンクスです
270 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:44:03 ] 何がトンクスど、トランクスか
271 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:44:04 ] こんなことも知らない奴がboost::type_traitsとか使ってんの蚊 釣りかと思った
272 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:56:34 ] 一年ほど前に使った記憶はありますが boostやpstadeと格闘している間、 構造体の初期化なんて殆ど使わなかったので忘れていました ま、実質知らないのと同じですね^^^;
273 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:58:34 ] ^^^何だこれは3つ目小僧か
274 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:48:20 ] どうしてC++にはコンストラクタとデストラクタがあって デコンストラクタはないのなぜ?
275 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:53:36 ] >>274 デコンストラクタって何ですか?デストラクタと同じものではないですか?
276 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:53:41 ] Con structor De structor
277 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:53:49 ] con-struct-erとde-struct-erだから 説明になっていないけど
278 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:53:51 ] デコンストラクタ = デストラクタ って考えちゃダメなの? 名前が違うだけやん
279 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:55:19 ] 15秒で4レスついてるw
280 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:00:42 ] すみません int a[] = new int[10]; int *b = new int[10]; みたいに確保したときって delete a; delete a[]; delete b; delete b[]; それぞれ解放の仕方で動作おかしくなりますか?
281 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:06:03 ] delete a; アウト delete a[]; アウト delete b; アウト delete b[]; アウト
282 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:08:16 ] これもアウトだ。 int a[] = new int[10];
283 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:08:56 ] >>275 デコンストラクタは脱構築です ただの破壊ではありません ポストモダンなのです たぶん
284 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:09:01 ] >>274 「デコンストラクタ」はただの誤用だろ。 と思ったらこんなところにも。 msdn2.microsoft.com/ja-jp/library/sxbac7x8 (vs.80).aspx 原文はちゃんと destructor なのにね。 msdn2.microsoft.com/en-us/library/sxbac7x8 (vs.80).aspx いちおう deconstruct という言葉も存在するらしい。 ja.wikipedia.org/wiki/%E8%84%B1%E6%A7%8B%E7%AF%89
285 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:09:57 ] >>280 自分で試してから聞けよカス
286 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:38:11 ] >>285 それは禁句だよ。 new[]してdeleteのような正しくないのに環境によっては動くものを 正しい方法だと思ってしまう可能性がある。
287 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:40:29 ] 配列のnew deleteは T* v = new T[n]; delete [] v; でおkなはず
288 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:46:31 ] いやここでstd::vectorとか言い出してやる。
289 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:48:11 ] valarrayの事も時々でいいから思い出してあげてください
290 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:49:43 ] >>286 今回はそれ以前の話。コンパイルできないのがダメ。
291 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:50:45 ] shared_arrayでいいんジャマイカ
292 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:00:49 ] いつものパターン: 書く → ビルド → エラーの数が100を超え(ry → (´・ω・`) → 少しずつ直していく → コンパイラ通過 → \(^o^)/ →実行時エラー → /(^o^)\ナンテコッタイ
293 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:03:35 ] delete b; は正常に動作する。 今回に限ってはメモリリークを起こさない。 ただ、b[1]〜b[9]のデストラクタが呼び出されないので、 プリミティブ型以外では動作保証ができない。 いかなる場合においても、new[]で確保したら、かならずdelete[]で解放すること。 だったっけ?
294 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:10:41 ] >>291 たまにはscoped_arrayのことも思い出してあげてください……。
295 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:15:44 ] >>293 いや違う。 未定義動作でFA。
296 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:29:41 ] >>293 デストラクタがあったらメモリの開放に失敗して落ちる環境がほとんど。
297 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:33:54 ] delete bで開放するのいいけど その後メモリ取ろうdeleteした近辺にnewなんかされると 悲惨なことになるぞw
298 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:35:24 ] >delete bで開放するのいいけど 良くない
299 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:39:20 ] 言語的にだめなのは分かるんだけど PODの場合で new[]で確保したのをdeleteでシメた場合に 実際に不具合があるような実装って おおいの?
300 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:39:43 ] 結論としては色々とややこしいから最初は配列なんか使わずにコンテナつかっとけってこと?
301 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:41:50 ] >>300 でも const char *bad_words[] = { "fxxk", "pxxsy", "axxl", "cxxt", ... }; みたいなのは配列が便利じゃね?
302 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:42:36 ] >>299 すくないとか言ったら使いそうだから言わない。
303 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:43:38 ] >>302 いや、実は見たこと無いから聞いてみたんだけど(ボソッ)
304 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:45:28 ] 見たことないけど、 将来デバッグモードで変なことするコンパイラが 出てくる可能性もなくはないと思う。
305 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:46:14 ] >>299 それは実装に不具合があるわけじゃねーぞ。
306 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:47:44 ] >>305 落ちるとかバグるとかそういう環境は多かったりするのか? という話なわけで。
307 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:48:13 ] >>305 いや勿論そういう意味じゃなくて、 メモリが解放されなかったり ヒープが壊れたり 無限ループに陥ったり ハードディスクが初期化されたり といった問題が生じるかどうか、という意味
308 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:51:56 ] >>301 new[]で確保するのでなければ別に構わないと思う。
309 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:56:57 ] >>307 そんな問題が生じたこともないし生じるようにも思わないが生じる可能性はある。
310 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:10:03 ] int a[] = new int[10]; 何が問題なの?
311 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:12:32 ] そもそもコンパイラ通らないだろ
312 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:12:34 ] >>310 コンパイルエラー
313 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:13:58 ] まずコンパイルしてからなんか家w
314 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:15:37 ] int a[] =(int[]) new int[10];
315 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:21:46 ] C、C++の基本的なことは勉強してきました。 それで簡単なGUIアプリから作ってみたいのですがVisual C++とDelphiで迷っています。 DelphiだとPascalを勉強しなければいけないそうですが大変でしょうか? C、C++が無駄になりそうで怖いですが。 C++を勉強してきた場合、Visual C++のほうがいいでしょうか?
316 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:21:52 ] コンパイルエラー
317 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:23:32 ] >>315 C/C++ 勉強したなら VC++ 使えば?
318 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:26:37 ] そしてうっかりCLRアプリケーションのプロジェクトを選択して C++/CLIを勉強する羽目に。
319 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:27:10 ] >>315 どれくらいのレベルか知らないが、勉強のためVC++をススメておく DelphiでもCやC++で勉強してきた基礎は無駄にならないと思うけどね
320 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:27:41 ] Delphi には将来性が・・・
321 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:29:13 ] int *a[] = new int[10];
322 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:29:48 ] int *a[|] = new int[00];
323 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:32:27 ] int **a = new int*[10] for( int i = 0; i < 10; ++i ) a[i] = new int; for( int i = 0; i < 10; ++i ) delete a[i]; delete [] a;
324 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:33:57 ] int (*a)[10] = new int[10][10]; delete[] a;
325 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:35:19 ] delete[] you;
326 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:40:56 ] Segmentation fault (core dumped)
327 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:52:25 ] std::vector<int> a(10);
328 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:53:19 ] std::vector<inpo> you(10);
329 名前:デフォルトの名無しさん [2007/07/01(日) 17:10:26 ] struct A { int x; };みたいなのをA a;と宣言してこれを std::cout << a;のようにした時にメンバであるxの値を出力するように変換関数を定義したいんですが どうすれば良いんでしょう? operator std::string();とやってみましたが変換できないようです
330 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:16:12 ] >>329 operator << (std::ostream&, A const&)
331 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:16:22 ] std::ostream& operator<<(std::ostream& os, A& a) { os << a.x; return a; } A内で上の関数をfriend宣言しておく
332 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:17:31 ] >>331 friend は要らんだろ
333 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:20:35 ] >>329 cout << static_cast<std::string>(a); とやるか、 std::ostream& operator<<(std::ostream& os, const A& a) { return os << a.x; } でも定義汁
334 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:28:57 ] 皆様の回答を参考にぐぐったら出てきました ttp://www.higlab.k.dendai.ac.jp/~numata/index.php?C%2B%2B%A5%E1%A5%E2#w5403b76 なるほどオーバーロードとfriendの複合技ですか、さらにostreamを戻す事で連結も可能と… かなり使えそうな方法ですね、助言ありがとうございました!
335 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:40:54 ] >>334 ここまで必要になるか分からないけど、 class A { public: virtual void print(std::ostream &os); }; std::ostream& operator<<(std::ostream& os, const A& a) { a.print(os); return os; } とやった方が、もしかしたらいいかもしれない。 こうすると継承クラスでprintを再定義できる。
336 名前:334 mailto:sage [2007/07/01(日) 18:02:45 ] >>335 なるほど継承ですか、実行時の多態性については意識し取りませんでした 確かにこの振る舞いをもたせたいのがAだけに限るわけではないですしね とりあえず参考にしてNVI使ってこうやってみました // 構造体A周辺の定義 struct Base { public: void print(std::ostream& os) const { _print(os); } private: virtual void _print(std::ostream& os) const =0; }; struct A : public Base { private: void _print (std::ostream& os) const { os << x; } public: int x; }; std::ostream& operator<<(std::ostream& os, const Base & base) { base.print(os); return os; } // 使用例 #include <iostream> int main() { A a; a.x = 1; std::cout << a; } …しかし鶏を捌くのに牛刀をなんとやらですね 実際に使うとなればここまでする必要も出てきそうな気もせんでも無いですが
337 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:27:37 ] この場合のNVIって何の意味があるの・・・?
338 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:29:47 ] 最近おぼえて使いたくなったんだろ。気にするな。
339 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:35:35 ] NVI ってなんですか?
340 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:40:11 ] >>339 ググレカス
341 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:49:35 ] NVI=non virtual interface のこと。つまり↓ struct Hoge { void hage(T1 arg1, T2 arg2) {_hage(arg1, arg2); } protected: virtual void _hage(T1 arg1, T2 arg2) = 0; }; 下位クラスには_hageを継承してもらう。 なぜこんなことをするのか) 公開仮想インターインターフェイスが果たす目的は以下の二つ(と言われてる^^) 1. 使う人に使い方(インターフェイス)を提供する 2. 派生クラスに「こういうふうにメソッドを継承して下さい」とカスタマイズの規約を提供している たとえば、NVIを使わず下位クラスがhageをそのまま継承してしまうと Hoge#_hageのインターフェイスを変更したときに下位クラスすべてのメソッドを書き直す必要があるんだけど、 もしNVIを採用していればそういうことにはならない。 逆にインターフェイスを変更せず、実装メソッドの方だけを変更することもできる。 >>336 の場合、インターフェイスが変更される可能性は全く無くて、無駄に複雑にしてるだけだと思う。
342 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:52:31 ] そもそも値型のクラスの継承はあまり宜しくない
343 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:54:58 ] 値型のクラス???
344 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:11:16 ] Value classの事 ・publicなデストラクタとコピーコンストラクタと代入演算子を持ち ・デストラクタを含め仮想関数を持たなくて ・具象クラスであり抽象クラスでない ・スタック上や他のクラスのメンバとしてインスタンス化される とまぁおおよそ組み込み型のように振舞えるものでこういうのは継承じゃなくて委譲を使うべきらしいけど、 実際のところはそれが妥当なのか場合によるからよくわかんねけど 俺は複雑な構造体を継承してえらい目にあったので「あまり宜しくない」と思うようになった ちなみに出展はmore effective C++あたりだったと思う
345 名前:341 mailto:sage [2007/07/01(日) 19:23:42 ] >>344 Value classなんて初めて知った。 全部が全部ってわけじゃないけど、ほとんどは>>344 のいうとおりだろうね。 ただ、サンプルプログラムでそういうことを考えちゃうと バーチャルなデストラクタや、privateなoperator =を書く必要が出てきて 全体的に焦点がぼやけてしまいまふ。 >>341 ではとりあえずそういうことは無視させてもらいますた^^
346 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:29:32 ] >>344 そんな区別意味無いだろ。 public なデストラクタが virtual じゃないクラスを継承したのが間違いだったんじゃないの? value class って用語も検索結果が日本語ページ多すぎで胡散臭いし。
347 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:00:20 ] 値のセマンティクスを持つクラスと言いたいのでは? ググったらこんなページを見付けたが、こういう話だろう。 www.ogis-ri.co.jp/otc/hiroba/technical/CppDesignNote/
348 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:09:43 ] つうかそういうクラスはそもそも継承を前提に作ってないだろ 他言語ならsealedクラスになってるタイプのクラス
349 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:29:11 ] で>>342 に戻ると 良いサンプルってやっぱ難しいんだね
350 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:33:35 ] 複雑なものを扱うためのテクニックを簡単なサンプルで見せても 無意味にしか見えんからのう
351 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:17:49 ] とりあえず、NVIならこの程度のサンプルでも十分通用するね
352 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:18:38 ] NVIってExceptional C++で勉強しましたか?
353 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:22:03 ] Exceptional C++―47のクイズ形式によるプログラム問題と解法 Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編 Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編 これって何が違うんでしたっけ?
354 名前:デフォルトの名無しさん [2007/07/02(月) 00:12:21 ] 4バイトint型 num = 10,000,000の16バイト表現を、 ビッグエンディアンで char型 d[10]のd[5]〜d[8]の各要素に格納したいと思っております。 numを表現する4バイトそれぞれの値を取得するためには どうすればいいのでしょうか? char *p = (char *)num; // numのポインタを取得 d[5] = p; // 1Byte分の値を取得 p++; // charのポインタなので1Byte分ポインタを変更 とやることを考えたのですが、pの値がおかしな値になります。 どのようにコーディングするとよいでしょうか?
355 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:14:59 ] char *p = (char*)# の間違いだと思うのだがどうよ
356 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:17:24 ] たびたび、すみません。 スレッドに複数の引数を渡したい者です。 //スレッド関数 void Thread_f(void* StructData){ //何にもしないスレッド StructDataは、下で出てくるData構造体 } メインのほうで、スレッド作成 Data data; //Dataっていう複数の引数を渡すための構造体 for(int i=0;i<n;i++){ data=datalist[i];//datalistは、Data構造体のポインタ配列 代入してから渡してます handle[i] =(HANDLE) _beginthread(CameraThread,0, (void *)&data); Sleep(3000); i++; //スレッド立ち上げてる間に、全部スレッド側で全部datalist[n]になってしまうので。 //ちょっとSleepしました。すごいダメな処理です。すみません。 } n=1のときは、エラーでないです。 nが2より大きいと、動くことは動きますが、×(ウィンドウの閉じるボタン) で閉じると、 -ElnvalidPointerクラスの例外を生成しました。 -'無効なポインタ操作' -プロセスは停止しています。・・・・ というエラーがでます。 ”同じポインタを 2 回破棄したり,すでに破棄したポインタを参照したりすると出る” とネットの掲示板でありました。 同じ関数のスレッドに、それぞれ違うdataを渡したいときは、スレッド関数に引数渡さないほうがいいですか? 248さんが言ってたのは、このことかなぁと思って、今は、引数渡さない方法でやってますが。 上記のプログラムに、手を加えてエラーで無い方法ないでしょうか。
357 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:21:55 ] あっ、CameraThreadは、ほんとの関数名でした。 Thread_fに、訂正お願いします。
358 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:23:23 ] >>356 だから、スタック上のオブジェクトのポインタをスレッド関数に渡すなと。 呼び出し側のコンテキストが平然と進行しつづけてスコープ抜けた瞬間に 無効になっちゃうだろが。 malloc()やnewでフリーストア上にオブジェクトを確保して、その ポインタを渡すんだな。無論渡されたスレッド側で不要になったら 破棄すること。 本当はC++使ってるんなら、スレッドをラップするクラスを作るのが良いが それはまあいい。
359 名前:354 [2007/07/02(月) 00:23:58 ] >355 ご指摘どおりです。 char *p = (char *)# // numのポインタを取得 d[5] = *p; // 1Byte分の値を取得 p++; // charのポインタなので1Byte分ポインタを変更 d[6] = *p; p++; ・・・ としているのですが、値が正常にとれません・・・
360 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:32:53 ] >>358 レスありがとうございます。 new演算子は、Dataをでしょうか? Data *datalist = new Data[N]; これで処理してます。
361 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:34:23 ] >>360 それなら、そのdetalistをそのまんま(void*にキャストして)渡せばいい
362 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:42:56 ] >>361 data=datalist[i]; これを、なくして handle[i] =(HANDLE) _beginthread(CameraThread,0, (void *)&datalist[i]); ということですよね。 これでも、同じ症状です。 dataにコピーしてから、渡すとエラーが消えるかも、 と思って入れたおまじないの処理なんです。
363 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:46:27 ] >>362 ちょっとまて 意味わかんなくなってきた スレッドをN個起動してて、i番目のスレッドにdatalist[i]を渡したいのか だがそれだと、datalist[]の破棄はどうする? いつどこで誰がやってるんだ?
364 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:48:21 ] 今日ここで俺がやる
365 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:55:11 ] メインの方で、スレッドの処理が終わるのを、待ってからです。 スレッドが終わるまで待ちます。 for (int i=n; i>0; i--){ while(WaitForMultipleObjects(n, (CONST HANDLE *)handle,TRUE, 500) == WAIT_TIMEOUT){//タイムアウトなのでループ} } delete data;
366 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:57:35 ] >>365 datalist じゃないのか? delete [] じゃないのか?
367 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:03:11 ] >>365 その i でまわしてる for ループは何のつもり? WaitForMultipleObjects() で全部待つんだろ? あと、戻り値はちゃんとチェックしろよ。 (CONST HANDLE *) とかいうキャストも要らんだろ? っていうか前のコードから要らないキャスト多すぎだ。
368 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:04:02 ] お手数かけてすみません。 delete datalist; です。
369 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:04:48 ] >>365 よくわからんが、メモリバリアを_beginthreadex()の前後あたりに 挿入すると状況が改善されるかも
370 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:05:24 ] >>368 それじゃダメだ。 delete [] 使え。理由は聞かずにちょっと前のログを見ろ。
371 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:27:44 ] while(WaitForMultipleObjects(n, (CONST HANDLE *)handle,TRUE, 500) == WAIT_TIMEOUT){} スレッドが終わったっていう合図以外は、ここでループしてます。 タイムアウト以外というコメント不正確でした。 forで、n回繰り返すと、n個のスレッドが終了するのを待ったことになります。 delete datalist []; deleteの使い方理解していないので、 ちょっと時間掛かるかもです。構文エラーとか出てきます。
372 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:29:11 ] 構わんよ、おつまみみたいでみんな喜んでるみたいだし
373 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:29:40 ] delete [] datalist; ああ、反対でした。 同じエラー出てきました。
374 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:36:17 ] >>371 > forで、n回繰り返すと、n個のスレッドが終了するのを待ったことになります。 WaitForMultipleObjects() の第3引数は BOOL fWaitAll で TRUE の時は その呼び出しで全部待つ。戻り値にはエラーもある。仕様をちゃんと見て使え。
375 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:43:53 ] delete [] datalist; コンパイル通りました。 -ElnvalidPointerクラスの例外を生成しました。 -'無効なポインタ操作' -プロセスは停止しています。・・・・ やっぱり、これが出てきてしまいます。。。 スレッド1個(n=1,N=1)にすると、大丈夫なんですよね。 あと、>>356 で、Sleepの次i++が入ってまずが 頭がおかしくなって、入力してしまったのかもしれません。 すみません。
376 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:47:27 ] 疲れてるなら休めば?スッキリしてないと頭の回転悪いよ
377 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:51:18 ] ぶっちゃけそのレベルで メダパニとラリホーかけられてちゃ どんな間違いやってても不思議じゃないな
378 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 02:02:34 ] >>374 ありがとうございます。 WaitForMultipleObjectsで、苦労したんですが なんか思い出だしてきました。 結局、スレッドの方では、なんにもしてないので、 newで渡すのがだめな気がしてきました。
379 名前:378 mailto:sage [2007/07/02(月) 02:14:02 ] 今日は、ちょっとギブアップします。 ありがとうございました。
380 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 09:25:30 ] >>315 間取ってC++Builder使えばいいんじゃね?
381 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 09:42:53 ] >>332 A内でfriend宣言しておかないとA.aのように参照した場合 もしaがprivateやprotectedだった場合エラーになる。
382 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 09:55:23 ] >>381 この場合はstructで全部publicだから要らんと言われてただけでしょ
383 名前:378 mailto:sage [2007/07/02(月) 10:18:40 ] 378です。 シンプルなプログラムを別に作って、 new演算子でも大丈夫なこと確認しました。 それで、本物の方のプログラムの方をGUIの部品とか 1個ずつはずしていって、シンプルなプログラムに近づけていったところ。。。 (6時間後・・・) void __fastcall TForm1::Button17Click(TObject *Sender) { //なにもしないボタンです。これから実装します。 } ボタン17を削除して、またボタン作ったら なぜか閉じるボタンで、ポインタエラーがでなくなりました。 ということで、new演算子で渡しても大丈夫みたいです。 ありがとうございました。
384 名前:デフォルトの名無しさん [2007/07/02(月) 13:07:16 ] VC7でswitch内で switch (val) { //コメント //コメント case 1: 〜〜 break; } こんな感じでcaseの上に複数コメントがあるブロックが多いと、 デバッグの時のブレークポイントや、実行時の位置が おかしくなることがあるみたいなんですが、どこかに詳細な 報告はありませんか? 検証が甘いですが、VC2005でも同じ現象が起こるみたいです。
385 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 14:12:08 ] int (*a)[] = new int[10];
386 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:39:39 ] 質問です。 Foo::Foo() : m1(), m2(), m3() {} このようなFooクラスのコンストラクタにおいてm2のコンストラクタが例外を投げたとき、 既に初期化が完了していたm1のデストラクタが呼ばれることは「C++の規格で保障」されているのでしょうか? VC++2005で確認した限りではその通りの動作をするようですが…
387 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:44:42 ] 保証されてる。 Foo::Foo() try : m1(), m2(), m3() { } catch(...) { } みたいにしてキャッチすることもできるけど、 例外は必ず再送出される。
388 名前:386 mailto:sage [2007/07/03(火) 17:51:16 ] >>387 ありがとうございます。 > Foo::Foo() try : m1(), m2(), m3() { } catch(...) { } そういえば function-try block なんて見たのは久々^^;
389 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:04:46 ] コンストラクタが失敗して例外を投げたときって、 中途半端にコンストラクトされた状態だと思うんだけど、 デストラクタは呼ばれないわけだよね? メモリリークの原因にならないのかな?
390 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:07:50 ] if(pMem){ delete pMem; } でおk
391 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:09:32 ] >>389 ちゃんと自分で例外をキャッチして開放してくだちぃ。 それが嫌なら vector とかスマートポインタとか使ってデストラクタに任せてくだちぃ。
392 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:12:42 ] >デストラクタは呼ばれないわけだよね? catchしたら呼べばいいじゃん。
393 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:12:52 ] >>390 deleteはNULL渡したら勝手に無視してくれなかったっけ?
394 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:13:12 ] してくれる。
395 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:13:59 ] 仕様上は無視することになってるが、 昔の VC++ あたりはしてくれなかった記憶がある。
396 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:20:11 ] そうだっけ? もしそうなら、そのときはその仕様がまだなかったんじゃないか
397 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:21:03 ] www.google.com/search?hl=ja&q=directx+if+delete+release&lr=lang_ja なんてググると、DirectXあたりで #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } こんなマクロが出てきたりするからてっきり勘違いしていた。
398 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:24:56 ] >>396 VC6 あたりまでそうだったと思う。 この仕様があるかどうか微妙な時代かもしれん。
399 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:20:22 ] SAFE_DELETEの利点は変数にぬるぽを代入してくれる点 解放後にアクセスしようとすると素直に落ちてくれる
400 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:28:18 ] ニートで暇だからプログラミングの練習でもするかとゲームを作り始めたのですが いきなり挫折しました。かれこれ4時間ほど睨めっこしてるのですが どこに間違いがあるのか検討つきません。ご教示お願いします。 環境はコンパイラはBoland C++ 5.5 + BolandDeveloper 1.221 WinアプリケーションでDXライブラリです。(多分環境は関係無いんでしょうが) メッセージはint型はchar *型に変換出来ないと出ます。 一部抜粋 FILE *fp; char *file_name="map1.txt",buf[99]; char* p; char* q; if((fp=fopen(file_name,"r"))==NULL)return-1; このぎょうです。→ while((fgets(buf,sizeof(buf),fp))!=EOF){ j=0; p=strtok(buf,","); map_data[i][j]=atoi(p); j++; while(p!=NULL){ p=strtok(NULL,","); if(p!=NULL){ map_data[i][j]=atoi(p); j++; } } i++; } fclose(fp);
401 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:32:58 ] とりあえず、fgetsはEOFなんか返さないってば。
402 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:39:19 ] >>401 ありがとうございます。 ・・・orz 混乱していたから別ファイルで作ったのを コピペ改変していました。 なんでこんなミスばっかりやらかすんだろな・・。俺は。
403 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:39:50 ] だからニートなんだろ
404 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:38:48 ] すみません。mallocって確保したメモリのポインタが返ってくるのですが、 このポインタって確保したメモリのどこを指しているのですか? このポインタ指しているところの規定ってあるのですか?あればどんな規定?
405 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:42:38 ] >>404 最初(0アドレス)を指してる。
406 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:47:07 ] 0アドレスって凄い誤解されそうな・・・。
407 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:49:05 ] char *p = malloc(size); とすれば、 p[0] 〜 p[size - 1] のメモリをアクセスできることが保証され、 p + size が無効なアドレスにならないことが保証されている。
408 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:27:47 ] 何となく思ったことなんですが、 char *s = "hoge"; は char s[] = "hoge"; と違って、中身を書き換えたりしたらダメなんですよね。じゃあ、最初から const char *s = "hoge"; としておいた方が、間違って書き換えちゃったりしたらコンパイル時にエラーになって、 深夜のデバッグ作業突入を防げるような気がするんですが、これはいい考えですか? それとも、気をつければいいだけですか?
409 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:30:13 BE:223773825-2BP(21)] >>408 とてもいい考えアル と、effective c++あたりに書いてあった希ガス
410 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:37:22 ] >>408 char *s = "hoge"; char s2[] = "hage"; s = s2; s[1] = 'i'; constをつけるとこれもできなくなる。やらないと思うけど。
411 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:43:50 ] const char* const s ="hoge"; にすれば s++ とかも防げるぜ! 以下修飾子の位置について終わりのない議論が始まります
412 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:45:27 ] >>408 少なくとも自分は条件反射的にconstつけてる
413 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:46:11 ] 結論出たので終了
414 名前:デフォルトの名無しさん [2007/07/04(水) 01:05:17 ] 今日wstring型ってのを知ったのですが、 wstring a[2]; a[0] = L"あああああ"; a[1] = L"いいいいい"; wcout << a[0] << endl; wcout << a[1] << endl; ってやっても何も出力されません。 なぜでしょうか?教えてください。 ググっても良い資料が見つからない、、、。
415 名前:デフォルトの名無しさん [2007/07/04(水) 01:06:39 ] >>414 です。 ”何も”ではなく空白行が2行出力されます。
416 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:07:36 ] wcout locale imbue でググるんだ!
417 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:23:30 ] string
418 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:25:59 ] 横レスだが、MacOSX GCC 4.0.1 だと locale に何渡しても runtime_error になるな。
419 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:53:39 ] Javaの静的初期化メソッドみたいなもの、C++にありましたっけ? たとえば、 class hoge { static int num[100]; //この配列を0-99まで初期化したい } hoge::int num[100]; といったとき、どう書くのが一番スマートですか? (num[100]={0, 1, 2...} とやるのはなしとして) コンストラクタ内で初期化しようとすると インスタンスを生成するたびに何度も同じ処理が 繰り返されることになるので無駄だし…… 初期化処理が既に終わっているかどうかを示す フラグを追加するとかでしょうか。
420 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:04:49 ] 今考えたけど、こういうゴリ押しができなくもないな。 friend しなくても通ったけど、これって規格的におkなの? #include <iostream> class hoge { private: static const int SIZE = 10; private: struct static_init { static_init() { for(int i = 0; i < SIZE; ++i) { num[i] = i; } } }; public: static void show() { for(int i = 0; i < SIZE; ++i) { std::cout << num[i] << std::endl; } } private: static int num[SIZE]; static static_init static_init_; }; int hoge::num[hoge::SIZE]; hoge::static_init hoge::static_init_; int main() { hoge::show(); }
421 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:17:42 ] この程度で充分じゃね? class hoge { static int num[100]; }; int hoge::num[100]; static int initialize() { for (....) { ... } } static int initializer = initialize(); ファイルスコープのstaticが嫌いならnamespace{}でも。
422 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:24:58 ] 関数を friend にする必要があるね。 個人的には戻り値 int が必要になるのが気持ち悪い。
423 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:36:10 ] >>421 うわー、その手がありましたか。 絶対忘れないように今すぐそれ使って何か書いてきます。 ありがとうございました。
424 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:56:23 ] class CStaticInt { public: CStaticInt(void) { for( int i = 0; i < 100; i++ ) a[i] = 0; } ~CStaticInt(void){} static CStaticInt* GetInst( void ) { static CStaticInt obj; return &obj; } int a[100]; }; こういうのもどう? んで、CStaticInt::GetInst()->a[0]でアクセスする マクロ化すれば使用に耐えられなくも無い…かもしれん('A`)
425 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:45:31 ] scanf("%s",str); if(strcmp(str," ")==0) printf("空白文字"); これで入力された文字が空白かどうか調べようとすると strcmpが0とならずprintfが実行されません。 これってどこがダメなのでしょうか?
426 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:47:49 ] >>425 入力が半角空白1文字じゃないんだろう。 else で puts(str) してみれば?
427 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:02:37 ] >>426 う〜ん、なんか動かしてみると scanfが空白文字を読み込んでないみたいな動作をするというか、 半角空白を入力すると入力が終了せず延々と入力を促すようになるのです。 だからif文の後もelse文も実行されない感じでしょうか。
428 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:11:21 ] %s は空白を飛ばすから当然そうなる。
429 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:16:38 ] >>428 そうなのですかorz では文字列を入力するという処理で空白文字が入力されたか というのを調べるには↓みたいにするしかないですか? fgets(str,N-1,stdin); if(str[0]==' ') printf("空白文字");
430 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:20:54 ] strstr()
431 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:42:00 ] >>429 どういう仕様にしたいのかが今ひとつ分からんから何とも言えんなあ。 " hoge " とか "hoge hoge hoge" とか入力された場合どうしたいのかな?
432 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:08:13 ] >>431 char str[N][N]; int i; for(i=0;i<MAX;i++){ printf("文字列入力:"); fgets(str[i],N-1,stdin); if(str[0]==' ') break; } こんな感じで空白文字が入力されたら入力を打ち切る仕様にしたいのです。 だから"hoge hoge hoge"の場合はそのまま文字列として格納です。 >>430 紛らわしいこと書いてすみません、仕様は上記のような感じでした。
433 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:10:00 ] if(str[i][0]==' ') break; でした。書き間違い。
434 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:12:14 ] >>432 " hoge " はどうなの?
435 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 15:15:03 ] >>434 それは考慮してなかった…。 コマンドラインでの入力が「半角スペース+Enter」の場合のみ 入力を打ち切るという仕様だと思います。
436 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 15:19:33 ] >>435 あと、" hoge " と入力された時、 最初と最後の空白をどうするのかという問題もある。
437 名前:デフォルトの名無しさん [2007/07/04(水) 17:09:55 ] TCHAR buf[100]; cin >> buf; ってすると UNICODE 版でコンパイルするとエラーになるのですが、 cin の TCHAR バージョンってないのでしょうか?
438 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:13:46 ] 自分で作るしかなかったと思う。 #ifdef UNICODE_ wistream& tcin = wcin; #else istream& tcin = cin; #endif
439 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:37:17 ] >>404 から >>407 さんへ、有難うございました。 すいません >>407 の >p + size が無効なアドレスにならないことが保証されている。 これ意味の解らないのですが、p + sizeのアドレスって、 確保されたメモリの次アドレス(確保外)が無効なアドレスにならないてことですよね。 なぜ、確保外の次のアドレスを無効なアドレスにならないことを保証しなければならないのですか?
440 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:46:51 ] ポインタ変数でループする際の終端として使えるようにするため。
441 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:48:26 ] >>439 の訂正 誤:これ意味の解らないのですが、 正:これの理由が解らないのですが、
442 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:55:36 ] >>440 有難うございました。 つまり、これに使うためにってことですね。 for( char* ptr = p; p != ptr; ptr++){} >>407 さんと >>440 さんのおかげで少し賢くこうなりました、ぺこり
443 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:15:40 ] それだといきなりループが終わるw C++ やってりゃ分かると思うけど、 algorithm でやってるあーいう処理ね。
444 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:59:34 ] あいやー、いきなりループが終わるんですか、ガクブル、どうすれば良いんですか
445 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:01:14 ] こんな感じ #include <stdio.h> #include <stdlib.h> void fill(int *begin, int *end, int first, int step) { int *p; int n = first; for(p = begin; p != end; p++, n += step) { *p = n; } } int sum(int *begin, int *end) { int *p; int n = 0; for(p = begin; p != end; p++) { n += *p; } return n; } #define SIZE 5 int main() { int *p = malloc(sizeof (int) * SIZE); if(p == NULL) { return EXIT_FAILURE; } fill(p, p + SIZE, 0, 1); printf("%d\n", sum(p, p + SIZE)); free(p); }
446 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:05:50 ] c++で全角と半角を格納している配列から一文字ずつ読んで 標準出力させたいんですが、全角の1文字目と半角を区別することができません。 string str = "あイウ()"; for (int i = 0;i<=100;i++) { printf("%c",str[i]); } こうすると半角は正しく出力されますが、半角が出ません。 どうしたらいいですか?
447 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:12:41 ] >>446 色々方法はある。 _mbclenを使うとか、wstringやUNICODEにするとか。
448 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:26:22 ] > 半角は正しく出力されますが、半角が出ません どっちなんだよ?
449 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:32:50 ] >>445 有難うございます、あす、これとmallocの知識を引っさげて学校で自慢してきます
450 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:33:27 ] >>449 他にこのスレ見てるやつもいるかもなw
451 名前:445 mailto:sage [2007/07/04(水) 21:34:47 ] >>447 なるほど。書いてもらったやつで調べてみたら できそうですね。ありがとうございます。 あと少し教えてください。 「_mbclen」のアンダーバーは何を意味しているんですか? それとアンマネージドというのは.NETの機能を 使わなければいいんですよね? MFC、ATL、SDK、WINDOWS APIとかその辺の区別が全く理解できなくて・・・。
452 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:35:45 ] >>448 すいません。「全角が出ません」の間違いです。
453 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:44:47 ] >>451 処理系オリジナルのものと言う証。 下線で始まる名前は、処理系のために予約されている。
454 名前:デフォルトの名無しさん [2007/07/04(水) 21:59:18 ] C++初心者です。型変換のことで教えてください。 main(){ int iv; iv=int(3.14); } この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子? また、 class T { int miv; public: T(int iv=0):miv(iv){} }; main(){ T oa; oa=T(2); } このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない? さらに、main()を次のように書き換えると、 main(){ T oa; oa=static_cast<T>(2); } このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。 じゃあ、T(2)もやはりキャストなのでしょうか?コンストラクタの呼び出しとは言わない? ネットやいろんな本を見ても、このあたり、はっきり書いてないのです。
455 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:00:47 ] >>453 わかりました。ありがとうございました。
456 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:06:07 ] >>454 >この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子? int のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。 >このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない? T のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。 >このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。 多分同じ。
457 名前:454 mailto:sage [2007/07/04(水) 22:20:46 ] >>456 さん、早速ありがとうございます。 intのようなC言語からある型の場合も、コンストラクタ、オブジェクトという概念で 考えるのですかぁ。C++では、intなどの型もクラスのような感じ? C++本やネットでは、int()は(C風の)キャストだという記述が多いですが、 「コンストラクタ呼び出しによるテンポラリオブジェクトの作成」は、 別な言い方をすれば「キャスト」と同じこと、という理解で良いのでしょうか? static_cast<T>(2)はT(2)と規格上同じだし、(T)2、と書くことも出来るから考えると。
458 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:23:22 ] キャストは引数を複数取れないから基本的には別のもの。 引数が 1 つの場合は同じようになるだけで。
459 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:27:09 ] 規格票の 5.2.3 明示的型変換(関数的記法) によれば、 この記法とキャストは同等だと書いてありますね。
460 名前:454 mailto:sage [2007/07/04(水) 22:40:00 ] 型がクラスの場合は、 引数1つだとキャストと同じ表記だけどキャストとは別もののコンストラクタ呼び出し、 というのは、納得です。 じゃあ、例えばintの場合、Cでは「 (int)3.14」はキャストですよね? C++では、「(int)3.14」はコンストラクタ呼び出しであって、キャストではないということ? それとも、「(int)3.14」はキャストだけど「int(3.14)」はコンストラクタ呼び出し? と、ここで>>459 さんもコメントどうもです。 とすると、意味合いとしてはキャストと、このコンストラクタ呼び出しは同じってこと? それとも、記法としては同じであって、でも意味合いとしては別もの、ということ?
461 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:46:33 ] 同じものの違う表記法というだけみたいですね。
462 名前:デフォルトの名無しさん [2007/07/04(水) 22:47:33 ] >>408 char *s = "hoge"; は、書き換えたりしない(書き換えられないとは違う)。 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、 コンパイラに特別指定しない限り同じ領域を指すポインタである。 深夜までデバッグしたくなければ書き換えるのはやめれ。 従って、("hoge"[2] == 'g') は、真になる。参照する方はやりたい放題。 関数内での char s[] = "hoge"; はありえないと思うのだが、検証した? char s[]というのはポインタではなく、要素数を省略した配列なので、 まず、要素数が決まる `= { ... }' という構文が必要。 そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。 例えば、static char s[] = { 'h', 'o', 'g', 'e', '\0' }; これなら別の値に自由に変更可。 例外として、引数がある void hogege(char hoge[]); これは void hogege(char *hoge); と全く同義なので自由に書き換えられる。 もちろん、呼び出し元の関数と調和をはかるように。
463 名前:454 mailto:sage [2007/07/04(水) 22:51:48 ] 昨日、本屋で「C++の設計と進化」を立ち読みしたです。 索引で見つけた「コンストラクタの表記」を引いてみると、 クラス型名(式)の表記によってコンストラクタを式中でも使えるようになった、 というようなことが書いてあり、さらには、この表記は、 キャストの表記と同じだ、とも書いてありました。 でも、コンストラクタの表記とキャストは同一だという説明はなく、 このあたりは、はっきりとは書かれていなかったです。 C++の本は、新しい4つのキャスト演算子については必ず説明がありますが、 オブジェクトの初期化とコピーコンストラクター以外の コンストラクタの呼び出し(とテンポラリオブジェクトの作成)については、 ほとんど説明がないですねぇ。。
464 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:57:01 ] 正確な情報を知りたければ規格票を見るのが一番ですよ。 www.jisc.go.jp/app/JPS/JPSO0020.html C++ の規格番号は X3014 です。
465 名前:454 mailto:sage [2007/07/04(水) 23:00:56 ] >>464 はい、逝ってきます・・・
466 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:17:00 ] >>460 459ではあれだけで終わっているが、 実際のところ、5.2.3には続きがあって、括弧の中の式の並びが複数ある場合、 コンストラクタを呼び出して一時オブジェクトを作ると規定されている。 歴史的には、コンストラクタを呼んでクラスの一時オブジェクトを作る構文として 導入されたのが最初で、後にそれを一般化して全ての型に対して使えるようになった。 (C++の設計と進化に書いてあるとおり) その際、組込型では型変換演算子と同じ効力を持たせたという次第。 また、1つしか引数を取らないコンストラクタは、そのクラス型への型変換を提供する。 だから454でのstatic_cast<T>(2)は結局コンストラクタ呼出として機能する。 (あと型変換演算子の話もしたいが省略) C++は、型変換を即ち新しいオブジェクトが作り出されることと捉えているように思われる。 すると、コンストラクタ呼出と型変換の境界が非常に曖昧になっているも納得がいく。
467 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:24:01 ] (int*)p はできるけど int*(p) はできないってところとか、 本当に細かい文法的な違いはあるね。
468 名前:454 mailto:sage [2007/07/04(水) 23:34:42 ] >>466 ちょっと判ったような気になりました。ありがとう。 ついでにもう一つ。これから変換関数、変換演算子を勉強しようとしているところですが、 この2つ、同じものですよね?呼び方が違うだけで。 >>467 そーですね。単一名称(単純名称)でないとだめ、という説明はよく見ます。 typedefすれば大丈夫、ともよく書いてある。
469 名前:454 mailto:sage [2007/07/04(水) 23:49:26 ] いま、JIS3014を検索してみました。 「変換関数」はたくさん出てきます。 「変換演算子」というのは該当無しで、 「型変換演算子」は、dynamic_cast, static_cast, reinterpret_cast, const_cast のことを指すのですね。 ネットでググると、変換関数の意味で「変換演算子」を使っているページが たくさんヒットするんですが、これらはみんな間違ってるのかな。 というか、JIS3014、おもしろい。絶対的な信頼があるから、 間違いを疑う必要もないしね。
470 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:18:30 ] 間違いはないけど、コンパイラが対応してないこともw export とかほとんど対応してないし。
471 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:35:03 ] >>462 初心者騙して楽しいか? > 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、 > コンパイラに特別指定しない限り同じ領域を指すポインタである。 そんなことは決まってない。 > そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。 自動変数でも配列要素数の省略は使える。
472 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 04:58:00 ] 質問です。 Microsoft Visual C++ 2005 Express Editionにおいて、 C++のアプリケーションを作っています。 コンパイル後の.exeファイルのプロパティで バージョン情報や会社名などが表示されるタブが出ません。 ソリューションエクスプローラ中にはAssemblyInfo.cppという、 AssemblyTitleAttributeなどが配置されたファイルが自動生成されています。 しかし、反映されません。(検索などではC#で作成され、csの場合のみ反映されるらしい) 対処法か代替案を持っていらっしゃる方はおりませんか?
473 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 05:13:07 ] >>472 こっちで聞いた方がいいと思う Visual Studio 2005スレ Part21 pc11.2ch.net/test/read.cgi/tech/1180692040/
474 名前:デフォルトの名無しさん [2007/07/05(木) 09:03:52 ] 実行環境はWindows環境、開発環境はVS6.0です。 メールを送りたいのですが一般的な既存ライブラリは存在しているのでしょうか? イメージしているのはWinsockに依存したライブラリですが 普通はそのままSMTPを喋るものなのでしょうか? 受信は必要なく、OB25Pも問題ありません。
475 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:38:14 ] Windowsで一般的といえばMAPIだろうな 俺は使いたくないけどw
476 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:42:20 ] basp21.dll
477 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 10:46:02 ] >>476 そういえばそんなのもあったね。
478 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:05:27 ] ttp://www.hi-ho.ne.jp/babaq/basp21.html 2007年6月29日更新 タイムリーすぎてワロス まさか自演じゃないだろうな
479 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:31:25 ] Windowsで簡単に見た目もいけてるGUIを作るにはどんな方法があるでしょうか? ちなみに過去にチャレンジしたこと ・C++/CLR コントロールは豊富だが、OfficeとかVSにあるようなフローティングメニューが見つからないので中断 日本語の資料が少なくて困る 既存のリソース(DLLなど)と組み合わせるときに DLLのほうの仕様を変えないとうまく動かないor非常にめんどくさいの2択になる あと変な拡張構文がキモい ・MFC デフォルトのコントロール数が貧弱だが、資料も多いし、 Win32APIをラッピングしてある程度のものが多くわかりやすい。 VS2005で作成するとManifestでうんぬんとうざいのでスタティックリンクできないプロジェクトだとだるい。 ・C++Builder GUIのデザインをするには最強だと思うが、本体が生きてるのか死んでるのかよくわからんのと 重い、謎のバグがいつまでも取れない、というのがネック。 未だに6を使ってる人が多い。 VCと一緒に入れるとデバッガが正常に動かない可能性がある? ・WTL 何がいいのかさっぱり
480 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:40:11 ] CEGUI
481 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:56:50 ] >>479 SWINGとかAWT継承すれば? C++じゃなくなるけど
482 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:21:14 ] SwingとかAWTをJNI通してC++から使うっていう意味?
483 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:22:06 ] SQING や AWT がイケてるとは思えないけどw
484 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:36:44 ] ロジック部分を C++ で書いて ユーザインターフェイスは C# で書く。 C# からアンマネージドなDLL呼び出せるし。 だめ?
485 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:43:30 ] FrameworkもJREも無しですませたい
486 名前:デフォルトの名無しさん [2007/07/05(木) 12:52:35 ] すみません stringのfindは、またはの検索できませんか たとえば"あい"または"大塚"または"愛" とかです
487 名前:デフォルトの名無しさん [2007/07/05(木) 12:53:34 ] str.find("あい"|"大塚"|"愛") でいいんでしょうか
488 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:56:49 ] なんで試さないの?
489 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:58:48 ] >>486-487 str.find("あい") != string::npos || str.find("大塚") != string::npos || str.find("愛") != string::npos 正規表現ライブラリを使ったほうがいいかもね。
490 名前:デフォルトの名無しさん [2007/07/05(木) 13:01:18 ] >>499 ヒットする、またはヒットする、ってやるんですね サンクス わかりました
491 名前:デフォルトの名無しさん [2007/07/05(木) 13:02:37 ] でも、番号がわからないような気が・・正規表現ライブラリを調べてみます!
492 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 13:07:19 ] 場所が欲しかったら代入してやればいい if ((pos = str.find("あい")) != string::npos || (pos = str.find("大塚")) != string::npos || (pos = str.find("愛")) != string::npos) { // みつかった } else { // みつからへん }
493 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 14:22:14 ] ライセンスキーを入力->立ち上がる これをやりたんです。 ・キーの発行は手作業で。 ・アプリ側ですること、ライセンスキーを認証するdllを作成。 こんなこと想像してます。解説しているページや 簡単に実現できるツールなどありませんか。
494 名前:472 mailto:sage [2007/07/05(木) 15:53:44 ] >>473 誘導感謝。そっちへ行ってみます。
495 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:58:22 ] >> 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、 >> コンパイラに特別指定しない限り同じ領域を指すポインタである。 > >そんなことは決まってない。 そうでない処理系を挙げてくれ。 > >> そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。 > >自動変数でも配列要素数の省略は使える。 どんな例か試しに書いてくれ。
496 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:04:06 ] VCとか。 C89(ANSI-C)以前の人は、自動変数で int hoge[]={1,2,3};式の初期化が出来ないとか言い張ることあるよね。
497 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:08:04 ] >>495 Visual C++では、コンパイラオプション/GFを指定しないと 同一文字列リテラルが同じ領域を共有するようにならない。 (なお/O1や/O2などの最適化オプションを指定すると暗黙の内に/GFも指定されたことになる) ローカル変数での配列でもchar s[] = "hoge";や char s[] = {'h', 'o', 'g', 'e', '\0'};のように書くことは可能。 このように静的変数や大域変数と同じ構文。 少なくともANSI/ISO Cではできることになっているし、 PC用のコンパイラなら今時できないものを見つけるほうが難しい。
498 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:12:14 ] >>495 ===== 同じ文字列リテラルが違う領域を指す例 ===== gcc -c b.c gcc a.c b.o /*----- a.c -----*/ #include<stdio.h> char *p_hello(void); int main(void){ printf("%s %s\n", "hello", p_hello()); printf("%p %p\n", "hello", p_hello()); return 0; } /*----- b.c -----*/ char *p_hello(void){ return "hello"; } ----- 実行結果 ----- hello hello 00403000 00403020 ===== 自動変数で配列要素数の省略 ===== #include<stdio.h> int main(void){ int i, data[]={0,1,2,3,4,5,6,7,8,9}; for(i=0;i<sizeof(data)/sizeof(data[0]);i++) printf("%d\n", data[i]); return 0; }
499 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:22:06 ] >>495 わざわざ無知を晒しに出てこなくてもよかったのにね。
500 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:28:25 ] まあ聞くは一時の恥、聞かぬは一生の恥と言うし、 495はいい勉強になったということでいいじゃないか。
501 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:38:17 ] >>493 至極簡単だと思うけど…
502 名前:474 mailto:sage [2007/07/06(金) 01:01:18 ] 皆様回答ありがとうございます。 BASP21はタイムリーですね。自演ではないです。 調べてみたところSMTP-AUTHに対応してなさそうな感じでしたので MAPIをもう少し調べてみようと思います。 ありがとうございました。
503 名前:493 mailto:sage [2007/07/06(金) 02:01:09 ] >>501 1.大量のライセンスキーのデータベースが入っていて、マッチング。 2.それとも、秘密の値を一つだけ持っていて、 数学的になにか計算して、(ハッシュなど)マッチング。 一番目ってキーの数が多かったら、大変ですよね。ぬー。 ということは、数学のなにかを使って、やるんでしょうか? たとえば、ウィンドウズだと、どんな感じでしょうか。
504 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:25:49 ] ライセンスキーをソートした状態で持っておけば、2分検索が使えるよ。
505 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:45:47 ] だいたいはアルゴリズムで、 ブラックリストデータベースも利用、かなー。 MSのは、公開鍵認証とハッシュがどーの、という話があったけどねー
506 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 06:36:31 ] オンライン認証じゃないのか
507 名前:493 mailto:sage [2007/07/06(金) 10:40:35 ] >>504-505 たくさんの大量のライセンスキーを 用意して、ただマッチングがわかりやすいです。 オンライン認証もいいですね。 >MSのは、公開鍵認証とハッシュがどーの、という話があったけどねー ハッシュ、公開鍵、秘密鍵、独自の計算方法、を使うんですか。 難しそうなので、うまいアルゴリズムは、徐々に考えていこうと思います。 興味があったので、勉強のために質問させていただきました。 ありがとうございました。
508 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 11:17:24 ] MSの場合はデータベースを使ってるに決まってるだろ。
509 名前:495 [2007/07/06(金) 21:41:30 ] 検証してANSI-Cでは動的配列等の初期化ができると分かって来て見たら非難誹謗の嵐だ。 わざわざお礼を言おうと思ったが、そんな非礼な人間に感謝の気持ちなどなくなった。 そうだよ。俺はANSI-C以前からC使いだった。 C++を黎明期から覚えて使い始めてからは、string系クラスが活躍してくれて 外的・静的配列以外に初期化子を使う必要もなかったからな。 君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。
510 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:46:42 ] どんな理由があろうが捨て台詞は格好悪いから辞めた方がいいって
511 名前:495 mailto:sage [2007/07/06(金) 21:50:05 ] ああ、ちなみに俺は『夜中までデバッグしたくなかったら』という前提で 文字列リテラルは同じポインタを参照するって意味で書いたんだぜ。 その辺は文脈嫁。 それから、C/C++の教本を読んでる暇があったら職を探せよ(w
512 名前:495 [2007/07/06(金) 21:53:19 ] 漢字もろくに書けないゆとりに説教されるとはな。 辞める→止める、やめる 適当にアラスカ。
513 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:56:33 ] なんだこのオッサン 年甲斐もなく2chで火病かよ 一生やってろ
514 名前:デフォルトの名無しさん [2007/07/06(金) 21:58:22 ] 俺をあげつらったやつら、特に学生よ、昔のコードには int a[100] = { 0 }; なんて構文はなかったんだぜ。 就職先のコンパイラが古かったら、解けないバグに悩まされろよ。
515 名前:495 [2007/07/06(金) 21:59:34 ] >>513 そのつもりだぜ?
516 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:00:17 ] 日々のストレスで頭がおかしくなったんだよ。 そっとしといてやれ。
517 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:01:08 ] >>514 古いコンパイラでその構文が通らなければエラーになるだけなので 解けないバグも糞も無いんだが……
518 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:01:08 ] そんなに悔しかったのか
519 名前:495 [2007/07/06(金) 22:03:08 ] そっとしてくれないのはまさに君じゃあないか >>516 火病だろうがなんだろうが、アラシがいると皆楽しそうだなあ。ふふっ 期待してるんじゃないのか?
520 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:03:32 ] こりゃC99の話とかしたらおもしろそうだな
521 名前:495 [2007/07/06(金) 22:07:05 ] >>518 そうだな。例えば君が車の免許を取ったとする。 10年後に、君の知らない新しい規則で捕まったとしよう。 それは悔しくないか? 100歩譲って仕方ないとしても、 見ず知らずの人間から「そんなことも知らんバカがいる」 と言われて悔しくない奴がいるかい?
522 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:08:15 ] 技術者なら仕様の更新くらい把握しとけよ
523 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:10:18 ] この業界の人間ならまず己を恥じるけどな アンテナ張らなくなったら終わりだぞ
524 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:11:59 ] 昔から半導体のプロセス技術で仕事をしていて、 年々プロセスが細くなってきて、昔は気にもしなかったような トンネル効果やらリーク電流やらに悩まされるような感じか
525 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:12:53 ] >>521 つーか技術者なら、まず自分の無知を恥じろよ。 で、どういうカタチであれ知識を教えてもらったことを有難いと思えよ。 ま、アンタの場合、恥じるべきは自分の無知よりむしろ 年甲斐も無いDQNさだろうな。 もっぺん自分のレス読みかえせよ。 >>495 は人にものを尋ねる態度か? 簡単に自分に確かめられることなのに、自分で確かめようともせずに まるでケンカ越しで偉そうに聞いてたよな。 一体何様のつもりなんだか。
526 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:16:09 ] >>521 悔しいのはわかるが、それをばねに勉強するなど その気持ちをほかの方向へ向ける手もあるだろうに。
527 名前:495 [2007/07/06(金) 22:17:10 ] >>520 complex型とか色々増えたんだろ。 確か、enumも面倒くさい仕様になったんだよな。 全く知らないわけじゃないが、不要な機能も多そうだ。 C言語仕様で遊んでる奴らは、もっと基本に返って欲しいぜ。
528 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:19:12 ] 自分が最近の仕様に疎いという自己認識があるんなら 最初から>>462 みたいに偉そうに書かなきゃいいのに 初心者相手と思ってやったんならなおタチ悪いぞ
529 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:19:51 ] enum で何か大きく変わったっけ? 最後にコンマつけても良くなった程度じゃない?
530 名前:495 [2007/07/06(金) 22:25:49 ] ほら、説教オタが集まってきた。 これだから嵐はやめられん。 >>523 お前は常にアンテナを張っているといえるのか? >>524 それは『道具を作る』側の悩みだろ。現場だから悩みは直ぐ分かるぜ。 俺は言語を作ってるわけじゃない『道具を使ってる』側だから、勝手に変えられるのもこまるんだぜ。 >>525 そうさ、お礼をするつもりだったのさ。 その後は前に書いたとおりだ。二度も言わせるな。 人にモノを尋ねる態度じゃないと思ったら 答えなきゃいいじゃないか。それか無視すればいいんじゃね? 君の知識で答えられるとは思えないがな。実は今日初めて知った仕様じゃないのかい(w >>526 そのつもり。
531 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:26:54 ] 無視すればいいんじゃね? どうみても過剰反応の荒しなんだが。
532 名前:495 [2007/07/06(金) 22:28:11 ] >>529 ほーら。こう言う人もいる。 分かる奴はenum談義でもしてやれよ。ほら。さあさあ。
533 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:30:16 ] いまどきノーヘルで捕まって悔しがる馬鹿っているのか? そのレベルだろ
534 名前:495 [2007/07/06(金) 22:31:35 ] >>531 過剰反応じゃなきゃ嵐とは言えネー。 そして君は無視してなーい(藁)
535 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:32:37 ] >>534 漏れは楽しんでるからどんどん過剰反応してくれ
536 名前:495 [2007/07/06(金) 22:34:16 ] >>533 これだけ例えが分からん奴も珍しい。 心から軽蔑してやるぜ。
537 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:35:55 ] 何を今更、ってたとえ話だろ。
538 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:38:21 ] 文字通りの老害だね。 釣りじゃなければ
539 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:40:12 ] >>537 原付に乗っていきがっている中学生と似たようなもんだ、ということかと思った。
540 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:44:37 ] 免許持ってるおっさんだと仮定して話してしまった よく読んだら免許持ってるともおっさんだとも言ってないな 今は反省してる。
541 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:45:14 ] >521 なるほど。プログラマも更新必須の免許制に白って話だな。 んで、更新場で5000円はらって、「今度のC++09では〜こういう変更が〜」 みたいな話をありがたくちょうだいしろ、と。
542 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:50:41 ] >>521 法律は法律だろ…。 知らなかったなんて言い訳が通用するはずもない。 悔しいとか関係ないし。 自分で例えにもなってない例えを出しておいて、 よく他人に「例えが分からん」とか言えたものだな。
543 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:53:16 ] つーかC99ならまだしもC89なんて何年前の話だ
544 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:58:16 ] こいつの下についてる奴は哀れだな 普段から嬉々として間違ったことばかり言ってるが 「××さんそこはこうですよ」とか突っ込むと 逆切れして仕事にならんから適当な按配に放置されてると見た
545 名前:523 mailto:sage [2007/07/06(金) 23:00:35 ] >>530 当然だろ。おまえは違うみたいだけど
546 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:07:24 ] ってか、未来のコンパイラで使える技術と、 今の多くのコンパイラで使える技術ってちょっと違わないか? >>495 の内容は、コンパイルして確認できる程度のものだろ。
547 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:23:29 ] >検証してANSI-Cでは動的配列等の初期化ができると分かって来て見たら非難誹謗の嵐だ。 規格に当たれば済むことを、いい加減な検証で分かった気になるとは。 >わざわざお礼を言おうと思ったが、そんな非礼な人間に感謝の気持ちなどなくなった。 例を言うのに「わざわざ」なんて副詞をつけるくらいなら最初から言わない方がましだ。 >そうだよ。俺はANSI-C以前からC使いだった。 別に珍しくもないが、普通は今時のコンパイラに触れているうちに理解するもんだ。 >C++を黎明期から覚えて使い始めてからは、string系クラスが活躍してくれて string系? std::stringに類似品があったっけ? std::basic_stringのことか? >外的・静的配列以外に初期化子を使う必要もなかったからな。 無知蒙昧極まれり。 >君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。 憂き目? まさか。温故知新と言う言葉はご存じないかな?
548 名前:495 [2007/07/06(金) 23:33:34 ] >>538 文字通りの老害だね。 そういう君の方が年上で無知だったりして。 2chで無意味なことを言う奴だ。 >>541 何言ってんの?免許制?そりゃあいい。 仕事だけじゃなく、きちんと新しい仕様を勉強する公な時間がとれるぜ。 君らも仕事するようになったら、アンテナ張るのが限界になることが分かるぜ、学生、失業者。 >>542 お前にゃ『例え』という概念も理解し難いらしい。 この例えが不適切だったと思う奴はちょっとレスしてみろ。 >>543 新しい仕様は受け入れるよ。そろそろ新しいC言語の教本を読む頃だ。 だが、K&R C言語の第2版でさえ、やはり自動変数の初期化子は 目の上のたんこぶ扱いだったようだ。 ゆとり世代がループ内で自動(配列)変数の初期化子なんか使われたら困るぜ。 >>544 安心しろ。会社ははけ口にならんからここに毒を吐いてるんだ。
549 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:36:40 ] アンテナ張るのも辛い職場ってどんだけブラックなんですか
550 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:40:36 ] 技術者として新技術の吸収が無理だと分かったら、そいつはもうそこまでだぜ このおっさんは汎用機と心中するしかないCOBOLerと一緒だな 周囲はゆとりと学生だけなんだ、自分は悪くないんだ、仕事やってりゃ皆こうなんだ、 と思い込もうとしてるんだね 実に哀れだね
551 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:43:48 ] >>548 (´・ω・`)⊃旦 < 毎日お疲れ様です、お茶ドウゾ。
552 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:49:41 ] 自分で試さずに「試しに書いてくれ」ってまるでゆとり世代のようだな
553 名前:495 [2007/07/06(金) 23:51:42 ] >>545 君は自分の無知を自覚しようとしない奴だ。 ソクラテスはそういう事を何と言ったか知ってるか? >>546 今日コンパイルしたのさ。 >>547 仕事中に新しい機能を覚える時間とそれを検証する時間をくれるなら進んでやるぜ。 社長は君かい(笑) >string系? std::stringに類似品があったっけ? std::basic_stringのことか? 世の中にはSTLしかないと思っている奴を発見した。 しかも、wstringすら知らない奴もいたもんだ。 それから温故知新の使い方が逆だ。 君の使い方は『古いことを知り、かつ新しい事を知るべきだ』という意味にしかとれないが、 本当の意味は 『新しいことを知るには、古いことを知っておく事も重要だ』という意味。 やれやれ。ゆとり君=>>547 。
554 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:55:42 ] >>553 が憂き目の意味を理解してるかどうかが気になる
555 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:57:12 ] どんどん香ばしくなっていくな
556 名前:495 [2007/07/07(土) 00:03:14 ] >>550 そういうなよ、ゆとり。 それより、採用試験に向けて、人と目を合わせて話す練習をした方がいいよ。 >>551 サンキュー >>552 そのときは思いもよらなかったからさ。 今日は仕事が一区切りつけたから検証できたんだ。 >>554 つらい体験 >>555 そう言うなよゾロ目 全員が無視されたら嵐は自然といなくなるんだぜ?
557 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:05:03 ] すごく・・・不毛です・・・
558 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:09:45 ] >>556 憂き目って、単につらいだけじゃなくて悲しいといったニュアンスも入るんだけど理解してる? それでいて使い方が逆とか言ってる?
559 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:14:54 ] 憂うっていうのは残念
560 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:20:56 ] まだやってんのか? 勉強の時間が取れないって割には暇なんだな。
561 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:20:58 ] いつから三つの数字をぞろ目と言うようになったのだろう……
562 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:21:58 ] >>553 > 仕事中に新しい機能を覚える時間とそれを検証する時間をくれるなら進んでやるぜ こういう人多いんだよねぇ ・プライベートで自己啓発しようという考えが無い ・新しいことにチャレンジして新しい技術を仕事と共に身につけようという考えも無い ・自分に時間的余裕が無いのは上が悪いせいだ ま、どうぞ勝手に腐ってくださいとしか
563 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:23:33 ] 土曜日だからってはしゃぎすぎだろ。 そろそろ寝ろよおっさん。
564 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:24:07 ] >>561 それはふつうに言うんでないか? ちんちろりんとかサイコロ3つ使うけど
565 名前:495 mailto:sage [2007/07/07(土) 00:28:19 ] >君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。 >>558 よし答えてやろう。 憂き目がつらい体験というのはおおよそ間違ってないのではないかな。 それとも、『つらく悲しい経験』(goo辞書から抜粋)とでも答えてほしかったのかな? そして、学生や就職浪人なんぞの世代が古いコードをメンテしたとき、 コンパイラは当時の同じバージョンの処理系で コンパイルするのが常套ではないか? もちろん、新しいコンパイラを使っても構わないが、動くように直すより、当時の規格に沿って メンテした方が遥かに楽な場合が多いだろう。 そして、私の憎む君らが、知るべくもない仕様に基づいたバグにはまり、 (悲しく)つらい体験をするのを祈っているのだよ。 何か変?
566 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:31:11 ] ANSI以前のCで自動変数の配列を直接初期化できないのはまだ有名なほうだと思う。
567 名前:495 mailto:sage [2007/07/07(土) 00:34:10 ] >>560 眠いと勉強ははかどらないが、悪口ならいくらでもでてくるからなあ。 >>562 おやおや。私がまるで何も勉強してないとでも。 はい。腐るときは勝手に腐るのでいちいち構わなくてもいいですよ。 自称自己啓発君。>>562 君がせめて鬱で自殺しませんように(爆 >>563 さっき言っただろう。 嵐の敵はみんなの無視。 眠くなったら寝るから気にするな。
568 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:35:46 ] >>566 んだな。 つうかそれ、もし対応して無いコンパイラを使ったら、コンパイル通らないだけ じゃん。で、エラーメッセージが出力される。 全然困らんぞ。 ほんとうに昔のソースでは、確信犯的にリテラルを書き換えていることがあるが、 そっちのがまだ困るだろね。 ま、それに気づけば、コード書き換えるなり-fwritable-stringsを指定するなり すればいいわけだが。
569 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:38:05 ] >>565 「メンテする憂き目」じゃなくて、 メンテする際につらい体験をするのを祈ってるって話だったのか
570 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:39:26 ] みんなこんなおっさん弄ってあげるなんて親切だなあ
571 名前:495 [2007/07/07(土) 01:14:31 ] >>568 古いANSI-C(K&R第2版の頃な)で void foo { int a[100] = {0}; ... } とでも書いてみたまえ。コンパイルは通るがaの要素がa[0]以外全てランダム値で 深刻なバグに発展するかもしれんね? つまりだね。たかが一つ昔の仕様を回避したところで、 反証にはならんのですね。 それを何を偉そうに「全然困らんぞ」だって? 自分で気づいて直すならまだマシだが、納品後にクレームの電話。待ちますか?
572 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 01:17:42 ] 納品後ってコンパイル通ったらすぐ納品しちゃうの?そんなに切羽詰った職場なの?
573 名前:495 [2007/07/07(土) 01:28:59 ] >>572 ハイハイ。君の言ってる事は 「お前は何時何分地球が何回、回ったときに納品した?」 というレベル。 あっちでママが呼んでますよー。『そろそろ寝なさい』だって。ププ
574 名前:495 mailto:sage [2007/07/07(土) 01:31:27 ] もう厨房しか居ないし、寝るかな。 また明日ー。俺が気に入らなかったら削除依頼でも出しときな。
575 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 01:32:07 ] 明日も来る気ですかw おっさん忙しいんじゃなかったのかw
576 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 02:03:04 ] Kusakabe と毛色は違うが同類だな
577 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 02:26:42 ] 削除依頼ワラタ 削除したいのはお前だけだって
578 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 04:20:16 ] よっぽど自分の間違いを「なかったこと」にしたいんだろうなぁ。 こういう責任の自覚がない香具師が下らん犯罪の元仁になったりするんだ。 くわばらくわばら
579 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 05:51:35 ] 新しい仕様はC++には取り入れられないのかな?
580 名前:デフォルトの名無しさん mailto:s [2007/07/07(土) 05:51:49 ] 新しい仕様はC++には取り入れられないのかな?
581 名前:デフォルトの名無しさん mailto:s [2007/07/07(土) 05:51:57 BE:115689986-2BP(7)] 新しい仕様はC++には取り入れられないのかな?
582 名前:デフォルトの名無しさん mailto:s [2007/07/07(土) 05:52:02 ] 新しい仕様はC++には取り入れられないのかな?
583 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 10:19:27 ] >>524 そんな問題とは違うだろ 新しいルールは後から参加してきた守銭奴によって政治的に作られるんだから 自然の法則に従って限界に達して出てきた障害とは一緒にするな
584 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 10:23:09 ] >>579-582 www.open-std.org/jtc1/sc22/wg21/
585 名前:495 mailto:sage [2007/07/07(土) 10:55:13 ] なんだ。捨て台詞しかないのか。ツマラン
586 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 11:04:21 ] windowsのSIZEとかPOINTとかRECTの構造体で、 メンバの型をtemplate構文を使うことにより自由に決められるやつってありますか? こういうのって絶対誰もが考えると思うんだけどWTLにすらなくて・・・ 自力で実装するしかないんでしょうか?(´・ω・`)
587 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 11:07:04 ] はあ?
588 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 11:10:46 ] >>585 いい加減ネタも尽きて来たしな。 >>586 ないね。俺も考えたことあるけど。
589 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 11:29:17 ] >>586 あるよ。ほら。 template<typename T>class size { T width_; T height_; public: size() : width_(), height_() {} size(T width, T height) : width_(width), height_(height) {} size(const size & foo) : width_(foo.width()), height_(foo.height()) {} size & operator=(const size & foo) {width_ = foo.width(); height_ = foo.height(); return * this;} bool operator==(const size & foo) const {return width() == foo.width() && height() == foo.height();} T width() const {return width_;} T height() const {return height_;} T area() const {return width() * height();} }; 今作ったからバグってるかも知れないけど。
590 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:03:31 ] 環境依存すらOKのスレで、 古いANSI-Cが前提となっている理由が理解できない。 それは君の勉強不足だろうと。
591 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:18:15 ] やっぱ無いんですね・・・ とりあえずsizeは参考にさせてもらいます 仕方ないのでboostとか使ってSTL対応の格好いいのを作っちゃうことにします(`・ω・´) いざ出来ても動作が重いとかサイズを食うとかで結局使わない感バリバリですが…
592 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:22:47 ] つうかWin32APIに渡す時点で構造体サイズは結局そこに合わせなきゃいけないから RECT<float>とかしたところでたいした意味はない
593 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:29:28 ] 結局変換の時に一時オブジェクト生成する分オーバーヘッドになるだけですか… それでもAPIに渡すまででポータブルに扱う分には役立つだろうと思ったけどあまり意味無いですね(´・ω・`)
594 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:32:55 ] >>593 >589程度のクラスなら、どうせ最適化で消えるだろうからどんどん使えば? size, point, rect辺りの綺麗にまとまったテンプレートクラスにして公開してくれたら 積極的に使ってあげるよ。
595 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:38:05 ] C++の質問があります。 map<int, FUNC> MAP; キーをint型、値を関数ポインタで、関数ポインタに関しては、他のクラスのメンバ関数も セット出来るようにしたいのですが、FUNCの定義の仕方がイマイチ分かりません。 御願いします。
596 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:40:05 ] >>595 メンバ関数ポインタを他のクラスのも使えるようにするってあーた・・・・ thisポインタをどうやって区別するつもり?
597 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:40:20 ] boost::function
598 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:46:26 ] >>595 つBoost.Bind
599 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:47:36 ] >>598 bind は型じゃないだろ。
600 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:49:57 ] 仮想関数へのポインタなら、基底クラスの関数ポインタを使っとけば大丈夫。
601 名前:デフォルトの名無しさん mailto:age [2007/07/07(土) 23:36:29 ] オーバーロードされたコンストラクタについて質問です。 class A { int data; public: A(int x, int y){ data = x+y; } A(int x){ A(x, 0); } }; のような感じで、2つ目のコンストラクタは1つ目のコンストラクタを内部で呼んでいるのですが、 うまく値が入りません。 (これは例なので簡単にしてありますが、実際はもっと複雑なことをしています) コンストラクタの中で別のコンストラクタを呼ぶことはできないんでしょうか? いちおうコンパイルは通るのですが。
602 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:39:16 ] できない。 A(x, 0)は単に一時オブジェクトを作る式となるだけ。 元のオブジェクトとは何の関係も持たない。
603 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:41:01 ] 何でデストラクタは単体で呼べるのにコンストラクタは呼べないの?
604 名前:601 mailto:sage [2007/07/07(土) 23:42:02 ] なるほどそういう意味ですか。 ではどうするのがスマートなやりかたでしょうか? 初期化用の関数を作ってそれぞれのコンストラクタから呼ぶのがいいんでしょうか?
605 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:47:29 ] 結局それが一番だよ。
606 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:47:43 ] >>603 placement new を使えば単体でコンストラクタを実行することはできる。 でもコンストラクタの中で自身に対して使っても正しい意味は成さない。 デストラクタだって、デストラクタの中から自身に対して呼んだりしちゃいけない。
607 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:13:21 ] deleteするとき、与えられたポインタの型が元のポインタの型ではなかった場合でも、正常に削除できますか? int *int_ptr = new int; void *void_ptr = reinterpret_cast<void *>(int_ptr); ... delete void_ptr;
608 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:24:20 ] PODならmalloc/freeでいいんでないの。
609 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:38:01 ] >>607 deleteでは、オブジェクトのデストラクタを呼んだ後 メモリを確保する必要があって そのデストラクタが正しく呼べるなら違うポインタ型にしてもOk。
610 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:48:13 ] みなさんデストラクタの戻り値はチェックしていますか?
611 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:49:47 ] >>610 基本中の基本
612 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:56:12 ] 僕はコンストラクタの戻り値もチェックしてまつよ(`・ω・´)
613 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:56:44 ] >>610 無理。
614 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:59:01 ] >>607 ダメ。未定義動作。 5.3.5p3
615 名前:デフォルトの名無しさん [2007/07/08(日) 01:13:30 ] C++を始めてする人にオススメという本はないでしょうか 自分はC言語を少し齧った程度で、オブジェクト指向の意味すらわかりません
616 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:19:40 ] >>615 メイヤーの「Eiffelオブジェクト指向入門」がオススメ
617 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:27:51 ] >>616 教えてくれてありがとうございます、明日辺り早速本屋で探してこようと思います
618 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:39:11 ] おいおい
619 名前:617 mailto:sage [2007/07/08(日) 01:40:38 ] >>618 おいおいとか言われたら不安になるじゃないかぁーーー!!
620 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:41:25 ] おれはこのページだけで勉強した ttp://www.asahi-net.or.jp/~yf8k-kbys/ 少し古いけど初心者が勉強するには十分
621 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:49:14 ] >>620 全俺が感動した
622 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:04:16 ] >>617 俺もその本は持っているが、とても実践向きじゃない。 十数年前はオブジェクト指向なんて言葉自体珍しかったから、名前だけで買ってしまった。 Eiffel(エッフェル)なんて、謎の言語を覚える気なら敢えて止めはしない。
623 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:24:20 ] オブジェクト指向理解のためなら、JavaかC#あたりのほうがとっつきやすい。 C++はいろいろ細かいルールが多すぎて焦点がぼける感がある。
624 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:37:45 ] 細かいルール云々というよりC++はマルチパラダイムなために、 オブジェクト指向に限らないというのが逆に理解のネックになるのかもな。 初心者だった頃先輩に薦められてModernC++Designを読んだときは一気に挫折しかけたwww
625 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 07:30:41 ] SADでも必死に会社に行っている人 [メンタルヘルス]
626 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 07:57:28 ] >>607 "デストラクタ virtual" でぐぐれ
627 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 08:41:03 ] >>620 そのサイトは間違いを指摘しても直さないから余りお勧めできないが。
628 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 09:14:02 ] 最初に勉強に使ったページ www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html と www.geocities.jp/ky_webid/cpp/language/index.html 補足に使ってるページ www.cmagazine.jp/src/kinjite/cpp/index.html homepage2.nifty.com/well/Index.html www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/general/index.htm www.s34.co.jp/cpptechdoc/
629 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 09:44:26 ] >最初に勉強に使ったページ >www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html >627 >www.geocities.jp/ky_webid/cpp/language/index.html 不明。 >補足に使ってるページ >www.cmagazine.jp/src/kinjite/cpp/index.html ダメダメ。 >homepage2.nifty.com/well/Index.html >www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/general/index.htm >www.s34.co.jp/cpptechdoc/ 不明。
630 名前:デフォルトの名無しさん mailto:s [2007/07/08(日) 09:55:37 ] C の勉強を K&R だけでやった。 C++ というかオブジェクト指向の入門を C Magazine の 連載だったと思う A級B型C++ だけでやった。 あとはテクニック本をよみつつ、本当に疑問に思った仕様は おおもとの仕様書(規格書)にあたる。
631 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:02:40 ] >>627 暇そうなのにね
632 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:05:09 ] 不明=別にどっちでもいいよって事だな えぴの記事は内容は古いけど初心者がC++の深遠を覗くにはいいと思うし あとC++プライマーとか普通の入門書を一冊手元においておけばどんなページでも役に立つと思うぜ
633 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:06:09 ] >>630 仕様とパラダイムは違うからねぇ
634 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:39:28 ] VC++とWin32APIプログラミングの違いが分かりません(´・ω・`)
635 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:51:09 ] ワープロと小論文の違いがわかりませんと言われても困る。
636 名前:デフォルトの名無しさん mailto:s [2007/07/08(日) 11:12:10 ] VC++使ってるけど Win32 API なんてほとんど使わないなぁ。
637 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 11:44:44 ] 俺ライブラリとかATLとかその他公開されているライブラリにラップして使ってる人が殆どだと思う
638 名前:デフォルトの名無しさん [2007/07/08(日) 13:28:24 ] 10年前にVC++6.0使ってたんだけど、 今はWindowsでのC++開発環境って何がメジャーなの? VC++2007ってありますか?
639 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 13:30:39 ] 残念ながらVS2008になりそうです
640 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 13:41:35 ] >>638 「VC++」でぐぐるとVisual Studio 2005のページが出てくるから、とりあえずそこ読んでおけ
641 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 13:44:19 ] cygwin/gcc/g++ mingw
642 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 15:24:33 ] コンパイル時に数が決まっている要素の数をカウントしたいんですが、
643 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 15:29:09 ] elementofマクロの話?
644 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 15:47:34 ] すみません。途中で送信されてしまったようです。 コンパイル時に数が決まっている要素(あるクラスを継承しているクラス)の数をカウントしたいんですが、 マクロの様なものを単純にコピペするだけでカウントするにはどうすればいいんでしょうか。
645 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:01:43 ] 詳細が分からんと何も言えん
646 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:18:54 ] あるクラスを継承しているクラスの総数を知りたい? それはリンク段階でしか判らないこと無いか?
647 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:36:31 ] 同一ソースコードに書いてあるので、コンパイル時にコードを下へ逐次見ていくだけで機械的にカウントできます。
648 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:37:28 ] 今boost::preprocessorを使ってもがいてます...
649 名前:デフォルトの名無しさん [2007/07/08(日) 16:46:40 ] VC++1.51をWIN98で使ってるんですが、DOSのプログラムを組んで走らせると ハングする事が多いです。BCC5.5でコンパイルすると問題無く動くのですが。 1.51でDLL16使うのはWIN95までしか対応してないのでしょうか。
650 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:58:25 ] >>649 IDE自体はWin9x/NT系で動かすとハングしやすいな。 デバッグ実行は特にめろめろだが、 作ったプログラムが単体でハングするならそれはあなたの作ったバグ。
651 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 18:10:53 ] builderで、警告が100個超えたら、 「エラーあるいは警告が多すぎる」と、最後にエラーが出てきました。 警告の上限の数は、決まってますか?
652 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:26:18 ] C言語でputchar('a');みたいに'あ'を出力するにはどうすれば良いでしょうか? ググってみたら #include <stdio.h> #include <wchar.h> int main(void) { putwchar(L'あ'); return 0; } こうかと思ったのですが、どうも違うようでよく分からないですorz
653 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:27:39 ] printf("あ");
654 名前:デフォルトの名無しさん mailto:s [2007/07/08(日) 19:27:52 ] Visual C++ 2008 になったら tr1 とかも実装されるのかな。 C99 互換モードとかもつくのかな。
655 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:28:17 ] >>651 コンパイラ次第
656 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:31:01 ] >>653 書いた後でそう言われそうだと思ったけど、 そういう意味じゃなくて、 int hoge='a'; putchar(hoge); こういう感じで'あ'を扱うにはどうしたら良いでしょうか?
657 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:36:28 ] a と あ って全然違うだろ。1バイトと2バイトだし
658 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:37:19 ] UTF-8 なら3バイト。
659 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:39:29 ] >>656 char hoge="あ"; putchar(hoge);
660 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:39:44 ] >>659 コンパイルエラー
661 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:40:43 ] wint_t hoge='あ'; putwchar(hoge);
662 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:40:44 ] >>659 それなら、 char hoge[]="あ"; にしないとまずいだろ。
663 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:43:25 ] あまりにもひどい流れだ
664 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:48:08 ] >>660 自分もそうやるのかと思ったんですが、 それだと何も表示されないです。(VC++2005で)
665 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:56:05 ] ぬるぽ
666 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:56:43 ] 666
667 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 20:02:53 ] ロケール?
668 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 20:06:59 ] あはなぁ・・・・
669 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 20:16:32 ] 文字型を文字列で初期化できるわけねーだろ
670 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 20:22:14 ] >>652 ↓で良いが、例えばVC++8.0(VS2005)ではバグによって何も表示されない。 wchar_tやロケールまわりをまともに使える処理系か確認するこった。 #include <stdio.h> #include <wchar.h> #include <locale.h> int main(void) { setlocale(LC_CTYPE, ""); putwchar(L'あ'); return 0; }
671 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 20:29:35 ] wchar_t を使う事は根本的な解決になってるんだろうか。
672 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:06:30 ] >>652 #include <stdio.h> #include <wchar.h> #include <locale.h> int main(void) { setlocale(LC_ALL, ""); putwchar(L'あ'); return 0; } Visual C++ 2005だとこれだけではバグってだめみたいだけど。
673 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:23:41 ] >>670 ,>>672 ありがとうございます。 ちょっとbcc入れるのに手こずってました。 bccだと無事に動くっぽいですが、VCではダメなんですね。 しかしこれって単純に出来るものかと思ってたら、 意外と上手いこといかないものなんですね><
674 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:25:33 ] >>673 VC++でも以前のバージョンなら問題なく動くんだがな
675 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:39:11 ] Visual Studio 2005買うか迷う 早く2007か2008発売してくれたらいいんだけどな…
676 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:41:47 ] 今買うのはいかにも時期が悪いだろう バグ持ちだしな(SPでも直ってねぇし)
677 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 22:26:22 ] おれはEclipse派
678 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 22:50:56 ] あれだけ難しいと思ってた「C言語ポインタ完全制覇」が今なんとなく読んだら 全部スラスラと理解できてワロタ 昔買った本読み返すとあぁ俺ちゃんと成長してると実感できてうれしいなw
679 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 22:52:44 ] ちょうどあるから読んでみよっと
680 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 22:55:05 ] Modernはいまだに7割くらいしか理解できん…
681 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 23:54:54 ] >675 2008は4Q(多分12月ごろ)。MSDNにすれば?
682 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:30:28 ] すみませんが質問です。 ある関数のバイナリを表示するプログラムを作ったのですが思ったとおりに表示されません。 source: #include <stdio.h> int func(void)//この関数のバイナリを表示したい。 { return 0x12345678; } void fend(void){}//func関数の終わりをこの関数のアドレスから求める。 int main(void) { char *p; char i; p = (char *)func;//func関数のアドレスをchar型のポインタへ代入。 for(i=1; p<(char *)fend; i++) { printf("%2.2X ", *p++);//func関数のバイナリを1バイトごとに表示。 if(!(i%16)) putchar('\n');//とりあえず16バイトごとに改行。 } return 0; } result: 55 FFFFFF8B FFFFFFEC FFFFFFB8 78 56 34 12 5D FFFFFFC3 55 8B EC B8 78 56 34 12 5D C3と表示されるのを期待していたのですがうまくいきません。 コンパイラはBorlandコンパイラです。 根本的な間違いの指摘、もしくは強引な方法でうまく表示させる方法を教えてください。
683 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:34:30 ] >>682 そこまでできてるんなら char を unsigned char にすればいけそうな気はするね。 でも、移植性のあるコードじゃないことは理解しておけよ。
684 名前:682 mailto:sage [2007/07/09(月) 01:36:30 ] >>683
685 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:37:00 ] pの型を char → unsigned char
686 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:38:46 ] ついでに、%2.2Xは%Xで大丈夫な希ガス
687 名前:682 mailto:sage [2007/07/09(月) 01:39:53 ] ミスりました。 >>683 ありがとうございます。 解決できました。 移植性のないコードであることは百も承知でございます。 cl.exeでコンパイルするとうまくC3のret命令で終わらなかったです。 ただ、アセンブリの勉強のために作ったので自らの環境で動けば問題なしです。 ご丁寧にどうもありがとうございました。
688 名前:デフォルトの名無しさん [2007/07/09(月) 01:45:28 ] 1byte文字、2byte文字が混ざった文字列から、 1文字ずつ読み込んで、これが1byteか2byteか判定するにはどうしたら良いでしょうか? お願いします。
689 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:48:08 ] txtから数字を読み込んでバブルソートするプログラムを組みたいのですが (数字は一行ずつ記述された状態) 出来ればそのあとさらにtxtに出力したいです fgetsに関する記述方法がいまいち理解できないです この後にどのような記述をすればいいのでしょうか #include<stdio.h> #include<stdlib.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) int bubble(int a[],int n) { int i,j; for(i=0;i<n-1;i++){ for(j=n-1;j>i;j--){ if(a[j-1]>a[j]){ swap(int,a[j-1],a[j]); } } } } int main(void) { FILE *fp; if((fp=fopen("data.txt","r"))==NULL){ printf("file open失敗\n"); exit(1); } while(fgets(
690 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:49:02 ] gccだと型そのままでも %02hhX にすれば問題なく表示できるんだが bccでも同じなのかどうかは知らない まぁ、バイナリ扱うなら unsigned char にしとくほうが良いだろうけど
691 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:56:53 ] >>689 フォーマットが固定ならfscanfで読み込んでfprintfで出力すれば良いだけだと思うけど fgetsで読み込みたいなら読み込んだ奴をstrtolするかsscanfにかければいいし
692 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 02:08:14 ] カレーが食べたいよ
693 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 04:08:03 ] >>678 遅レスだけど、俺もスラスラ読めて、さらには 「JAVAだとどうだとか、ほっといたれや」 とまで思ったりして、はじめ読んだときは「なるほどな〜」と 思ってたのに、今じゃ文句までつけやがる俺。 どんどんひねくれていく自分に嫌気がさす。
694 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 07:03:58 ] >>682 func と fend がメモリ上で連続する保証はあるの?
695 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 08:13:30 ] >>694 ない。でも>>687
696 名前:デフォルトの名無しさん [2007/07/09(月) 14:14:04 ] age
697 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 14:15:09 ] sage
698 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 15:40:00 ] おしえてください (VC++ 6.0 MFC) エディットコントロールに複数行の文字列を表示させた時、 その時のスクロールの位置を一番下の行にしたいのですが、うまくいきません。 m_editMsg.SetWindowText( m_strLog ); m_editMsg.SetScrollPos( SB_VERT, m_editMsg.GetScrollLimit( SB_VERT ) ); この処理を行うと、スクロールバー自体は一番下の行に移動した様な表示になるのですが、 表示される文字列データは、先頭部分が表示されてしまいます。 どうしたらいいのか教えて下さい。お願いします。
699 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:24:14 ] エディットは、キャレットの位置を動かせ EM_SETSEL 使えばいいかな。
700 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:44:31 ] >>687 関数間が NOP (90h) で埋められてるなら NOP が出てくるまで・・・と出来そうな気はするけど、 コードの途中で境界合わせに NOP が出てこない保証もないし、 ダメかなあ・・・。
701 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:58:25 ] >>700 定義順に関数アドレスが並ぶ保証はどこにもないよ
702 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 17:12:31 ] >>699 ありがとうございます。調べてみます。
703 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 17:51:57 ] >>701 ?
704 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 18:17:06 ] >>700 関数間がNOPで埋められる保証もどこにも無いよ。
705 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 19:37:39 ] >>704 「関数間が NOP (90h) で埋められてるなら」 という条件付きで話してる事に、そう言われても・・・
706 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 19:42:30 ] この手の板にはよくあること
707 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 19:43:36 ] 関数のアドレスが、ジャンプテーブルだったりするのも よくある話。
708 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:06:18 ] C++だけではGUIって作れない? API勉強しないとだめ?
709 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:09:33 ] >>708 「C++だけ」ってのが「標準C++ライブラリだけ」ってことならyesだな
710 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:19:22 ] >>709 ありがとう。さすがにCUIばっかりで飽きてきちゃったからAPI勉強してみる(`・ω・´)
711 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:34:28 ] >>709 否定形の問いかけに対して安易にyesと答えてはいけないw
712 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:56:37 ] >>705 VC2005だとそうなっては無かったから、 結構多くのコンパイラでその仮定は間違っているんじゃ無いの? と思っただけ。 どっちにしても>>700 はあんまり意味無さそうだね。
713 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 21:24:20 ] >>707 vc8のインラインアセンブラだと × call printf ○ call dword ptr [printf] ○ call test_func ○ call dword ptr [test_func] (test_funcは同じオブジェクト内の自作関数) じゃないとうまく動かなかった。 不思議なような、そうでもないような。うーん。
714 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 21:32:18 ] call printfがだめなのは、ランタイムDLLを使っているからという可能性は無い?
715 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 21:40:08 ] >>714 That's right ! そのとおりだった! ってか、前にMTでテストしたはずだったんだけどな・・・orz
716 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:51:37 ] 関数最後のサブルーチンコールはジャンプで実装する最適化もあるぞ。
717 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 00:19:18 ] >>712 昔の VC6 くらいそうなってなかったかなあ。
718 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:55:26 ] 2005もDebugとReleaseで違うしな
719 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 21:51:23 ] 質問です。 基本的にMFCのDoc-Viewを用いたプログラムです。自分で生成した特定の ウィンドウのスナップショットを、画像に保存したいのですが、どのようなアプローチで 進めたらいいのか悩んでいます。 1. 非アクティブまたは非表示な場合でも、フレームを含めたウィンドウ全体を 画像として取得するような手段はあるのでしょうか? 2. 1.が不可能なら、非アクティブまたは非表示で、ウィンドウの内容(例えばCViewの 中身)のみを取得する手段はあるのでしょうか? XP VC2005 SP1
720 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:07:13 ] fgets(str,N-1,stdin); printf("%d",(int)strlen(str)); ↑な感じのコードを書いて実行させると、 【実行画面】 >hoge 5 となるのですが、これってどうなっているのでしょうか?
721 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:12:05 ] hogeの後に改行文字がくっついてて、それも数えられてるから
722 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:14:58 ] あぁ、改行文字を読み込んでたのか! ヌル文字は入れないはずなのになんでかと思ったら…。 >>721 サンクスです!
723 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:00:52 ] >>718 2005だとRelease,Debugとも基本的にNOPは使ってないよ。
724 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:24:29 ] char str[10]="piyo"; これでstrが指す場所を"yo"にしたいのですが、 どうすれば良いでしょうか?
725 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:25:23 ] >>724 strcpy(str, "yo");
726 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:28:13 ] >>725 char *str2 = &str[2];
727 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:31:52 ] >>725 文字列をコピーしたいってより、yoの場所まで移動させたいのです。 array[i++]=strtol(str,&err,0); これを繰り返し行う際にstrをstrから任意のバイト分進めた値にして 文字列を完全に走査、数値格納したいのです。
728 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:39:50 ] そのstrは配列だからそもそも指すとかそういう表現はしない &str[2]とかstr+2好きなように表記すればよか これが気持ち悪いなら別途charへのポインタ用意して char *p=str; とした後に読み進めたいバイト分だけp+=2みたいにインクリメントすればいい
729 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:41:26 ] char* p = &str[2]; でいいんじゃね
730 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:44:48 ] str[i]2
731 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:46:04 ] >>727 strtol の使い方が知りたかっただけなんだね #include<stdio.h> #include<stdlib.h> int main(void){ long value[100]; char str[]="100 200 300 400 500 x 600 777"; char *ptr=str, *endptr; int i, value_num=0; for(value_num=0;value_num<100;value_num++){ value[value_num]=strtol(ptr, &endptr, 10); if(ptr==endptr) break; ptr=endptr; } for(i=0;i<value_num;i++){ printf("%ld\n", value[i]); } return 0; }
732 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:47:28 ] >>726 ,>>728-729 なるほど、ありがとうございます。 それを参考にちょっと今から思った通り出きるか作ってみます。
733 名前:732 mailto:sage [2007/07/11(水) 00:34:56 ] で、出来た…。 >>731 さんのものを参考に、一行にある複数数字(途中非数字あり) を格納して表示するプログラムを作ってみました。 これってあと直すところとかどうでしょうか? >12 32 aaa43jfie55 32 たとえば入力が上のようなら、 12,32,43,55,32が配列に格納されて表示される仕様です。 #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 256 int main(void){ long value[N]; char str[N]; char *ptr=str, *endptr; int i, value_num=0,l; fgets(str,N,stdin); l=strlen(str)-1; for(i=0;i<l;i++){ if(strtol(ptr, &endptr, 10)!=0) value[value_num++]=strtol(ptr,&endptr,10); ptr=++endptr; } for(i=0;i<value_num;i++){ printf("%ld\n", value[i]); } return 0; }
734 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 00:37:08 ] #define N 256
735 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 00:37:13 ] あれ、>>732 で>>731 さんへのアンカを入れ忘れてました…。 申し訳ない、>>731 さんも激しくありがとうございます。
736 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:01:54 ] どなたかC++に詳しい方、教えてください。今日、はまりました。 以下ClassAに、オーバロードしたfunc()という関数が2つがあるとします。 ClassAを継承したClassBをnewし、classb->func(NUM_2);をコールすると、期待通りに ClassA::func(NUM)がコールされるのですが、(1)だけオーバライドしたClassCを newし、classc->func(NUM_2);をコールするとClassC::func(int, NUM)がコールされて しまいます。 期待した動作はClassA::func(NUM)がコールされる事でした。 これはC++の仕様なのでしょうか。コンパイラがどういう論理でenumを使用した関数の オーバライド/オーバロードを解決しているのかご存知の方、ご教示お願いします。 enum NUM { NUM_1, NUM_2, NUM_3 }; class ClassA { virtual int func(int a, NUM b = NUM_1); // ←(1) virtual int func(NUM a = NUM_1); // ←(2) }; class ClassB : public ClassA { // ClassAの(1),(2)はオーバライドしていないクラス }; class ClassC : public ClassA { // ClassAの(1)だけをオーバライド int func(int a, NUM b = NUM_1); };
737 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:03:17 ] つwww.fides.dti.ne.jp/~oka-t/cpplab-hide-overload.html
738 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:06:12 ] 呼び出し側のコードはどうなってんの
739 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:12:08 ] NUMばっか出てきてとか見づれーんだよ。もっと考えて書けよドカスが >classc->func(NUM_2);をコールするとClassC::func(int, NUM) 理由は>>737 だ ClassCでfunc(int,NUM)を宣言しちゃったから、ClassAのfunc(int,NUM)が見えなくなってる。 あとvirtualな関数にデフォルトパラメータつけるな
740 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:58:14 ] >>737 >>738 >>739 見づらくてすいません。 C++にそんな仕様があるとは知りませんでした。 ありがとうございました。 参考までに >あとvirtualな関数にデフォルトパラメータつけるな は何故でしょうか?
741 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:10:29 ] デフォルトパラメータは静的な型に依存する class B{ virtual void foo(int a=300){std::cout << a;} } class D{ void foo(int a=100){std::cout << a;} } B* pb = new D(); pb->foo(); //300と表示される D* pd = new D(); pd->(foo); //100と表示される だった筈
742 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:11:50 ] >>741 > pd->(foo); モチツケ
743 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:24:20 ] >>741 なるほど。納得しました。 ありがとうございます。
744 名前:デフォルトの名無しさん [2007/07/11(水) 10:08:49 ] >>188 PHPアプリとCアプリとログ出力先を共通化という 無茶な事を要求されているときも 行単位の一発書き込みなら大丈夫かな? 2プロセス立ち上げてそれぞれ適当に書き込みをさせて 100万回くらいテストしたんだけど これで混ざんなかったから 多分大丈夫だよね?
745 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 10:52:14 ] >>744 「行単位の一発書き込み」がシステムコールレベルでそうなっているなら大丈夫。 具体的には、(直接的または間接的に)O_APPENDでopen()されており、write() 一発で1行を書き込んでいるなら大丈夫。 それから少しでもズレるならダメ。 Win32の場合、O_APPENDに相当する機能がCreateFile()に存在しないので、 *必ず*排他が必須になるようだ。
746 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 14:55:19 ] 質問失礼します。 シャノンの符号化法による符号語生成プログラムと、 表計算ソフトを用いた符号語生成の違いについて説明して頂けないでしょうか? よろしくお願いします。
747 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 16:23:30 ] >>746 表計算ソフトを用いた符号語生成って、何のことか教えて。
748 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 21:59:26 ] >>743 ちなみに741の問題を回避するためにもNVIパターンが使えるぞ。
749 名前:デフォルトの名無しさん [2007/07/12(木) 08:23:23 ] すみません string型でファイル名を持っているとき、それをオープンしようとすると エラーが出ます。char型にするにはどうすれば良いですか?
750 名前:749 [2007/07/12(木) 08:26:48 ] 自己解決しました
751 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 08:26:59 ] つc_str()
752 名前:デフォルトの名無しさん [2007/07/12(木) 08:27:49 ] ありがとうございました
753 名前:デフォルトの名無しさん [2007/07/12(木) 08:51:04 ] ファイルを読み込むとき、終端で必要以上のサイズを 読み込むと配列が最後まで埋まってしまいます どうすれば実データのみ読めますか?? fp.read(str,N); とすると strのサイズはNになります
754 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 08:58:00 ] 何使って読み込んでるの? fp の型は?
755 名前:デフォルトの名無しさん [2007/07/12(木) 09:04:02 ] fstream fp ("filename", ios::in | ios::binary ); なんですけど、fp.read(str,N); の戻り値は、istream 型です どうすればサイズがわかりますか??
756 名前:755 [2007/07/12(木) 09:24:03 ] 自己解決しました fp.gcount();で読み込みサイズが出ました