1 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:25:51 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.63【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1231499251/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
205 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 05:09:10 ] とても基本的なことなのですが、 符号なし整数の変数で与えられた数 N - 1 から 0 まで順番に処理をするループは、どう書くのが一般的ですか。 for (size_t i = N - 1; i >= 0; --i) だとダメですよね。 自分が考えた書き方は、 const size_t N = ...; for (size_t i = N; i > 0; --i) hoge(i - 1); for (size_t i = 0; i < N; ++i) hoge(N - i - 1); for (size_t i = N - 1; i != ~0; --i) hoge(i); ですが、どれも使われるのでしょうか。
206 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 05:13:20 ] size_t i = N; do { --i; hoge(i); } while (i > 0);
207 名前:206 mailto:sage [2009/02/28(土) 05:14:35 ] ああ、書いてから気づいたけど >>206 は N が初めから 0 だったらダメだね
208 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 05:36:00 ] T i = M; //M = N - 1ということで do { hoge(i); } while (i-- != 0); これだと、MがT型の最大値でも対応できるはず。
209 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 06:46:33 ] >>205 普通に for (size_t i = N - 1; i >= 0; --i) を使ってるけど size_tを使う理由が分からない
210 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 08:29:35 ] >>209 メモリのサイズを意味するときはsize_tを使うようにしてる 64ビット環境だとunsigned long longになるのかな
211 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 11:52:40 ] >>209 > i >= 0; ↑は符合無しだと常に真だろ。
212 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 11:53:48 ] 何か問題でも?
213 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 11:54:56 ] for (i = 0; i > N; ++i) {;} // ループ中に前後の値が影響しない場合。 if (N > 0) for (i = N - 1; i >= 0; --i) {;} // ループ中に前後の値が関わってくる場合。 while 系をカウントループに使うのは愚策と考える。
214 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:02:05 ] >>212 やめられない、とまらない
215 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:33:44 ] while(N-->0)は普通に使うだろ --が矢印に見えるから「Nを0にするまで」って視覚的にわかりやすいじゃん
216 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:39:17 ] その考えはなかった
217 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:43:37 ] >>215 そんな餌にクマー まあでも>>205 の要求にあってるしシンプルでわかりやすいな
218 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 13:16:49 ] >>215 ああ、意外と面白い使い方かも・・・ 視覚的にわかり易く書かない場合は >0は書かなくても大丈夫か
219 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:09:16 ] 有名だろ、それ
220 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:16:21 ] ぶっちゃけ初めて見た
221 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:20:36 ] ソース自体は見た事があるような気もするけど、考え方は初めて見た。
222 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 16:14:42 ] 減少していくのに減少していく方向が空いてるのはなんとなく怖いなぁ
223 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:18:11 ] >>215 while(N-->0) って見た目が素敵だな
224 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:23:55 ] AAのプログラム言語とかなら、見た目で分かりやすいかもな・・・
225 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:39:46 ] befungeのことですね!!
226 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:41:03 ] 面白そうだけど絶対コーディングしにくいな ほぼ記号だろw
227 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 20:31:33 ] さすがショートコーディングスレ。 ためにな・・・って、あれ?
228 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:45:19 ] 繰り返し処理のことを何ていいますか? 専門的にお願いします。
229 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:49:47 ] 反復処理とか繰り返し処理とか
230 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:00:35 ] 繰り返し処理のことを何ていいますか? 専門的にお願いします。
231 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:01:14 ] 反復処理とか繰り返し処理とか
232 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:38:29 ] >>210 メモリのサイズを入れる型ってsize_t以外になんかなかった?
233 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:50:58 ] 繰り返し処理のことを何ていいますか? 専門的にお願いします。
234 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:55:57 ] ループ処理じゃね?w 反復も繰り返しだろうけど、お前は違い分からないだろう
235 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:26:00 ] ぶっちゃけC/C++の話じゃないからスレ違い
236 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:29:11 ] >>234 >>231 >>229 もうちょっとかっこいい言い方あるだろ それを教えろ
237 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:31:09 ] >>236 死ねハゲ
238 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:31:47 ] 反復処理とか繰り返し処理とか
239 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:47:20 ] リピート
240 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:14:30 ] >>228-231 見事な繰り返し処理 >>232 は空気嫁
241 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:19:39 ] >>232 ssize_tとか、でもCでもC++でも標準ではないけど。
242 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:24:27 ] >>232 ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが
243 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:34:14 ] >>241 >>242 そうだな。size_tでよかった。
244 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 05:50:11 ] まだ初心者なのですが、batファイルをC++builder6で ボタンを押したら実行するようにしたいので ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW); と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL
245 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:13:52 ] >>244 何故、どう巧くいかないのか書かないのですか?
246 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:28:56 ] 実行はされるのですが(コマンドプロントが一瞬表示される) バッチファイルの中身自体が実行されません;;
247 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:39:59 ] batの最後に pause 入れとけ
248 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:00:46 ] >>247 ありがとうございます。 やってみたところ指定されたパスがありませんとのことでした。 普通にbatファイルを起動すると何も問題がないのですが・・・ 原因などわからないでしょうか?
249 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:08:14 ] ファイルパスをちゃんと指定すればいいじゃん・・・
250 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:12:19 ] できました! こんな時間に、質問に答えてくださりありがとうございました 大変助かりました。
251 名前:デフォルトの名無しさん [2009/03/03(火) 18:34:32 ] 以下のような感じで「*」の前後にスペースが 入っている場合もポインタの宣言なんでしょうか? static unsigned int * ADDR; スペースが、後だけのもは参考書にも紹介されていますが 前後両方ともスペースのものは見つかりませんでした。 よろしくお願いいたします。
252 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 19:01:49 ] vector<string> * const (&u)[buf]; // こんな感じですか?
253 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 19:06:04 ] >>251 おんなじ。空白類がいくらあろうと関係ない。
254 名前:デフォルトの名無しさん [2009/03/03(火) 19:47:28 ] >>252 static unsigned int * ADDR; 全くこのままのコードです。 >>253 ご回答有難う御座いました。 もやもやしていましたが、これですっきりしました。
255 名前:デフォルトの名無しさん [2009/03/04(水) 03:11:45 ] VC++9の質問です。Unicode環境で Void Func(LPCSTR pMsg); みたいな関数があって、ここに文字列を渡すのですが、 Func("xxx"); というように普通に書くと問題ないのですが、 Func(_T("xxx")); とやると、 const wchar_t[3] から LPCSTRに変換できません、みたいなエラーが出ます。 全ての文字列を_T("") で括ればいいのかと思ってたのですが、違うのでしょうか?
256 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 03:14:42 ] >>255 _Tで括るのはLPC"T"STRのとき。 LPCSTRはconst char*のtypedefだから_Tは要らない。
257 名前:デフォルトの名無しさん [2009/03/04(水) 03:25:58 ] >>256 なるほど、ありがとうございました。
258 名前:デフォルトの名無しさん [2009/03/04(水) 13:36:24 ] 初歩的過ぎてすいませんが... すでに宣言してある配列の配列数を求めて それと同じ配列数の配列を宣言するには どうすればいいですか? よろしくお願いします。
259 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:39:38 ] >>258 配列数はプログラム書いた人しか知らないから無理 それができたら配列のオーバーフロー管理も楽なんだけど
260 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:44:40 ] >>258 状況がよくわからん
261 名前:259 mailto:sage [2009/03/04(水) 13:44:42 ] sizeof(配列) / sizeof(型) でいいか マクロで定義して同じマクロ使うとか
262 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:49:06 ] char a[]={10, 10, 10}; char b[sizeof(a)]; int c[(sizeof(a)-1+sizeof(int))/sizeof(int)]
263 名前:258 mailto:sage [2009/03/04(水) 13:53:28 ] すいません言葉が足りなすぎました。。 int a[]= {1,2,...}; size=sizeof(a)/sizeof(a[0]); int b[size]; として同じ配列数の新しい配列を宣言しようとしてもできません。
264 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:56:39 ] C++ なら const int size Cなら int b[sizeof(a)]
265 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:57:14 ] >>263 size の型は何か 言語をいえ言語を C か C++どっちだ あとCならC89かC99なのか
266 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:57:33 ] >>263 コンパイラも
267 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 14:03:12 ] >>265 C++です。 size の型はintです >>266 gccです。
268 名前:258 mailto:sage [2009/03/04(水) 14:08:43 ] const int size = sizeof(a)/sizeof(a[0]); int b[size]; として宣言できました。 ありがとうございました。
269 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 15:03:27 ] 配列の要素に変数が使える規格って無かったっけ
270 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 15:30:51 ] >>269 C99だろ
271 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 17:19:24 ] 連立方程式のを渡したら戻ってくる関数ってありますか?
272 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 17:20:51 ] >>271 標準にはない 標準じゃなくていいならある
273 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 09:53:35 ] assert()と_ASSERT()ってなにか違いがあるのでしょうか?
274 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 10:11:11 ] assertはC/C++標準 結果としてabort() _ASSERTはVC++独自 _CrtSetReportMode等で動作の調整が可能
275 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:14:15 ] メンバ関数のポインタの宣言はCxxx::*funcなのに 取得はCxxx::&funcでなく&Cxxx::funcなの? &がなんで宣言の時の*の位置より移動するの?
276 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:40:47 ] >>275 発想としては、Cxxx::という修飾が メンバへのポインタ型では*にかかっていて、 メンバへのポインタを得るときには、メンバ名funcにかかっている ということのようだ。
277 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:51:32 ] 俺としては逆なんだが なんでCxxx::&funcなの? どこのクラスのメンバ関数のアドレスか分からんが
278 名前:デフォルトの名無しさん [2009/03/05(木) 20:41:28 ] 大変だー さっぱりわからん
279 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:43:44 ] >>278 何が分からないんだかさっぱり分からないぞ
280 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:44:43 ] >>275 単に文法的な曖昧さを除いた結果そうなっただけ。 class A { public: static void (*A::func)(); }; としてしまうと、static メンバ変数の実体定義がこうなってしまう。 void (*A::A::func)(); どっちがどっちの A:: やら分からん。
281 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 21:16:46 ] もうクラスのメンバ関数のポインタは無しで
282 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:09:09 ] 9割くらいBoostやTR1のbind(暗黙のmem_fun)と一緒にしか使わない。
283 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:41:19 ] delegate パターンで使うね
284 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:31:13 ] じゃあdeleteパターンで
285 名前:276 mailto:sage [2009/03/06(金) 19:49:52 ] >>276 , >>280 すみません、レス読んでも、それが 取得はCxxx::&funcでなく&Cxxx::funcなの? の回答になるのか、さっぱり理解できないですが>< あと、&Cxxx::funcは&(Cxxx::func)としては良くないと本に書いてあるんですが なんで良くないんですか?
286 名前:デフォルトの名無しさん [2009/03/06(金) 20:12:15 ] なんか抽象クラスをインスタンス化できないらしいのですがどうすればいいですか? 派生クラスは無いのですが その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません
287 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:16:31 ] >>286 まずは、その抽象クラスへのポインタ型か参照型を引数にしている?
288 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:24:22 ] >>287 ポインタ型を宣言してます、いろいろ上手くいかなかったのでポインタで宣言、元の抽象型で宣言、アドレスをポインタ型に代入→引数に としてます、エラーメッセージはメンバが抽象型です、宣言を確認してください、です
289 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:27:48 ] >>286 派生クラスがない、ではなく、派生クラスは自分で作れということでは?
290 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:29:59 ] ああ、そうかもしれない
291 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:43:25 ] "派生クラスの無い抽象クラスが型な引数をとる関数" これ、抽象クラスのインターフェイスを使って新しいクラスを作れということ
292 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:56:18 ] 覚えておきます、ありがとうございました
293 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:13:20 ] >>285 普通の関数でも&(func)はよくないだろ? そういうこと
294 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:51:58 ] >>293 普通の関数で、&funcを&(func)にするとコンパイルエラーにでもなるのか? >>280 のvoid (*A::func)(); は何を宣言しているんだ? 本人はメンバー関数へのポインタ宣言のつもりなのかな これだと、俺俺的にはfuncはスコープAにあり、引数void型で戻り型voidの関数を指すポインタの宣言してると解釈するんだが つまり、funcは引数void型で戻り型voidの関数ならA::以外のでも受付OK そうなると、funcはA::以外のでも受付OKなのにメンバー関数へのポインタ宣言ですって言えないよな そうなるから、*Cxx::じゃなく、Cxx::*をメンバーへのポインタ宣言としているだろ 俺俺解釈間違ってる?
295 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 23:05:45 ] >>294 関数は式中に現れると関数ポインタに暗黙変換される だから(func)はfunc関数へのポインタで、&(func)はそのポインタのアドレスになる つまり関数ポインタへのポインタになる そして(func)は右辺値だから、そんなものを使うとろくなことにならない 一方&funcは、関数が単項&演算子のオペランドの場合は関数ポインタに変換されないと特別に決まってるから 無事にfuncへのポインタが取れる と、思ってたんだがよくよく読むと()の中身が関数の場合は特別に()を外しても関数になると決まっているらしい だから&funcも&(func)も全く一緒だ すまん
296 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 23:59:08 ] グローバル変数についての質問です。 C言語の参考書などには「グローバル変数は初期化をしなくてもはじめから0が入る」 と書かれていたので今まで特に初期化処理を追加せずに書いてきたのですが、 プログラムの途中でグローバル変数を初期化(中身を全て0にする)処理を入れる必要が出たので //EDIT_DATAは構造体配列で事前にDATA EDIT_DATA[16][64][34][64]と宣言しています。 memset(EDIT_DATA, 0, sizeof(EDIT_DATA)); という処理を加えたところ途端にメモリの使用量が跳ね上がりました。 最初から0が入っているのであれば、新たに0を入れ直してもメモリの使用量はかわらないと思ったのですが、どうやら違うようなので いったい初期化処理を行っていない宣言した直後のグローバル変数と memsetを利用し初期化処理を行ったグローバル変数では何が違うのかを教えて頂きたいです。
297 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 00:16:13 ] おまいの使ってるOSが 書き込みが起こるまでは非初期化データ領域(BSS等と呼ばれる)には アドレスを割り当てるだけで物理メモリは割り当てない仕様になっているから。
298 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 01:38:45 ] >>297 私の知識不足で非初期化データ領域や物理メモリと言われても、ぱっと理解できなかったのですが 以下のような考えでよいのでしょうか? 私の使っているOS(WinsowsXP)の場合 ・関数内で宣言するローカル変数の場合 void main(){ int a; //この時点で非初期化データ領域に変数aの存在が知らされる。 printf("%d\n", a); //この時点では値を代入したわけではないので何が表示されるか分からない(物理メモリにはaが存在しないのでメモリの使用量は増えない) a = 0; //値が代入された(これによりaには0という値が存在するということになり物理メモリに割り当てられメモリの使用量が増える) printf("%d\n", a); //0が表示される(物理メモリにはaが存在する) } ・関数外で宣言するグローバル変数の場合 int b; //この時点で非初期化データ領域に変数bの存在が知らされる。 void main(){ printf("%d\n", b); //0が表示される(物理メモリに割り当てられているわけではないがグローバル変数なので特別にbは0として扱える) b = 0; //値が代入された(これによりbには0の値が存在するということになり物理メモリに割り当てられメモリの使用量が増える) printf("%d\n", b); //0が表示される(物理メモリにはbが存在する) }
299 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 06:38:13 ] >298 とりあえず環境依存の話だというのは認識しておいてくれ。 まずローカル変数とグローバル変数では確保されるメモリ領域が異なる。 ローカル変数は BSS には確保されない(スタックに確保される)。 非初期化データ領域への割り当てはコンパイラ、リンカによって行われるので実行時に 「知らされる」という表現はおかしい。 物理メモリの割り当ては OS、ローダが行う。 恐らく、書き込みじゃなくて読み込みでも物理メモリへの割り当ては発生すると思われる。 なので memset じゃなくてループで全領域に対してアクセスしてもメモリ使用量は増えないか? 「仮想記憶」でぐぐるといいと思う。
300 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 08:00:03 ] void fn(int x){〜;}; void fn_nul(int){}; if(a){ fn(a);} と static void (*const_f[2])(int) = {fn, fn_nul}; f[(a>>3 )&0x1](a); どっちが効率いいかな?
301 名前:300 訂正 mailto:sage [2009/03/08(日) 08:01:30 ] static void (*const _f[2])(int) = {fn, fn_nul}; _f[(a>>3 )&0x1](a);
302 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 08:08:17 ] >>299 やはり知識不足で具体的には理解できておらず、考えを上手く文字にまとめる事ができませんでしたが ぐぐりつつ調べてみた結果、何となくではありますがイメージすることができました。 仰るとおりfor文でアクセスした結果もmemsetした際と同じ結果になりました。 もう少し時間をかけてじっくりと理解を深めていこうかと思います。 ありがとうございました。
303 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 10:23:48 ] CPUアーキテクチャ側から勉強するといいかもね。 俺は「はじめて読む486」という本が参考になった。
304 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 10:46:03 ] >>301 下の方が効率いい。 ただし、何かコメントしておかないと 可読性が低い。
305 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:01:16 ] >>303 CPUじゃなくOS