1 名前:デフォルトの名無しさん [2007/11/03(土) 00:20:13 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.43【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1190860744/l50 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
89 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 02:16:04 ] 変数名の付け方で時々悩むのですが、 みなさん「ハンガリアン記法」ってのを使ってますか?
90 名前:80 mailto:sage [2007/11/05(月) 02:25:10 ] 仕事で強制されたら使うけど、個人的なプログラムでは使わない といっても、java使いなんで、Cだとどうなることやら エラーの原因がトンと分からなかったので、FromFileで読み込めるようなので試してみた。 Image::FromFile(L"1111.bmp"); Image::FromFile(L"C:\\1111.bmp"); Image::FromFile(L"C:/1111.bmp"); ぜんぶ0x00000000(null?)が返ってくる。なんで? 内部で画像の読み込みに失敗して、javaでいうヌルポでも発生してたんかしら?
91 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 02:30:19 ] >>87 GCCの方が文法に厳しいので勉強するならGCC
92 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 02:35:18 ] こういう時に注意かな for(int i=0;i<10;i++) cout << i << endl; cout << i << endl; で、いらないテクニックを覚える…と #define for if(1)for
93 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 07:59:41 ] >>89 タイプの方なら自然と使ってる。ってか便利。 システムの方は自然と使わなくなった。
94 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 08:16:02 ] >>92 さすがに、それはVC++でもNET 2003あたりから コンパイル通らないほうがデフォルトになった。 >>93 それをいうならアプリケーションハンガリアンではないのか?
95 名前:デフォルトの名無しさん [2007/11/05(月) 12:21:07 ] index が1000万あるとします indexごとにファイルを読みに行くとします このとき、ファイルを一つにまとめるのと、一つ一つ分けるのと、いくつか束にするのではどれが速度速いですか? ランダムに3個程度のindex値をアクセスすることにします
96 名前:デフォルトの名無しさん [2007/11/05(月) 12:29:25 ] 一ファイル当たり10KB以下として、indexは10万とします このときファイルサイズは最大1Gになります indexは、0から10万の数字で与えられるとします indexごとにファイルの位置を記録しておくか、index名のファイルを10万用意するかですが どっちが良いですか?
97 名前:デフォルトの名無しさん [2007/11/05(月) 13:00:49 ] あまり細かく分けると、クラスタサイズの制限から容量多く使ってしまいますね 10バイトしか記録しなくても512バイト程度使ってしまいますね
98 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 14:31:55 ] Unicode, ShiftJIS, EUC あたりを相互変換できる文字コードライブラリを探しています。 ・言語はCオンリー ・ライセンスがBSD以下のゆるさ ・サイズはなるべく小さめ ・ポータブル の条件に合うよさげなライブラリがあったら教えてください。 よろしくお願いします。
99 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 15:53:16 ] スレ違いでね?
100 名前:デフォルトの名無しさん [2007/11/05(月) 16:58:31 ] 配列の入力の時に,EOFだと-1入力で終了になりますよね? 改行で入力終了にしたいのですが,どうすればいいですか? 1 1 0 0 1 0 1 1 改行 で入力を終了したいです。 教えてください。よろしくお願いします。 //---- 配列入力 num = 0; do { scanf("%d", &arr[num]); } while ( arr[num++] != EOF ); // 改行は入力の終了 num--; // 有効な入力数
101 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 17:45:46 ] >>100 マルチすんなカス
102 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:23:00 ] >>100 char buf[MAXSIZE]; char *p; fgets(buf, 99, stdin); p = strtok(buf, " "); while(p != NULL) { arr[num++] = atoi(p); p = strtok(NULL, " "); }
103 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:24:02 ] >>100 訂正 char buf[MAXSIZE]; char *p; fgets(buf, MAXSIZE - 1, stdin); p = strtok(buf, " "); while(p != NULL) { arr[num++] = atoi(p); p = strtok(NULL, " "); }
104 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:26:35 ] 他の言語のソースを移植すれば良くね? サイズ小さいライセンスも気にしない
105 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 19:48:49 ] -Lオプションで指定したディレクトリのうち その中にある特定のディレクトリを参照させないようにするにはどうすればいいですか? たとえば -L/usr/local/lib と指定したもののうち /usr/local/lib/gcc-4.0.4 は参照しないようにする とかいう感じです
106 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:02:23 ] >>95-96 速度は実測が基本。 良い悪いの判断は本人にしかできない。
107 名前:デフォルトの名無しさん [2007/11/05(月) 21:07:59 ] 巨大なファイルのシーク時間と、ファイルのオープンに要する時間は一般的にどっちがかかるんですか? ファイルのオープンの方がコストは多そうですが
108 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:09:47 ] >>107 聞く前に試せよサル
109 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:20:47 ] >>107 聞く前に試せよサル
110 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:44:45 ] >>107 使用するファイルシステムによっても違うしだろうし、ファイルシステム上の断片化などの状態にも依る。 キャッシュに乗ってるかも影響するはず。 試せ。
111 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:21:46 ] C++でAPIを組んでいるのですが ttp://www.katsakuri.sakura.ne.jp/src/up29024.txt.html この項目を入れたら 0x00412984 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00090f44 を読み込み中にアクセス違反が発生しました。 とエラーが出るようになったのですが、どこがおかしいのでしょうか? 作っているプログラムの内容は、チェックボックスにチェックが入っているところにEDITボックスを表示する、と言う感じです。 選択した場所によってはうまく動作することもあります。
112 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:37:59 ] ぶった切り失礼します 文字列をlongに変換するstrtol()という関数ですが 失敗時の返り値が0なのはいいのですが、文字列が"0"だったときの区別のつけ方は 変換不可能な文字列へのポインタの格納先を準備してあげるしかないのでしょうか?
113 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:31:55 ] 自作関数作れば? long mystrtol(char *cary, char **ep) { if(!strcmp(cary,"0")) return 0L; return strtol(cary,ep,10); } こんなのとかさ
114 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:58:10 ] >>113 にツッコミたくてたまらない俺はまだまだ修行が足りないな。
115 名前:デフォルトの名無しさん [2007/11/06(火) 02:16:20 ] >>114 つっこんでやれよ、本人のためにもさ
116 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:16:44 ] sscanfとか、StrToIntExとか
117 名前:デフォルトの名無しさん [2007/11/06(火) 02:24:27 ] 893が75キロ VS 105キロの空手家 体重差 30キロの殴り合い映像 video.nifty.com/cs/catalog/video_metadata/catalog_071105039557_1.htm 店でNo4 ホスト VS 黒帯空手家 死闘の映像 video.nifty.com/cs/catalog/video_metadata/catalog_071104039294_1.htm イケメン ホスト VS ブルースリー ボコボコに殴る映像 video.nifty.com/cs/catalog/video_metadata/catalog_071103039028_1.htm 893 VS ブルースリー 対決映像 video.nifty.com/cs/catalog/video_metadata/catalog_071102038922_1.htm
118 名前:デフォルトの名無しさん [2007/11/06(火) 05:27:21 ] 算術命令圧縮って弱点あると思うんですが 例えば0 1の出現率が等しいとするとどのビット列も同じ確率になりますよね? データの並び順を考えないと駄目ではないですか? たとえば0000000000000000000000000000011111111111111111111111111111111などは 繰りかえし数を記録することでかなり圧縮できると思うのですが
119 名前:デフォルトの名無しさん [2007/11/06(火) 05:42:46 ] 算術命令圧縮ではなくて算術圧縮だったよ あと、文書を圧縮するならば前の1、2バイトごとに確率分布表を作って圧縮するといいと思うけど
120 名前:デフォルトの名無しさん [2007/11/06(火) 06:39:22 ] 算術の説明だと、1文字ずつの説明だけだけど、初めから5文字の分布を与えても出来るね 確率1%のものがあれば、2^(-7) = 0.0078125 だから小数点以下7桁程度を与えるのが良いと言うことになる ハフマン圧縮の一般化といえるね
121 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 13:49:45 ] class BaseClass{ public: int a; BaseClass(){}; ~BaseClass(){}; virtual void Func(){}; }; class SubClass : public BaseClass{ public: int b; void Func(){}; }; int main(){ BaseClass *pointer = new SubClass[2]; for(int i=0; i<2; i++) pointer[i].Func(); delete [] pointer; return 0; } これでエラー起こるの何故
122 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 13:53:35 ] >BaseClass *pointer = new SubClass[2]; 配列へのポインタはキャストしてはいけない
123 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 13:58:11 ] >>122 もし上みたいに子クラスのインスタンスの配列を親クラスのポインタに入れて使いたい場合どうしたらいいんですか?
124 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 14:04:50 ] 親クラスのポインタの配列を作れば良いじゃないか。
125 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 14:17:58 ] 申し訳ない… 具体的にはどんな書き方に…?
126 名前:125 mailto:sage [2007/11/06(火) 14:22:08 ] 自己解決しました ありがとうございました
127 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 17:52:46 ] そういうのも自己解決って言うのかw
128 名前:デフォルトの名無しさん [2007/11/06(火) 19:06:46 ] ディジタル技術検定の問題集で「二つの正の整数の積を求めるプログラム」の解説をお願いします。 二つの正の整数の積ということなのですが、二つの整数をかけるだけ(a*b)ではいけないのでしょうか? while文の処理がさっぱりわかりません。 よろしくお願いします。 #include <stdio.h> void main(void){ int a,b,prod=0,temp; printf("a="); scanf("%d",&a); printf("b="); scanf("&d",&b); if(a>b){ temp=a; a=b; b=temp; } while(a != 0){ if(a%2 == 1) prod +=b; a=a/2 b=2*b } printf("product of %d * %d = %d", a, b, prod); exit(0); }
129 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 19:31:10 ] ループ中の計算をシフトとビット演算で置き換えると 乗除の演算なしで掛け算が出来るなぁ…、なんて。
130 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 19:33:33 ] 燦然と輝くvoid main(void)
131 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 19:37:32 ] >>128 小学校で習った掛け算の筆算を二進数でやってるようなもんだ
132 名前:128 mailto:sage [2007/11/06(火) 19:40:53 ] >>129 こういうことですか? while(a != 0){ if(a%2 == 1) prod +=b; a=a >> 1 /* a=a/2 */ b=b << 1 /* b=2*b */ }
133 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 20:28:03 ] >>129 そこはコンパイラの最適化に期待ということでは? もっとも、これくらいならC/C++でもシフト使えということは同意。
134 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:35:19 ] というか、そこで*を使ってしまうと、 「じゃあ(a*b)でよくね」みたいな話になるから(w
135 名前:デフォルトの名無しさん [2007/11/07(水) 19:47:22 ] class hoge : public base { private: base* m_base; }; これって循環ですか?
136 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:25:07 ] 開発中によく見る記述ですが何か心配なことでも?
137 名前:デフォルトの名無しさん [2007/11/07(水) 20:58:33 ] 循環なら避けたいんですが、 循環ですか? hogeの定義にbaseが必要で でもhogeはbaseを持ってるので なんか循環っぽいなぁと。
138 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:13:18 ] ならお前の避けたい循環の意味をちゃんと書けやタコが
139 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:16:02 ] 知ってる人に聞ければいいです。 そもそも知らない人は 自分が知らないのに人に教えられるわけがないでしょう。
140 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:18:34 ] それじゃ、誰にも答えられないね。
141 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:20:44 ] >>140 全知全能の神光臨。
142 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:29:49 ] 循環じゃないよ
143 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:30:14 ] とりあえず循環参照が起こる可能性は充分すぎるほどに有るわな。 ただ場合によるので、具体的にやりたいことを示してくれないと問題点の指摘は出来ん。
144 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:33:34 ] baseの定義にhogeを必要としてたら循環定義
145 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:35:38 ] 循環ってのは class sage の宣言に class age を使ってて class age の宣言に class sage を使ってる場合。 よって循環ではないべ?
146 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:36:24 ] >>135 普通に連結リストかなんかでありそうな気がするが
147 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:38:30 ] >>140 の立場wwwwww
148 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:43:03 ] で、結局どっちの意味で循環って言ってるのよ?>>135 は。
149 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:43:04 ] >>135 あほすぎ
150 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:55:38 ] >>149 = 顔をつぶされた>>140
151 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:08:21 ] >>150 はずれ
152 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:19:11 ] >>135 エスパーがいない可能性を考えないのか?
153 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/11/07(水) 23:08:13 ] >>135 base<---hogeで循環は存在しないけど m_base = new する第3のクラスを含めた循環に注意です
154 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:11:41 ] で、結局誰もまともに答えられないんですね。がっかりしました。
155 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:51:46 ] >>154 >>153
156 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:59:52 ] それはもう読みましたよ。
157 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 10:37:40 ] >>156 お仕事頑張ってくださいね
158 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 10:38:57 ] なるほど循環参照の事か
159 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 11:07:44 ] >>154 聞いてる時点でお前はそれ以下じゃんw
160 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 11:28:52 ] >>158 >>137 読めば分かるだろ。
161 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:06:16 ] >>159 それはつまり、回答者と質問者の理解度を対等に比較するのが あなたにとっては「自然」である、ということですよね? でもそれって、教師の知識が怪しい、という話をしている時に「生徒はそれ以下じゃんw」と 返すようなものですね。 こっちは、そういうレベルの人間が、知識を持っているという嘘をついて「教壇に立」って、 誰かに物を教えるのが間違いである、という点を言っているんですよ。 そういうレベルの人に回答者になってもらっては困るんです。質問者も、場も、混乱するだけなので。 確かに理解度は俺のほうが下です。 でも、あなた方も俺と同じ、質問者レベルなんです。回答者気取りをされると邪魔なのです。 そういうことです。
162 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:10:41 ] 社会性の無いキチガイが紛れ込んでますね
163 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:15:12 ] >>161 何を聞きたいのか分かりません 実体の循環参照ならコンパイルできないので安心して下さい ポインタを使う限り循環参照になる可能性は常にあります 諦めて下さい
164 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:28:37 ] プログラムの勉強に飽きたら2,3日何もしないとかいう人いる?
165 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:31:58 ] >>161 がっかりするとは俺もお前にがっかりだ
166 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:32:03 ] 勉強つーか趣味のコーディングではよくある。一週間以上になることもしばしば。
167 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 17:15:41 ] リアルで >>161 は空気読めない人って 周りから言われるんじゃね? 教師は仕事で金もらって教えてるわけだが、 ここは2chだしなー 質問者はこうあるべき! 回答者はこうあるべき! とか真面目に言われてもなー 郷に入れば郷に従えっていうから、 説教長文書くより、どうすれば 2chで回答を得られる可能性が高くなるのか? を考えたほうが現実的。 妥協できないなら、ネットで質問なんてするな。 第三者からみれば、あんたが荒らしだから。
168 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 17:35:28 ] 釣られすぎ。
169 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 17:58:31 ] >>162 まったくです。困ったものですね。 人に何かを教える立場というのは、自己顕示欲の異常に強い人達にとっては 魅力的なものなのでしょうね。だからそのスキルも無いのに気取りたがるのでしょう。 >>165 がっかりする分には好きなだけがっかりしてもいいですよ。 能もないのにでしゃばったりしないこと、これを学習することのほうが大切です。 >>167 「ここは2chだし理論」で物を言う人は、相手の言い分にもきちんとそれを適用して、 ここは2chなのだから説教なんかしてもしょうがない、という風に思い至るべきですよ。 ある理屈を、ある側にだけ適用するのはおかしな言動だと言わざるを得ません。 それから、「2chで回答を得られる可能性」は、この場合関係ありません。 回答者が回答できるレベルにあれば、それで解決していたことなので。 あと、第三者というのを一つの意志のように語るのは気持ち悪すぎです。 あっちの第三者と向こうの第三者は、異なる意識を持っているのです。 架空のみんなが自分を支持する夢から出て、自分の名義で物を言いましょう。
170 名前:167 mailto:sage [2007/11/08(木) 18:14:58 ] うわーすごいな だから空気読めといっとろうが 質問してみた ↓ バカにされた ↓ マジ反論 ←いまここ まともな回答もついてるんだからさ それでいいじゃん? これ以上何を望んでるの?
171 名前:167 mailto:sage [2007/11/08(木) 18:16:16 ] 釣りなら見事に釣られたわけだがな>俺
172 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:37:21 ] 釣りでしょ。少なくとも>154は漏れだし。
173 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 19:19:35 ] >>170 ダメ回答者達が維持したがっているダメな空気は、読んだ上で否定しています。 そんな種類の空気に支配的になられては困るので。
174 名前:173 mailto:sage [2007/11/08(木) 19:32:48 ] ごめん釣りでした。
175 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 19:34:54 ] ダメ回答者をバッタバッタと取り締まってくれる 救世主が登場
176 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 19:45:20 ] >>138 = >>140 がメンツをつぶされた挙句暴れている模様。
177 名前:140 mailto:sage [2007/11/08(木) 20:33:36 ] ちゅがうよ
178 名前:デフォルトの名無しさん [2007/11/08(木) 23:26:50 ] スレッドで、void* で渡した引数をclassに変換したいのですがキャスト出来ないと言われます 2つ以上の引数をスレッドに渡すにはどうすればいいですか?
179 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:44:35 ] classじゃなくて、classへのポインタにキャストしてみればどーか? void func(void *arg) { ((hogeclass *)arg)->func(); }
180 名前:デフォルトの名無しさん [2007/11/08(木) 23:49:05 ] サンクスやってみます
181 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:50:40 ] って、まさか本当に HogeClass hoge = (HogeClass) threadArg; なんて記述をしてるんじゃ…。
182 名前:デフォルトの名無しさん [2007/11/08(木) 23:59:34 ] キャストしたvoid型ポインタのarg引数のポインタの元の型 が適切な物なら良いけど、もしそうじゃないなら怖いな
183 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 00:12:57 ] 俺はその辺が気持ち悪くなってboost::threadに逃げた。
184 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 04:19:15 ] 空気読めて無い人って本当に空気読めてると思ってるんだ・・・ リアルでは出会えない珍獣を見た
185 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 05:51:13 ] >>184 とっくにスレの流れ変わってるんだから、空気読めよ。
186 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 06:34:46 ] 違うんだ・・!>>184 の空気を読めなくしたのは・・・本当は・・漏れなんだ・・・!
187 名前:デフォルトの名無しさん [2007/11/09(金) 10:24:19 ] ビット列の出現個数を数えたいのですが毎回結果が違います 何ででしょうか? #include <iostream> #include <windows.h> #include <process.h> using namespace std; #define N 1000 #define K 320000 unsigned int su[256]; unsigned WINAPI open(void *p){ unsigned long size; char *buf=new char [K+100]; HANDLE fp=CreateFile((char*)p,GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); ReadFile(fp,buf,K,&size,NULL); for(int i=0;i<size;i++)su[ (unsigned char)buf[i] ]++;} main(){ WIN32_FIND_DATA fd; char path[200]="d:\\aaa\\",serchpath[200]; strcpy(serchpath, path); strcat(serchpath, "*"); SetCurrentDirectory(path); HANDLE hd = FindFirstFile(serchpath, &fd); int n; HANDLE hf[N]; for(n=0;n<256;n++)su[n]=0; for(n=0;;n++){ for(;;){if(!FindNextFile(hd, &fd))goto end; if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))break;} hf[n]=(HANDLE)_beginthreadex(NULL, 0, open,(void*)fd.cFileName, 0 ,NULL);} WaitForMultipleObjects(N, hf, TRUE, INFINITE); end: for(n=0;n<256;n++)cout<<n<<" no kosu "<<su[n]<<endl;}
188 名前:デフォルトの名無しさん [2007/11/09(金) 10:27:39 ] su配列にマルチスレッドでアクセスしているところが駄目なんでしようか?
189 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 10:39:10 ] >>187 ・同一メモリに複数スレッドから同時にアクセスしているから ・serchpathなんてへんな変数名だから ・thread内でnewしているのに解放していないから ・高々Kバイトしか読み込まないのに100バイトも余計に確保しているから ・変数nを違う目的に使い回しているから ・コーディングスタイルが変態だから ・ハンドル変数にfpなんて名前を使っているから ・どっかWinAPIと思しき辺りの使い方が間違っているから ・毎回ディレクトリの状態が違うから ・毎回ファイルの内容が違うから どれだろね。
190 名前:デフォルトの名無しさん [2007/11/09(金) 10:47:50 ] 正解はなんなんですか?
191 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 10:56:48 ] >>190 1つずつ問題がないかどうか確認するんだ
192 名前:デフォルトの名無しさん [2007/11/09(金) 10:58:06 ] これでも値が違います なぜでしょうか #include <iostream> #include <windows.h> #include <process.h> using namespace std; #define N 200 #define K 16 unsigned int su[K]; unsigned WINAPI f(void *p){ int n=(int)p; for(int i=0;i<n*n;i++)su[i%K]++;} main(){ int n; for(n=0;n<K;n++)su[n]=0; HANDLE hf[N]; for(n=0;n<N;n++){ hf[n]=(HANDLE)_beginthreadex(NULL, 0, f,(void*)n, 0 ,NULL);} end: WaitForMultipleObjects(N, hf, TRUE, INFINITE); for(n=0;n<K;n++)cout<<n<<" no kosu "<<su[n]<<endl;}
193 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 11:01:05 ] >>192 馬鹿だから。
194 名前:デフォルトの名無しさん [2007/11/09(金) 11:03:41 ] 192よりこっちのほうがたんじゅんかとおもいます どこが駄目なんでしょうか #include <iostream> #include <windows.h> #include <process.h> using namespace std; #define N 200 #define K 12 unsigned int su[K]; unsigned WINAPI f(void *p){for(int i=0;i<(int)p;i++)su[i%K]++;} main(){ int n; for(n=0;n<K;n++)su[n]=0; HANDLE hf[N]; for(n=0;n<N;n++){hf[n]=(HANDLE)_beginthreadex(NULL, 0, f,(void*)n, 0 ,NULL);} WaitForMultipleObjects(N, hf, TRUE, INFINITE); for(n=0;n<K;n++)cout<<n<<" no kosu "<<su[n]<<endl;}
195 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 11:09:00 ] 書き手が駄目なんだろう。
196 名前:デフォルトの名無しさん [2007/11/09(金) 11:12:06 ] こうしんされた値が、別のスレッドで更新されてしまうからですかね? メモリがFDくらい動作がのろいとするとsu[・]の値を呼び出して 1を足して書き戻すときに、同時に呼び出して計算していた値で置き換えられると言うことです
197 名前:189 mailto:sage [2007/11/09(金) 11:16:26 ] ちゃんと最初に指摘しているのに……(TT
198 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 11:18:14 ] カワイソス
199 名前:デフォルトの名無しさん [2007/11/09(金) 11:20:38 ] これと同じ事ですね 速くする為にスレッドにしたいのに排他制御入れたら鈍くなりますね クリティカルセクション 例 ウェブページの来訪者数を表すカウンタのプログラムを例にとって説明する。カウンターのプログラムはおおまかに次の処理からなる。 ディスク等の記憶装置から現在のカウンタの値を読み出す カウンタの値を1増やす カウンタの値を記憶装置に書き戻す ttp://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
200 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 11:24:24 ] 配列の要素を LONG volatile にしてInterlockedIncrement。
201 名前:187 [2007/11/09(金) 11:33:53 ] いいこと思いついた スレッド側でビット列の個数を数えて、その個数を配列で返してメイン側で足しあわせる これなら時間のかかる部分はスレッドでやってあるから高速のはず
202 名前:デフォルトの名無しさん [2007/11/09(金) 12:39:04 ] 環境:WindowsXP VS2005 SP1 MFCアプリケーション ダイアログベース ある市販のDLL(libも付いてたので「追加の依存ファイルに指定済み」)の外部関数をコールするたびに、以下のようなメッセージが出力ウィンドウにでます。 HOGE.EXEの0x7c812a5bで初回の例外が発生しました:Microsoft C++の例外: std::runtime_error (メモリの場所 0x0012f16c) 0x7c812a5bでググるといくつかヒットしましたが、原因特定できず。 仕方ないので関数コールをtry catchでくくってもcatchできず。 _try _exceptでも受けれず。 このエラーはどうやったら出なくなるでしょうか?
203 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 12:40:31 ] 非同期処理じゃなくて高速化が目的なのかヨ。 よく知らねぇんだが、デュアルコアとは言え プロセスでもない単なるスレッドでOSがマルチな処理してくれるんか? シングルコアな動きするなら、ディスパッチするだけでむしろ遅くなりそうなんだが。
204 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 12:42:39 ] ゆとり教育がどうこう言われてるけど、194はもっとソースにゆとりを持たせるべき 変態と言われてもそのままってことは真性のMなんだろうか
205 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 12:45:39 ] >>203 しかも、実態はディスクアクセスで律速されるから(同じディスク上のファイルを調べる限り)殆ど速くなる余地がない罠。
206 名前:202 [2007/11/09(金) 12:47:30 ] 書き忘れましたが、出力ウィンドウに表示が出るだけで、 動作には影響は今のところありません。 あと、その市販のDLLに付いてきたMFCのサンプルプロジェクトで試しても同じエラーが出力ウィンドウに出ます。
207 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 14:46:34 ] その市販DLLの名前も書かんということはエスパー希望か。
208 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 15:54:58 ] const.cpp 1 #include <iostream> 2 3 void extfunc(const int &val) 4 { std::cout << val << std::endl; } 5 6 class A 7 { 8 static const int CONSTDATA = 0x100; 9 public: 10 void func() 11 { extfunc(CONSTDATA); } 12 }; 13 14 int 15 main() 16 { 17 A a; 18 a.func(); 19 return 0; 20 } $ g++ --version g++ (GCC) 4.2.3 20071014 (prerelease) (Debian 4.2.2-3) $ g++ const.cpp /tmp/ccN8OXMd.o: In function `A::func()': const.cpp:(.text._ZN1A4funcEv[A::func()]+0x9): undefined reference to `A::CONSTDATA' うーん・・・コンストメンバ変数って、参照で受ける事が出来ないんでしょうか? extfunc(int(CONSTDATA)); とすれば通りますがなんか・・・
209 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 15:59:37 ] メーカーに電話。
210 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:19:18 ] >>208 定義が無いから賢いコンパイラなら定数データの領域は確保しないらしいね (なので当然シンボルもない) by メイヤーズ 定義してみなよ const int A::CONSTDATA;
211 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:41:20 ] >>203 187の場合で効果があるかどうかは別として、少なくともWindowsでは、 マルチスレッドでも複数の論理CPUを使ってくれる。
212 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:46:47 ] Linuxにとっては、スレッドはプロセスと基本的には同じ。 従って、特定のスレッドがどのコアで実行されるかは 原則的にカーネルにゆだねられる。
213 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 17:07:17 ] >>210 なんと・・・ 6 class A 7 { 8 static const int CONSTDATA; 9 public: 10 void func() 11 { extfunc(CONSTDATA); } 12 }; 13 14 const int A:CONSTDATA = 0x100; でOKでした,#defineしちゃいそうだけどここは我慢・・・ サンクスです
214 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 22:00:56 ] >>213 初期値の指定はクラス定義内でいいんだぜ。そうしないと配列要素数とかの 定数式につかえない。 >>210 クラスのメンバ変数は定義しない限り実体がなくて、参照やポインタを取ろうとすると エラーになることは決まっている。整数型に限って初期値をクラス定義内に書けて、 書けば定数式に使えるという特別ルール。
215 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 22:03:41 ] >>206 DLL 内で throw されて DLL 内で catch されてるんでしょ。何も問題ない。
216 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 00:33:03 ] 暗号アルゴリズムを勉強しはじめたところなのですが、 DES や AES など、一般的な暗号方式のライブラリはありませんか? C でも C++ でもいいです。 ご存知のかた、もしくは自作モノを持っているかた、情報をお願いします。 ;; できれば SHA-1 や base64 まで対応していると嬉しいですが、 ;; 無くても構いません。
217 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 00:39:48 ] 勉強なら自分で作れ。ライブラリを使えるようになっても勉強にならないぞ あとSHA-1やbase64は暗号じゃない
218 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 00:58:37 ] >>216 opensslとかか? まぁでも>>217 に1票
219 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:07:12 ] >>214 だからEffectiveC++に載っていると。。
220 名前:203 mailto:sage [2007/11/10(土) 01:21:43 ] >>211-212 情報サンクス。 良く知らんことしゃべってすまんかった。
221 名前:187 スレッド出来ました [2007/11/10(土) 03:02:08 ] #include <iostream> #include <windows.h> #include <process.h> using namespace std; #define N 100 #define K 320000 unsigned int su[N][256]; char fname[N][256],chk[N]; unsigned WINAPI open(void *p){ unsigned long size,n=(int)p; char *buf=new char [K+100]; HANDLE fp=CreateFile(fname[n],GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); while(1){ ReadFile(fp,buf,K,&size,NULL); if(size==0){chk[n]=0;return 0;} for(int i=0;i<size;i++)su[n][ (unsigned char)buf[i] ]++;}} main(){ WIN32_FIND_DATA fd; char path[200]="d:\\aaa\\",serchpath[200]; strcpy(serchpath, path); strcat(serchpath, "*"); SetCurrentDirectory(path); HANDLE hd = FindFirstFile(serchpath, &fd); int n,i; HANDLE hf[N]; for(n=0;n<N;n++)for(i=0;i<256;i++)su[n][i]=0;for(n=0;n<N;n++)chk[n]=0; for(;;){ if(chk[n]==0){ for(;;){if(!FindNextFile(hd, &fd))goto end; if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))break;} strcpy(fname[n],fd.cFileName); chk[n]=1; hf[n]=(HANDLE)_beginthreadex(NULL, 0, open,(void*)n, 0 ,NULL);} n++;if(n>=N)n=0;} end: WaitForMultipleObjects(N, hf, TRUE, INFINITE); for(n=1;n<N;n++)for(i=0;i<256;i++)su[0][i]+=su[n][i]; for(i=0;i<256;i++)cout<<i<<" no kosu "<<su[0][i]<<endl;}
222 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 08:40:14 ] >>221 >for(;;){ if(chk[n]==0){ 最初にこの行に到達するとき n=N だぞ。
223 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 10:27:45 ] >>219 本は持ってないので知らないけど、クラス定義内の static const な整数型について >210 みたいに「賢いコンパイラなら〜」って書いてあるなら、ちょっと不正確だと思う。
224 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:24:44 ] >クラスのメンバ変数は定義しない限り実体がなくて、 これは必ずしも正しくないということが書かれてるよ。 これを実現するコンパイラがいわゆる賢いコンパイラ。 標準で、絶対に領域確保がされないことが保障されている わけではなく、実装依存となる。static constなデータは、 確保されるならば、大抵静的領域になる。アドレスを必要とする 処理がある場合に限って(この場合は必ず領域確保が必要)領域 を確保してもいいし、無条件に確保しておいてもいい。 それは実装依存ということ。 領域確保を絶対に避けたければenumを使えばいい。
225 名前:224 mailto:sage [2007/11/10(土) 11:27:22 ] >クラスのメンバ変数は定義しない限り実体がなくて、 というのは、もちろん非staticなメンバーについては正しい。 上で書いたのはstaticなメンバーについて。
226 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:34:49 ] >>210 >>214 >>223 BCCで>>208 で引っかかって調べたときに 「>>208 は新しい規格で>>213 は古い規格」 みたいな記述を見たんだが。 コレがホントなら、「賢い」とかあんまり関係ないんじゃね? 正確なところ知ってる人、フォローplz
227 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:50:28 ] >>226 ポインタや参照とかのアドレスを必要としない場合でも常にメモリ確保 を強制されるというのを新しい規格で認るのは信じがたいけど。 正確なところ知ってる人、フォローplz
228 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 12:43:08 ] >>224 さっきから実装依存だと言ってるのって、名前空間スコープに定義した const 変数の 話じゃないの? クラスの static const なメンバ変数はクラス定義内では宣言しかされないので、 別途定義が必要。整数型に限って、宣言につけた初期値を持つ定数式として使える という特別ルールがあるだけ。 C++ 2003 規格の 9.4.2 p2 より > The declaration of a static data member in its class definition is not a definition and may be of an > incomplete type other than cv-qualified void. The definition for a static data member shall appear in a > namespace scope enclosing the member’s class definition. 同じく 9.4.2 p4 > If a static data member is of const integral or const enumeration type, its declaration in the class > definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that > case, the member can appear in integral constant expressions. The member shall still be defined in a namespace > scope if it is used in the program and the namespace scope definition shall not contain an initializer.
229 名前:228 mailto:sage [2007/11/10(土) 12:53:51 ] あ、整数型の static const メンバ変数については "if it is used" ってあるから、 定数式の一部として使うぶんには定義は必要無いね。参照やポインタを取られる 可能性があるなら関係ないけど。 >208 の例もあるし、ライブラリとして提供するような時には気をつけて定義しとかないと まずいね。
230 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 14:09:21 ] >>228 thx
231 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 14:23:44 ] bind1stやbind2ndの戻り値は何でしょうか? どういう性質のものなのか?あと型名とか。
232 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 15:20:54 ] binder1stやbinder2nd
233 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 17:13:27 ] >>232 それは引数を一つとるoperator( )が定義されている関数オブジェクトの クラス型ということですよね?
234 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 17:36:10 ] そう。 直接binder1stやbinder2ndを使っても問題は無いんだけど、 その場合はbinder1st<ここを書かなきゃいけないのがめんどいよね>。
235 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 17:42:20 ] >>234 どうも。 ストラップ本で理解できました。
236 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 18:11:21 ] 紐本?
237 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 18:14:49 ] 禿本
238 名前:デフォルトの名無しさん [2007/11/11(日) 15:11:11 ] VC6.0でかかれたプログラムをVisualStudio2005に移植しようとしてます。 あるプロセスでstrtok()で、トークン分解中に静的リンクしたDLLの関数を呼んでいます。 その関数内でもstrtok()してるらしく、関数終えて呼び出し元で続きのstrtok()をしようとすると、意図しない値(具体的にはNULL)が入ってしまいます。 MSDNにはCランタイムライブラリの頁に静的リンクなら問題ないようなことを書いてますが、 なぜstrtok()が静的リンクした関数にひきづられるのでしょうか。 あとVC6.0の頃は引きずられなかったのでしょうか。 環境:XP MFC
239 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 15:26:26 ] >>238 strtok() はヌルを渡されたときのために前回の分割位置を静的な変数に覚えている ことがある。だから、基本的にそういう使い方はできない。 msdn2.microsoft.com/ja-jp/library/abx4dbyh (VS.80).aspx 静的リンクで DLL との競合が起こらない理由もちゃんと書いてある。 VC8(VS2005) でも静的リンクは使えるから、明示的に指定すれば同じ動作に なるんじゃないの?
240 名前:238 [2007/11/11(日) 17:30:02 ] >>239 ありがとう。 自分もその頁見てたけど、静的リンクするのはCRTであって、 こちらが作ったDLLじゃないわけですね。 そこを勘違いしてました。 結局どのコンパイラオプションを選べばいいか調べきれなかったので VC6.0の時は適切なコンパイラオプションだったんだろうけど、今回はstrtok_s()使うことにしました。
241 名前:デフォルトの名無しさん [2007/11/11(日) 17:38:52 ] 符号なし整数だとオーバフローが起きない というような話をときどき伺うのですが、 どういうことなのか理解できません…… 教えて頂けませんか?
242 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 17:56:28 ] オーバフローが起きないなんてことはないので忘れてください
243 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:00:02 ] >>241 符号なし整数の計算では、最大値の次が 0 で 0 の前が最大値というふうにラップしている ものとして結果が必ずその型の範囲内に収まる、と規格で定められている。 ラップする場合を指してオーバーフローと言うかどうかは微妙なところ。
244 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:28:41 ] >>243 なるほど、納得できました ありがとうございます
245 名前:デフォルトの名無しさん [2007/11/11(日) 18:50:42 ] はじめまして。 初心者です。 C++について質問があります。 ArrayとVecotorの全ての値をファンクションに渡して、Arrayの全ての値をReturnしたいのですが、 うまくいきません。 コールの仕方と、プロトタイプの書き方、それからReturnの書き方を教えてください。 もしくは、何か別の方法をしないといけないのでしょうか…? よろしくお願いします。
246 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:58:21 ] >>245 Array とか Vecotor とか聞いたことないけど int なり何なりと変わらんと思うよ Array func(Array a) { /* a についていろいろ処理 */ return a; } void func(Array *a) { /* a についていろいろ処理 */ }
247 名前:245 [2007/11/11(日) 19:14:29 ] >246 IntやDouble、Char等のScalar変数(ひとつの値しか含まない変数)なら うまくいくのですが、ArrayやVectorのようなCollection変数(二つ以上の値を含む変数)は なぜかうまくいかないのです。 Int型Arrayについて、 Int myFunction(myArray[]) { Arrayについて処理 return myArray[]; } や、 String型Vectorについて String myFunction(myVector[]) { myVector処理 return myVector[]; { のようにやろうとしているのですが、間違えているのでしょうか…?
248 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:36:53 ] >>247 コンパイルもできないコードを貼って「間違えているのでしょうか…?」って、何考えてんだ? エスパーでも募集してんのか? とりあえず C/C++ では大文字小文字が区別されるから、区別しろ。いまのままじゃ めちゃくちゃすぎる。 実際にコードを書いてコンパイルしろ。そしたらエラーメッセージが出るから、それを嫁。
249 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:36:59 ] 何がやりたいのか、まだよくわからないなぁ。
250 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:38:02 ] これはC/C++なの? myArray/myVectorがテンプレートなのかも怪しいけど STL前提ならこう書くんじゃないか // int型のベクタを定義 typedef std::vector<int> myIntArray; myIntArray myIntFunction(myIntArray array) { myArray::iterator i = array.begin(); myArray::iterator e = array.end(); while(i != e) { // arrayに対する処理(要素に1を足す) *i += 1; i++; } return array; // 処理結果を返す }
251 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:42:54 ] わりぃ myIntArray::iterator i = array.begin(); myIntArray::iterator e = array.end(); だわ
252 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:08:26 ] for_each使ったほうがよくね?
253 名前:エスパー mailto:sage [2007/11/11(日) 20:12:05 ] >>247 そのArrayやVectorはコピーできない だから関数にそのまま渡すことも返すこともできない
254 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:41:47 ] とりあえず何だ。 Int って何だ。Array って何だ。String って何だ。C/C++ にそんなものはない。 しかも、せっかく >Array func(Array a) ってアドバイスもらってるのに、 >Int myFunction(myArray[]) って思いっきり無視してるし。
255 名前:デフォルトの名無しさん [2007/11/11(日) 21:58:30 ] すみませんスレチかも知れませんが質問です。 Windows VistaとVisual C++ 2005 ExpでOpenGLを使い簡単なゲームアプリを製作しました。 友人AのVista機ではなんら問題なく動作したのですが、友人BのXPでは動作しませんでした。 友人A、BともにOpenGLのDLLは入っています。 どなたか解決のヒントでもいいのでご存じであればよろしくおねがいします。
256 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:02:47 ] msvcr80.dllがなんたらっていうエラーメッセージだったら、 VC++ 2005のランタイムを入れろ。
257 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:02:51 ] Visual C++のランタイムは入ってるかね?
258 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:08:27 ] 聞いてみたところ、ランタイムは入ってるとのことでした。エラーメッセージは 『このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。 アプリケーションを再度インストールすることにより問題が解決する場合があります。 』 らしいです。Vista環境では正常に動作するのですが……
259 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:22:56 ] じゃあ.NET Frameworkかな
260 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:45:16 ] これからVC++を学ぶ場合でもMFCは有効ですか? それともMFCは今後使用されなくなっていくことが濃厚で .NETとCLR?(この違いはわかりませんが)を勉強 したほうが良いでしょうか?
261 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:46:08 ] >>258 エラーメッセージでググったら、こんなの出てきたがどうよ? ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060025.txt
262 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:57:08 ] >>260 個人的な意見 .NETで良いと思う。 でもどっちみち、ちょっと突っ込んだことしようとすると Win32APIをガシガシ叩くことになるんで、 まずはウィンドウに子ウィンドウ貼り付けて絵と文字を表示するぐらいは Win32APIを触っとくのが良いと思う。 1週間も掛からんと思うし。
263 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:05:56 ] >>262 何か一冊.NETの本読んでみます。 ちなみにCLRは.NETとは関係無いものですか? .NETはVBやVC#でも共通に使えるものでCLRはVC++ 固有のものですか?
264 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:07:11 ] C++でのゲームの組み方について質問よいでしょうか 現在シューティングゲームを作ってるのですが、以下のようなタスクシステムで行なっています class ITask { virtual void task()=0; virtual void draw()=0; }; class CEnemyZakoA : public ITask class CEnemyZakoB : public ITask class CEnemyFactory : public ITask class CBg : public ITask class CItem : public ITask こんな感じで、全てのオブジェクトはITaskを継承し、一つのITaskリストに登録しています。 そこで疑問なのですが、Task同士が連携するにはどうすればよいでしょうか? 例えば「CBgの持つ『どのくらいスクロールしたか』の情報によって、CEnemyFactoryは生み出すZakoの種類を変える」 といった場合です。 一応素人考えながらこういう手を考えましたが、一般的にはどうするべきなのでしょうか? 1・FacotryのようなほかのTaskの情報に依存するものは、リストに登録せず特別扱いする(CEnemyFactryとして保持しておく)べき 2・他のTaskに依存するTaskは、その生成時にそのTaskへのポインタをもらっておくべき 3・他のTaskに影響を与える情報をまとめた構造体を持ち、それへのポインタをtask()の引数で渡してあげるべき 1はいまいちだと思います。特別が増えるたびに管理が増えますし、何のためのITaskリストなのかわかりません 2はなかなかいい手ですが、CBgが削除された時などに困ります(share_ptrを使うべき?) 3は構造体に新しい情報が加わるたびに、全てのCXXX.cppが再コンパイルになるのが不満です
265 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:15:15 ] >>264 こちらへ↓どうぞ。 タスクシステム総合スレ pc11.2ch.net/test/read.cgi/gamedev/1173708588/
266 名前:263 mailto:sage [2007/11/11(日) 23:17:22 ] 解決しました。 入門書にも書いてありました。
267 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:42:05 ] >>261 ありがとうございます!上手く行きました! 他にも助言頂いた方々本当にありがとうございました。
268 名前:デフォルトの名無しさん [2007/11/12(月) 15:09:38 ] すまそ。JavaやPHPやVBやってたんだけど、C++やることになりました。 MFCだかCLIだか知らんけど、それを上なぞりするだけの言語仕様がつかめる C++の本ないですか?一から細かいことまで調べる必要ないので。 C++も一応はわかっています。MFCとかCLIがソース見て理解できる程度の 上辺の知識を理解できるまでの文法力がつく本ってないですか?細かい言語使用は 適宜分厚い本でしらべるので。。よろしくお願いします。
269 名前:デフォルトの名無しさん [2007/11/12(月) 16:15:11 ] サイズ不明のファイルの内容を全部読み込む際に 動的なメモリの割当をしたいとき、どのようにしますか? i=0; while(fgets(...) != NULL ){ ++i; } とやってからnewとかmallocとかで配列を確保するのかなあ とか考えましたけど、どう考えても余計な事をしているようで…
270 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:29:18 ] >>269 つ[std::vector] つ[realloc()]
271 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 17:00:39 ] >>269 filelengthとか何らかの手段を使って、ファイルサイズを先に調べて、一気に割り当てる。 標準入力やパイプのようにサイズがわからない場合は、ある程度の大きさのブロックごとに 読み込み、ブロックのlinked listを作成する。大きさがあまり大きくないことがわかっているなら reallocもあり。
272 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 17:21:57 ] >>269 バイナリモードでファイルオープンしてシーク操作でファイルサイズ取得 ifstream seekg tellg
273 名前:デフォルトの名無しさん [2007/11/12(月) 18:49:16 ] C++ に thisってないの? class sample { int power; public setPower(int power) { this.power=power; } }; ってしたいんだけど、文法的に間違いだよね?
274 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:52:55 ] >>273 Javaとは違って、 this->power
275 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:17:31 ] >>273 C++のthisはポインタ
276 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 11:42:55 ] VC++2005(Express) で以下の可変長自動配列を使うコードが通ってくれません(g++では大丈夫でした) 可変長自動配列はC99からサポートされたらしいですがVC++ 2005は未対応? 固定長/ヒープにすればそれで終わりなのですけど、折角の便利仕様なので使いたい・・・ static cosnt int ARRAY_MAX 256 bool variable_array_test(int variable_len) { if (variable_len <= 0 || variable_len > ARRAY_MAX) return false; // bad length char temporary[variable_len]; // << C2054 でエラー return true; // ok } c:\ cl Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86 CXXFLAGS = -nologo -Zm200 -GS -Od -Zi -Gm -MDd -GR -EHsc -W
277 名前:273 [2007/11/13(火) 11:52:33 ] >>274-275 ありがとう!どうせ、こんなとぼけた質問には返事がきてないだろう とおもったら、来てた。おかげでよくわかりました。使い方と理屈が。 PHPのも参照だから矢印記号なんだ。なるほど、なるほど。お礼が遅くなり申し訳ないです。
278 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 11:53:21 ] VCはC99対応していない。 以上
279 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 12:05:27 ] >>278 ('д`;)・・・把握,mingw入れて吊ってきます
280 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 12:06:32 ] C++のコンパイラとして見ればVC8は結構優秀なんだがねぇ…
281 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 16:06:15 ] そもそもC99とC++98って一緒に使えるの?
282 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:14:06 ] C++ の std::vector 使えばいいじゃんって事なんだろう。
283 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:57:52 ] C99はいらない子
284 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 01:48:09 ] 可変長引数マクロだけはヨコセ
285 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 01:50:52 ] どうせなら__FUNC__もあるとうれしい。
286 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:44:38 ] >>284-285 両方 C++0x に入るみたい。ただし __FUNC__ じゃなくて __func__ ね。
287 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 07:41:10 ] で、C++0xまだー?
288 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 10:34:46 ] Cにclassが追加されるのも時間の問題だな
289 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 11:41:06 ] てかCいらねー
290 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 12:53:51 ] デバッグログ出力関係で可変引数マクロ使ってるんだが、 これも止めた方がいい?
291 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 12:54:47 ] あ、ヨセじゃなくてヨコセか
292 名前:デフォルトの名無しさん [2007/11/14(水) 13:49:55 ] #include <string> using namespace std; class Palindrome{ private: char *inputValue; public: Palindrome(); void setInputValue(char*); bool isPalindrome(); ~Palindrome(); }; Palindrome::Palindrome(){ this->inputValue = new char[100]; } void Palindrome::setInputValue(char *str){ strcpy(this->inputValue,str); } Palindrome::~Palindrome(){ delete [] this->inputValue; }
293 名前:デフォルトの名無しさん [2007/11/14(水) 13:50:32 ] つづき bool Palindrome::isPalindrome(){ char *aux = new char[100]; int k=0; for(size_t i=0;i<strlen(this->inputValue);i++){ if((this->inputValue[i] >= 'A' && this->inputValue[i] <= 'Z') || (this->inputValue[i] >= 'a' && this->inputValue[i] <= 'z')){ aux[k] = tolower(this->inputValue[i]); k++; }} aux[k] = '\0'; for(size_t i=0;i<strlen(aux)/2;i++){ if(aux[i] != aux[strlen(aux) - 1 - i]){ delete [] aux; return false; }} delete [] aux; return true; }
294 名前:デフォルトの名無しさん [2007/11/14(水) 13:52:03 ] つづき #include "Palindrome.cpp" #include <iostream> using namespace std; int main(){ Palindrome p; char string[100]; while(true){ cout<<"文字を入力してください: "; cin.getline(string,100); if(strcmp(string,"") == 0){ break; } p.setInputValue(string); cout<<"その文字は "<<(p.isPalindrome() == true ? "はパリンドロームです " : "違います ")<<endl; } return 0; }
295 名前:デフォルトの名無しさん [2007/11/14(水) 13:54:09 ] windoes上でこのふたつのプログラムは動くんですが、ubuntu上では コンパイルできません。 だれか、直してもらえますか?
296 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 13:57:24 ] エラーメッセージくらい載せろ
297 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 14:09:02 ] コンパイルできたし、実行もできてるようだが… (Ubuntu 7.10 / g++ 4.1) まさかgccでコンパイルしようとはしてないだろうな
298 名前:デフォルトの名無しさん [2007/11/14(水) 14:16:52 ] すみませんgccでコンパイルしました。 どうやってこんぱいるするんですか? 教えてください。
299 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 15:07:13 ] 上に書いてあるように g++ でもダメなの?
300 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 15:07:54 ] >>298 そんなことより、さっさとエラーメッセージ貼れよ。
301 名前:デフォルトの名無しさん [2007/11/14(水) 15:18:14 ] >>299 g++ でコンパイルできました。 どうもすみませんでした。 g++というのを知りませんでした。
302 名前:デフォルトの名無しさん [2007/11/14(水) 16:12:07 ] >>297 質問です。 コンパイルは出来たんですが、実行が出来ません。 g++ aMain.cpp -o aMain では何も起こらないんですがどうやって実行したんですか?
303 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:14:59 ] gccはコンパイラコレクションだからC++特化のライブラリを探してくれない。 g++はC++コンパイラだからC++特化のライブラリも探してくれる。
304 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:16:51 ] 明示しなかった場合、実行モジュールはカレントディレクトリにa.outという名でできる。 実行するには、./a.outでいい。 つーか、その程度の基礎知識もなしにコンパイルなんてするなよw
305 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:18:11 ] >>302 何したいの?それで aMain というファイルができてるの? できていえれば、 ./aMain とすれば走るはずだけど。
306 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:26:34 ] これはスルーしたほうがいいな
307 名前:デフォルトの名無しさん [2007/11/14(水) 16:40:07 ] a.outができません。aMain.oだけできます。 ./aMainだとpermission denied となってしまいます。
308 名前:デフォルトの名無しさん [2007/11/14(水) 16:45:08 ] 問題解決しました。./aMainでは実行できなくても g++ aMain.cpp -o aMain && ./aMain で実行できました。 お騒がせしてすみませんでした。
309 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 17:40:55 ] なんじゃそりゃ。 ただのタイプミスな気がする
310 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:06:04 ] >>308 そんなにあせらずに、Unix 系の CUI 使いかたの本薄いので 良いから一冊読むと大分時間の節約になると思うよぉ。
311 名前:デフォルトの名無しさん [2007/11/14(水) 20:33:43 ] 基本的なポインタの質問で申し訳ないんですが。 mallocなどで確保されてない領域を知る方法はありませんか? char *str; str=(char *)malloc(sizeof(char)*2); for(int i=0; i<5; i++){ if( (str+i) == NULL) //未確保 } みたいな形でわかればいいんですが、必ずしもNULLが入ってるとは限らないので…。 よろしくお願いします。
312 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 20:40:37 ] 確保したサイズを覚えておく。
313 名前:311 mailto:sage [2007/11/14(水) 20:41:58 ] >>312 なるほど・・・。 やっぱり、そういう方法しかないんですか・・・ せめてtry catchがあれば、強引に出来そうなんですけどね。 どうもありがとうございました。
314 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 20:46:31 ] ていうかそのソース突っ込みどころ満載だから勉強頑張ろうな。
315 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 20:47:44 ] 自分が確保したメモリのアドレスとサイズを持つ構造体でも定義すれば?
316 名前:311 mailto:sage [2007/11/14(水) 21:14:02 ] >>314 具体的にどのあたりでしょうか? よろしくお願いします。 >>315 なるほど。 その方法も検討してみます。
317 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:18:32 ] DLLで確保されたメモリはそのDLLで解放しないといけないと聞きました。 そこでお聞きしたいのですが、例えば以下のような場合 ・アプリケーションAがDLL_BとDLL_Cを参照 ・DLL_B自身もDLL_Cを参照 DLL_BがDLL_Cで確保したメモリを アプリケーションAからリンクされたDLL_Cで解放するのは大丈夫なのでしょうか? よろしくお願いします。
318 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:33:27 ] >>317 OKだけど、LocalAllocにすればそんなこと気にしなくてもいいんじゃね?
319 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:42:20 ] いや、Win32ならLocal系よりHeap系だろ
320 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:55:12 ] >>316 >if ( ( str + i ) == NULL ) この行で、iに2以上の値が入った時点でアウト。 確保されていない領域を参照することになる。 NULLとの比較も無意味。 初期化されていない領域はゴミが入っているのでNULLかどうかなんてわからない。
321 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:06:29 ] そもそも参照できてない、それ。
322 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:07:09 ] >>318 LocalAlloc, HeapAlloc, GlobalAlloc って名前が違うだけでは無いんですね。 知りませんでした。 >>319 Heap系はよけいなオブジェクトが必要になるのであまり使いたくないです・・・ そこが肝という気もしますが
323 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:09:06 ] >>320 それが出来ないから質問きたんだろ 出来るなら、既に解決してるじゃんw そもそも >この行で、iに2以上の値が入った時点でアウト。 これを判定したいって言う質問なのに、そのレスはナンセンス過ぎる
324 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:06:43 ] >>320 >この行で、iに2以上の値が入った時点でアウト。 単なるポインタに数字を足した値を見ただけで何でアウトなんだ? *つけて参照してるならともかく・・・
325 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:14:37 ] >>322 ヒープハンドルは常にGetProcessHeap()で得たものを使うことにすれば、 Local/Globalと比べ、新たな面倒さが生まれることはないと思うぞ。
326 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:39:43 ] そもそもLocalとGlobalってかなり前にMSが使うのやめてっていってなかった?
327 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:27:02 ] もうCoTaskMemAllocでいいよ
328 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:59:11 ] >>324 配列要素数を超えたところを指すようにポインタに足し算すると未定義動作になる。 C99 6.5.6 p8 より( C++ では 5.7 p5 に同じ文面がある) > If both the pointer operand and the result point to elements of the same array object, or one past the last element > of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined. この場合だと要素数 2 の char 配列とみなせるから、 2 までは大丈夫で 3 以上でアウトね。
329 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 02:05:54 ] ポインタは*つけて参照しなければ、単なる数字だよ。 しかも、ポインタ変数に代入したわけでもなく、単に+3をやってifで比較しただけでしょ? その文面は *(str+i)のように参照した場合や、str+=iのように加算を行った場合であって str+iでは、何の意味もないかと。 試してみれば分かると思うけど char *str; に if( (str+5000)!=NULL) ってやろうと if( (str+50000000)!=NULL) ってやろうと、エラーは出るはず無いよ。
330 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 02:23:13 ] >>329 > *(str+i)のように参照した場合や、str+=iのように加算を行った場合であって そんなことどこにも書いてない。 p + n という式自体について述べた部分だよ。 * で参照したり = で代入したりする前の話。
331 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 02:43:49 ] なんで「一つ後ろ」みたいな表現するんだろう 一瞬、「じゃあふたつ後ろならいいのかよ」とか思ってしまったよ
332 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 10:42:18 ] >>330 仕様の読み方わかってないだろ。 プログラムの勉強からはじめたほうがいいね。
333 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 10:57:22 ] >>332 どこをどう読んだら >329 みたいな解釈になるのか教えてください。
334 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 11:24:57 ] >>328 加減演算子 ポインタオペランド及びその結果の両方が同じ配列オブジェクトの要素、又は 配列オブジェクトの最後の要素を一つ越えたところを指している場合、演算に よって、オーバーフローを生じてはならない。それ以外の場合、動作は未定義 とする。 あくまで未定義といっているのだから、規格上は何でもあり得る、つまり 実装依存ということになるね。>>329 の言っている、エラーが出ない とか参照しなければ単なる数字になるということは、多くの実装がそう なっているだけであって、str+5000の加算演算で仮にクラッシュする実装が あっても、それは規格には従っていることになる。結局、この場合、 動作は未定義だから実装まかせ。 なので、厳密には>>328 の意見が正しいと思われる。
335 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 13:04:40 ] 実際、タイトなメモリ空間モデルを持っている実装では、割と容易に起こり得る。 例えばint array[2]に対してarrayが0xfff0にアサインされているかもしれない。 ポインタもintも16bitなら、array + 4が0になってしまい、NULLと区別できなくなってしまう。 # 流石に即クラッシュはしないだろうけどね。
336 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 14:02:36 ] 境界の問題はポインタ特有の話じゃありませんね
337 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 17:44:01 ] それがどうかしましたか?
338 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 17:57:27 ] つまり見当違い
339 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:16:43 ] どこが? そもそも誰か、境界の話なんてしているんですか?
340 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:31:33 ] >>336 が場違いな件について
341 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/11/15(木) 22:09:24 ] >>311 *** For your reference *** Windows. _heapwalk (CRT) msdn2.microsoft.com/en-us/library/h0c183dk (VS.80).aspx Linux 2.4x src\drivers\char\drm\sis_ds.c "void mmDumpMemInfo( memHeap_t *mmInit )"