1 名前:デフォルトの名無しさん [2007/06/03(日) 22:33:55 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です。 【前スレ】 【初心者歓迎】C/C++室 Ver.37【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1178432985/l50 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
596 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:22:02 ] 俺はC++からJavaScript+HTMLをやったんだが。 C#には簡単に移行出来たな。
597 名前:W [2007/06/16(土) 20:25:34 ] JavaScript+HTML
598 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:30:12 ] CやC++で a = b = c = d; としたら、段階的に処理を書くと、 a = b = (c = d); //まずcにdが代入される a = (b = c) = d; //次にbにcが代入される (a = b) = c = d; //最後にaにbが代入される と言うことでいいのでしょうか? 詳しく教えてほしいです
599 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:34:46 ] a = (b = (c = d)) c=dが行われ,その値がb=でbに代入され,その値がa=でaに代入される
600 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:40:25 ] なるほど! わかりやすい説明をありがとうございます!!
601 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:43:43 ] HTMLってプログラミング言語?
602 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:46:19 ] ・変数がない ・ループ、条件分岐が書けない ・関数も書けない 修飾言語ではあるが、プログラム言語ではないかな
603 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:53:07 ] HTMLはマークアップ言語です。
604 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:01:38 ] >>602-603 トンです。 上でプログラミング言語と並んで書かれてたから なんかHTMLって特異な言語だけど仲間なのかなぁ…と思ったら コンピュータ言語⊃プログラミング言語,マークアップ言語,・・・,なんですね。
605 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:03:45 ] プリコンパイル済みヘッダーを作ったですが デバッグモードではビルドできるのに、リリースにすると error LNK2005: *** は既に ***.obj で定義されています。 というエラーが全部のファイルで発生してしまいます。 これは何故なんでしょうか? 環境はVS2005です
606 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:28:39 ] >>605 エラーです
607 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:32:24 ] 特異な言語といえばSQLもそうだな。 一応Languageと名前についてるけど、 これをプログラミング言語と呼ぶのは ちょっと抵抗ある。
608 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:49:46 ] ストアドとか書けば解るが、あれは十分にプログラム言語としての特徴を備えているような気が
609 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:51:48 ] SQLに制御構造をつけたのがストアドじゃないかね
610 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:58:45 ] HTMLだってLanguageと名前についてるだろ SQLはプログラミング言語じゃなくて、データベース言語だろ
611 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:59:39 ] Languageは「言語」であって「プログラミング言語」ではないからな。
612 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:07:19 ] >>594 for(A; B; C) { D } で、 A を処理して、B を判定して、D を実行して、C を実行して、また B を判定して・・・ とか考えるのは効率が悪い。 グルングルンと実行されるみたいな流れを もっとグラフィカルに頭に思い浮かべるのがコツ。 一旦処理の流れを線でつないで紙に書いて、 それを意識するもんだ。
613 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:08:18 ] HTML はプログラミング言語じゃなくてマークアップ言語。 TeX あたりだと単なるマークアップ言語と言い切るのは微妙だがな。
614 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:56:37 ] SQLがチューリング完全でないことは明白。
615 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 00:22:00 ] 何言ってるの?
616 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 08:02:03 ] わからないなら調べてから聞けよ
617 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 08:07:53 ] あ〜い、とぅいまてぇ〜ん♪
618 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 09:34:26 ] >>602 IEに限って言えば条件がIEのバージョンに限定されるけど条件分岐が使えるっぽ
619 名前:デフォルトの名無しさん [2007/06/17(日) 12:43:27 ] 親クラスのprotectedな変数が、public継承した子クラスでは publicにならずにprotectedなままなのは何故ですか? 親クラスのpublicな変数が、protected継承した子クラスでは protectedになるのに。 publicよりもprotectedの方が強いと理解しておけばよいのでしょうか
620 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:46:05 ] そう理解しておけばおk そしてプライベートが最強と
621 名前:デフォルトの名無しさん [2007/06/17(日) 12:55:24 ] >>620 ありがとうございました。 そう理解しときます。
622 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 14:57:34 ] =演算子をオーバーロードするときにthisポインタを戻り値にしてるんですが、 thisポインタを戻り値にしない書き方ってありますか?
623 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 14:58:53 ] ありますよ
624 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:01:58 ] それは例えばどういった書き方でしょうか?
625 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:03:17 ] >>624 void operator = (...
626 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:04:43 ] a = b + c + d;の処理の流れって、 a = (b + c) + d; //まずbにcを加算 a = ((b + c) + d); //次にb+cの値にdを加算 最後に aに代入という流れで理解してよいのでしょうか? 詳しく教えてください。
627 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:06:25 ] デバッグ
628 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:06:57 ] デバッグする環境がありません・・・すいません。
629 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:09:12 ] >>625 マジサンキュー 課題が終わった
630 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:10:36 ] >>626 その例はその理解で正しい。 演算の順序は、演算子の優先順位と結合規則によって決まってる。
631 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:13:46 ] いや待て、a = b + (c + d)という解釈をしているかも知らん。
632 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:28:39 ] c+dを先にやるなら+をオーバーロードしたときに参照を渡せないから b+cが先だろ
633 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 16:40:39 ] >>630 しかし、順序が変更されても結果に影響が出ない範囲でなら 最適化で順序が入れ替えられる可能性はあるな。 ま、結果に影響が出る場合(そういう風にオーバーロードした場合等)は そういうことは絶対にないが(コンパイラにバグでもない限り)。
634 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 16:56:56 ] >>633 コンパイラのバグを前提にして「可能性はある」なんて言うことに何の意味があるのかね?
635 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:08:24 ] ??? 誰もそんな事言ってないぞ?
636 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:14:59 ] 結果に影響が出ない範囲で入れ替えられても気にする必要は無いな。
637 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:18:51 ] a = b() + c() + d(); で、b, c, d の呼び出される順番は未定義だっけ? 結合順と、各項の評価順はまた別の話だよな。
638 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:37:07 ] fgetsの使い方で fgets(buf, sizeof(buf), stdin); のような常套句がありますが、これは sizeof(char) が1であることが 前提になっていますよね。もし sizeof(char) が2だったら、読み込む文字数が 想定した数の2倍になってしまうと思うのですが。 こういった書き方は問題ないのでしょうか。
639 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:40:16 ] >>638 sizeof(char)は常に1
640 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:41:57 ] >>638 sizeof(char)は絶対に1だから安心しる。 ただ関数によっては、バッファのバイト数を与えるのか文字列長を与えるのか 分かりにくい場合があるから、wchar_tを使ってるとちょっと困ることがある。
641 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:43:56 ] charが1バイトじゃなくて1バイトの定義がchar?
642 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:44:21 ] charは常に1バイト
643 名前:638 mailto:sage [2007/06/17(日) 18:47:09 ] レスありがとうございます。 charが常に1バイトというのは、規格で決まっているのですか?
644 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:48:49 ] >>643 決まってる。 ただ、「buf の型が char である」ということに依存しているから、 ここを変更したいと思った場合に変更を要するコードである事は確かだな。
645 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:50:14 ] 誤解があるといけないから念のために言うけど、 char が 1 バイトというのは決まってるが、 1 バイトが 8 ビットである保証はない。 1 バイトが 9 ビットの環境もある。
646 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:51:29 ] 1バイトのビット数を取得するマクロってありますか?
647 名前:638 mailto:sage [2007/06/17(日) 18:51:48 ] 皆さんありがとうございました。勉強になりました。
648 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:57:42 ] アルバイトのヒト数を取得するユニクロってありますか?
649 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 19:19:40 ] >>646 CHAR_BIT
650 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 20:31:59 ] >>637 未定義。iccだとご丁寧に「想定外の呼び出し順序になる可能性がある」と指摘してくれる。
651 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:06:51 ] たまにはlimits.hも眺めよう
652 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:08:10 ] float.h も眺めようぜ
653 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:10:15 ] 眺めすぎて惚れるなよ
654 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:21:25 ] やだ・・///
655 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:22:24 ] 構造体やクラスを関数内で定義すること、 つまり、以下のようなことがしたいのですが これは規格でできることが保証されていますか? void hoge() { struct hage { ... }; ... }
656 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:23:44 ] >>655 C89 の頃から余裕で使える。
657 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:26:15 ] ちなみに関数内で関数は定義できません
658 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:33:03 ] >>656 ちゃんと規格で決まってるんですか。 知りませんでした。 どうも、ありがとうございます。 >>657 構造体やクラスの静的関数で代用するのが常套句になってますね。
659 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:44:49 ] GCC の拡張でよければ関数内関数は使えるんだけどな。確か。
660 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 22:29:53 ] 関数内クラスをテンプレート引数に出来たらなぁ と思うことがある
661 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:05:55 ] charのバイト数の件で便乗質問。 shortって俺の使ってる環境では2byteなんだけど、これって決まってるんですか? 決まってないのなら確実に2byteの型は有りますか? また確実に4byteの型はありますか?
662 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:07:51 ] longは32bit以上というのはK&Rに書かれていた気がする。 というか規格原理主義者によると、1バイトが何ビットかも決められていないとか
663 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:17:52 ] >>661 #include <stdint.h> で int16_t と int32_t でおk。
664 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:20:56 ] >>661 sizeof (short) == 2と規格で定まっているわけではない でも規格の最大値・最小値の規定から少なくとも16ビット以上あるということは導ける 同様に(662も書いてあるように)、longが少なくとも32ビットあるということも導ける 2バイトの方が欲しければ、C99なら<stdint.h>のint16_tやint_least16_tが使える 前者がぴったし16ビットの型(対応する型があれば用意されている) 後者は少なくとも16ビットの型(絶対に用意されている) 後者だけ必須なのは1バイトが8ビットでない環境の存在を考えれば納得 C++に今のところ<stdint.h>は、存在しないから <boost/integer.hpp>や<boost/cstdint.hpp>で代用するくらいしかない
665 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:32:47 ] C/C++で処理系依存なのは、もう諦めるしかないんじゃないか?
666 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:48:09 ] 必要以上に移植性を求めるのは不毛。 必要以上に移植性を失うのも愚かしいこと。
667 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:53:10 ] 俺ッち、__propertyとか__finallyとか好きな訳だけど、使っちゃって委員会?^^
668 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:56:15 ] どうせ他の部分も環境依存しまくりなんだろ? どんどん使っちゃえYO!
669 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:04:53 ] >>667 __closureも活用してもっと便利に!
670 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:13:58 ] 勉強になるな。
671 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:19:27 ] #include <stdint.h> VC6だと「そんなヘッダ見つからねーよ。死ねボケ。」って言われてしまった OTL。
672 名前:デフォルトの名無しさん [2007/06/18(月) 00:47:53 ] 質問 void hoge() { 何かの処理 #ifdef DEBUG printf("Debug %s, nanka); #endif 何かの処理 #ifdef DEBUG printf("Debug %s, nanka); #endif ↑こんな調子で数百行位ある } こういう汚い関数を直したいんだが void DebugPrint(char *str) { #ifdef DEBUG printf("Debug %s, str); #endif } void hoge() { 何かの処理 DebugPrint(nanka); 何かの処理 DebugPrint(nanka); } って感じに直したいんだが、やったら動作変わっちゃう? #ifdefあんま使ったこと無いから教えてくださいな
673 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:48:22 ] そりゃそうだろ
674 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:49:09 ] >>673 すんません 分かり易く解説お願いします
675 名前:673 mailto:sage [2007/06/18(月) 00:49:19 ] >>671 の事ね VC6が出来たのはだいぶ前だから
676 名前:672 mailto:sage [2007/06/18(月) 00:50:28 ] >>675 あ、すんません タイミング良かったんで即レス来たのかと思っちゃいましたw
677 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:57:26 ] #ifdef DEBUG #define DEBUG_PRINT(a) printf("Debug %s, (a)) #else #define DEBUG_PRINT(a) #endif void hoge() { 何かの処理 DEBUG_PRINT(nanka); 何かの処理 DEBUG_PRINT(nanka); } こういうのはよくやるな。 ただ、printfは引数の数が可変だから、引数の数にばらつきがあるとまた別の対策が必要になるが。
678 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:04:08 ] >>677 おぉ、なるほど 後、確認なんですけど、自分が書いた>>672 だと動作変わっちゃうんですよね? 勉強として実際のソース見て動きを理解しろ とか言われてるんですが、こんなソースばっかで 見づらくてしょうがないんで 何とかしたくて・・・ コメントアウトと/*2007/6/19追加バージョン6.2*/等と#ifdef何チャラの嵐です・・・Orz
679 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:05:32 ] 別に動きは変わらんと思うが
680 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:11:32 ] >>679 あ、そうなんですか? ありがとうございます 個人的にはDebugPrintの部分は他から呼びたいので 関数化したいな〜と思ってたんですけど、 #ifdefとかはコンパイル時に読み込まれるとか有ったので 動作変わっちゃうのかと・・・糞初心者ですんません (もう、たまにソース直せと言われるとおっかなビックリっす・・・)
681 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:12:16 ] 失礼、 ×他から ○他からも
682 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:13:48 ] 動きは変わらないが、 後者は関数呼び出しのオーバーヘッドが発生する。
683 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:20:02 ] 関数本体の中にやたらと#ifdefなんかが入ってるのは、 あんまりいいコードとはいえないな。 「見づらくてしょうがない」というその感覚は限りなく正しい。 改善する方法をいろいろ考えるべきだな。
684 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:25:43 ] >>682 すいません そのオーバーヘッドって遅くなるって事ですよね? どの程度遅くなりますか? >>683 ありがとうございます パワハラ上司なんで聞くに聞けなくて ここでたまに質問してます 見やすくしろって教えてくれたのもこのスレです
685 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:39:54 ] 関数を呼び出すという処理は、それ自体スタック操作や プログラムカウンタの移動などの処理が行われる。 だから、>>672 のように関数を呼ぶ形にすると、その分オーバーヘッドが発生する。 一方で>>677 の方法だと、不要なときには関数呼び出し自体がなくなるので、 そういう心配がない。この方法が好んで使われる所以。 ただ実際は、よほどタイミングがシビアだったり、デバッグプリントがめちゃくちゃ多かった りしなければたいしたオーバーヘッドではないので問題にはならない。 でも、リリースバージョンのプログラムの中に、不要な関数呼び出しが残るのって 美しくないとは思わないかい?
686 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:47:04 ] >>685 なるほど、詳しい解説ありがとうございます せっかく用意したDebugPrintなのに リリース等の時は実際は使わないのに その度にDebugPrintの文だけより道、遠回りしちゃうって事ですね 確かに綺麗じゃないですね
687 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:56:30 ] 可変長引数マクロを使えるコンパイラならこんなこともできる #if DEBUG #define DebugPrint(...) fprintf(stderr, "\nDebugPrint : File %s - Line %d\n", __FILE__, __LINE__),fprintf(stderr, __VA_ARGS__) #else #define DebugPrint(...) #endif
688 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:01:41 ] リリース版ではインライン関数にして、 コンパイラの最適化に期待する手もある。
689 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:02:11 ] /* 古いコンパイラで使える技 */ #if DEBUG #define DebugPrint(args) printf args #else #define DebugPrint(args) #endif /* 使い方(一回余計に括弧で括らないといけないのが欠点だが) */ DebugPrint(("%d\n", 1234));
690 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:03:19 ] 古くなくてもできることないか?
691 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:03:47 ] >>687 ,>>689 おぉ、凄いですね 色々ご教授ありがとうございます >>688 もし良ければその方法も教えて頂けないでしょうか・・・
692 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:16:33 ] 1. インライン関数の定義を別ファイルに分ける 2. inline を INLINE マクロに置き換える INLINE マクロの定義は以下の通り(これは自分で定義する) #ifdef NDEBUG #define INLINE inline #else #define INLINE #endif 3. リリース版の場合はヘッダファイルでインクルードする #ifdef NDEBUG #include "***.***" #endif 4. デバッグ版の場合はソースファイルでインクルードする #ifndef NDEBUG #include "***.***" #endif
693 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:16:49 ] #if DEBUG #define DebugPrint printf #else #define DebugPrint (int)sizeof #endif
694 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:17:09 ] C++なら、こんなことできるお class DebugPrinter { DebugPrinter(const char *filename, int line) {...} void out(const char *format, ...) {...} }; #if DEBUG #define DebugPrint DebugPrinter(__FILE__, __LINE__).out #else #define DebugPrint #endif
695 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:21:38 ] >>694 リリースでエラーにならないか?
696 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:30:28 ] >>695 エラーにはならないがデバッグ用のコードが完全には消えないという問題がある。