【初心者歓迎】C/C++室 Ver.102【環境依存OK】
: デフォルトの名無しさん [] 2017/11/04(土) 16:33:35.07:NYxCuvMY エスケープシーケンスやWin32APIなどの環境依存なものもOK そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 ttp://codepad.org/ ttps://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 ttps://mevius.5ch.net/test/read.cgi/tech/1500329247/ : デフォルトの名無しさん [] 2017/11/05(日) 17:44:45.44:rSDVGL6P 乙 : デフォルトの名無しさん [sage] 2017/11/05(日) 20:58:13.61:80sy7ZoV unsigned long strtoulxn( char const* psz, size_t n ) { unsigned long v; for ( v = 0; *psz && n--; psz++ ) { if ( ! isdigit( *psz ) ) { continue; } v = 10 * v + ( *psz - '0' ); } return v; } : デフォルトの名無しさん [sage] 2017/11/05(日) 21:07:57.69:i5zx7IeJ これは酷いクソコード : デフォルトの名無しさん [sage] 2017/11/05(日) 22:25:14.64:NxjjuMpf 実行速度 見やすさ 汎用性 コードサイズ どれかひとつ位は満たさないと : デフォルトの名無しさん [sage] 2017/11/05(日) 22:42:14.76:3uuR82Hq まあそう言うごたくを言うのは一つぐらいは満たしたコードを書いてからでないとね : デフォルトの名無しさん [sage] 2017/11/06(月) 08:01:53.31:uTTN+kxR の関数は前のスレッドの終わりに出た "12 34 56"(NUL終端なし8byte) を数値の 123456 に変換、 てお題の答案かな。 …と思ったけど、NUL終端文字列が仮定されてるね。 どういう流れで投稿されたんだろう? : デフォルトの名無しさん [sage] 2017/11/06(月) 08:45:24.00:H37qYFYx size_t n で文字数を受けとるからNUL終端である必要は無いのでは : デフォルトの名無しさん [sage] 2017/11/06(月) 09:40:14.23:L15YU14L if (strncmp(psz, "12 34 56", 8) == 0) return 123456; : デフォルトの名無しさん [sage] 2017/11/06(月) 23:29:19.85:OMQOLu1z 相変わらず片山はクソコードしか書かないな ""だと不定値返る数値変換なんてゴミ : デフォルトの名無しさん [sage] 2017/11/06(月) 23:59:53.41:/gW4r5bt 確かにクソコードだが不定値は返らんぞ : デフォルトの名無しさん [sage] 2017/11/07(火) 04:37:45.33:T7zw8VZw は質問者に対する皮肉のつもりだったんだけど : デフォルトの名無しさん [sage] 2017/11/07(火) 04:47:47.90:T7zw8VZw 意図的に糞コードを書いた事もわからないクソがいるとは こんな簡単なコードの動作も理解できてないようだし : デフォルトの名無しさん [sage] 2017/11/07(火) 06:16:53.55:pkgJL5Ib 初心者歓迎をうたうスレッドで「意図的に『糞コード』を書いた」などと しかも後付けで言われてもあんまり支持できないなぁ。 せめて最初から「お前らこれ改善してみろよ」とかで出してくれ。 「糞コード」とけなすだけで、具体的な問題点の指摘がないってのも寂しいわ。 のソース、引数のpszが""でも、nが0でも妥当な返り値 0 が返るけど、 実は最初に見たとき n==0 で呼ばれた場合に即時終了しないと騙されたわ。 後置デクリメント評価値、ね。 : デフォルトの名無しさん [sage] 2017/11/07(火) 06:53:54.21:+N0q+RZO 誰も騙してないのにクソみたいなプライドが高いな : デフォルトの名無しさん [sage] 2017/11/07(火) 07:08:01.90:aXJpgdu1 出だしから勢いのいいうんこだな 何のスレか忘れてしまいそう : デフォルトの名無しさん [sage] 2017/11/07(火) 08:24:36.39:FXbSqjpU psz = "", n = 0 はいいけど char a[8] で psz = a, n = 8 を渡すと不定値どころか鼻から悪魔の糞コード 仕様も理解せずに余計なことしてバグを作り込む知ったかの典型 : デフォルトの名無しさん [sage] 2017/11/07(火) 08:32:51.44:T7zw8VZw ●パフォーマンス *pszが3回も出てくる 代入して持っておいた方が チープなコンパイラでは速度が変わる isdigit どうせ数字が連続してる前提のコードなんだから 関数を呼ばずに'0' '9'と比較しちゃおう そうのが速い 関数コールは一般的に遅い ●見やすさ forループにいくつも入れない while (n--) か for (size_t i= 0; i < n ; i++) null文字はbreakで ●仕様 null文字とサイズ、両方で停止は仕様としては問題ない パフォーマンス最優先であればそれぞれの特別版を作ればいい 文字数もスペースの位置も固定で パフォーマンス最優先なら ループアンロールするのが一番 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/11/07(火) 10:46:29.90:BS6pey7a 人違い。 : デフォルトの名無しさん [sage] 2017/11/07(火) 12:47:26.90:FXbSqjpU > null文字とサイズ、両方で停止は仕様としては問題ない だからダメだっつーの 知ったかは黙ってろよ 最低限サイズチェックを先にやらないとダメ : デフォルトの名無しさん [sage] 2017/11/07(火) 13:22:08.68:oMcRDniv 仕様として「両方で停止は問題ない」よな? 判別の順番は問題だ 順番が逆 そもそも相談者の仕様がおかしい : デフォルトの名無しさん [sage] 2017/11/07(火) 16:16:20.01:3ER4WXnW 先に大きさでチェックしてから 内容の nul チェックする for ( v = 0; n-- && *psz; psz++ ) { これなら、存在しない指し先のデリファレンスしないし ただ、 ショートサーキット前提の記述をよしとするかどうかはわからん : デフォルトの名無しさん [sage] 2017/11/07(火) 17:07:50.15:Zpoup5pM int str2i( const char *s, size_t n ) { int v = 0; while ( n-- ) { char c = *s++; if ( c == '0' ) break; if ( '0' <= c && c <= '9' ) v = v * 10 + ( c - '0' ); } return v; } : デフォルトの名無しさん [sage] 2017/11/07(火) 17:17:37.91:jEe4bM6y 片山以外に文字化けするブラウザ使ってる奴いるのか あとnull文字って初心者が背伸びしてる感じがして微笑ましいな : デフォルトの名無しさん [sage] 2017/11/07(火) 17:31:27.26:Zpoup5pM ソフト歴35年ですが : デフォルトの名無しさん [sage] 2017/11/07(火) 17:50:48.44:6NdbJPOz PC(プロセスコントローラー)のプログラマーですが何か? ってのは居たが : デフォルトの名無しさん [sage] 2017/11/08(水) 01:37:38.03:MEe7IGP8 isdigitが関数コールな処理系ってあるのか? ここって車輪の再発明好きな人多いのかね : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/11/08(水) 02:06:05.60:TZ5JAUzS isdigitは、ロケールの関係で遅くなる可能性があるはず。256バイトの配列を使うのが最速だ。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/08(水) 03:38:56.63:xvDlz0If ちょっとした演算よりメモリアクセスの方が遅いこともあるよ。 本当に配列が最速? (試したわけではないので配列が最速かもしれない……) : デフォルトの名無しさん [sage] 2017/11/08(水) 06:19:22.66:u4hO2YM0 配列www ないない 仮により速くても : デフォルトの名無しさん [sage] 2017/11/08(水) 06:36:16.44:u4hO2YM0 int str2i( const char *s, size_t n ) { int v = 0; while ( n-- ) { char c = *s++; switch (c){ case '¥0': goto brk; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': v = v * 10 + ( c - '0' ); break; } } brk: return v; } : デフォルトの名無しさん [sage] 2017/11/08(水) 06:36:55.45:u4hO2YM0 これのがまだマシ : デフォルトの名無しさん [sage] 2017/11/08(水) 06:40:10.32:u4hO2YM0 普通にでいい : デフォルトの名無しさん [sage] 2017/11/08(水) 09:37:48.99:kEoXgNLC gotoとかwwww って思った人いるんだろうか : デフォルトの名無しさん [sage] 2017/11/08(水) 10:35:10.40:FLS9cqpb switch である必要ないな : デフォルトの名無しさん [sage] 2017/11/08(水) 11:33:23.57:2d9va5Xh ああ、素人はgoto嫌うよな もちろん必要は無い テーブルよりは色々な面でマシってだけ 普通に if ( '0' <= c && c <= '9' ) で良い 一目で意味がわかるし高速 : デフォルトの名無しさん [sage] 2017/11/08(水) 12:27:45.50:2VVChtYT &&って条件分岐が入るけど、本当に高速? : デフォルトの名無しさん [sage] 2017/11/08(水) 12:44:08.80:FLS9cqpb そこはctypeで判定だね : デフォルトの名無しさん [sage] 2017/11/08(水) 13:01:31.63:2VVChtYT とおもってアセンブリ吐かせてみたら、すごかった。 48引いた上で、符号なしで10未満か判定してるので、 余分な条件分岐してなかった。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/08(水) 13:02:27.97:xvDlz0If && では分岐しなかった。 '0' <= c && c <= '9' を clang で -O3 付きでコンパイルしてみたらこうなった。 addl $-48, %eax cmpl $10, %eax setb %al 賢いな! 直後に分岐するなら結果をレジスタに書き込む必要はないから実質的に二命令だ。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/11/08(水) 13:37:52.71:TZ5JAUzS 俺の知識も時代遅れになったな。シンプル伊豆ベスト。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/08(水) 18:14:28.55:xvDlz0If もっと を高速化できないかと思って考えてみたが、 '0' を引くんじゃなくて 0x30 と xor を取ってから 10 より小さいか比較するっていうのでもいける。 ただ、最近はビット演算が算術命令より速いとも限らないみたいなんだよね〜 : デフォルトの名無しさん [sage] 2017/11/08(水) 18:22:33.84:8jdacwiA まるで昔は速かったかのようだ : はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/08(水) 18:37:11.31:xvDlz0If Z80 ですら足し算と XOR は 1 クロックだったわ。 スマソ : デフォルトの名無しさん [sage] 2017/11/08(水) 18:43:03.66:u4hO2YM0 ん? 8086はビット演算の方が速いぞ : デフォルトの名無しさん [sage] 2017/11/08(水) 18:57:26.39:GPQLPiKH > 仕様として「両方で停止は問題ない」よな? 相談者でないとわからん 途中に'\0'があるケースについては書いてないから > そもそも相談者の仕様がおかしい それはお前が決める話じゃない : デフォルトの名無しさん [sage] 2017/11/08(水) 18:59:47.82:GPQLPiKH > ショートサーキット前提の記述をよしとするかどうかはわからん if(p != 0 && *p != '\0') みたいなのは普通に書かない? : デフォルトの名無しさん [sage] 2017/11/08(水) 19:03:40.31:CwKlKlOQ 俺は書くけど それを"普通"とまで言い切ってしまって良いという自信はない : デフォルトの名無しさん [sage] 2017/11/08(水) 19:14:43.13:u4hO2YM0 わからないならだまってれば 正確な要求仕様がわからない事くらい誰でもわかる 両方でとまる関数は片方で止まる関数の機能を含むので 問題になる場面は普通は考えられない 質問に書いてない、文字列の途中にNULL文字とか いうアホな事を心配しない限り : デフォルトの名無しさん [sage] 2017/11/08(水) 19:18:16.64:u4hO2YM0 全角数字の方がまだ可能性がある : デフォルトの名無しさん [sage] 2017/11/08(水) 19:42:17.13:GPQLPiKH こういう思い込みの激しい奴が要らんバグを作り込むんだよな... : デフォルトの名無しさん [sage] 2017/11/08(水) 19:51:21.87:CyIcapPx isdigit関連で性能測ってみた。 環境: Core i7-2600 / gcc 6.4 (-O2) rund() & 0xff の値で条件分岐して、真ならさらに rand() を呼ぶ、を10億回ループ。 条件式はASCII前提。 数字: 条件式 < int配列ルックアップ < isdigit 英字: 条件式 <= int配列ルックアップ < isalpha 数字英字: int配列ルックアップ < 条件式 < isalnum ロケールの影響か、isalphaなどはisdigitより遅い。 char配列ルックアップはint配列より遅い。 奇妙なことに、配列ルックアップでも、数字だけより、英字も入ってくると遅くなる。なぜだ。 : 52 [sage] 2017/11/08(水) 19:54:52.03:CyIcapPx あ、ごめん、rand() 呼ぶ分、数字 < 英字 < 英数字の順で遅くなるの、当然だった。 : デフォルトの名無しさん [sage] 2017/11/08(水) 20:30:53.41:u4hO2YM0 最速なら前スレのや は演算の依存性が高いので の方が少し速いかな? まあコンパイラや環境依存でしょう x64前提なら、 64bit一気に持ってきて偶数奇数桁に分けて、 LEAで5倍してシフトして足すとか AVXで乗算してから水平演算とか 色々と考えられるけど まあ一応このスレのC言語の範囲で : デフォルトの名無しさん [sage] 2017/11/08(水) 20:49:19.11:QAR8Spec このスレの結論はこれか。 10000*a[0]+10000*a[1]+1000*a[3]+100*a[4]+10*a[6]+a[7]-5333328; これより速くする方法あるのか : デフォルトの名無しさん [sage] 2017/11/08(水) 21:08:26.39:CwKlKlOQ 何時の間に判定せずにすむようになったんだ : デフォルトの名無しさん [sage] 2017/11/08(水) 21:11:25.51:u4hO2YM0 前スレのが質問者だから フォーマットは固定と思われる : デフォルトの名無しさん [sage] 2017/11/08(水) 21:12:49.95:u4hO2YM0 さすがに '0' * 111111 をコンパイル時に計算しないコンパイラは無いと思うので このままで良い気はする 当然こちらの方が意味が分かりやすい : デフォルトの名無しさん [sage] 2017/11/08(水) 21:14:04.15:u4hO2YM0 ( ) を色々とかえて時間を測ってみたけどほとんど同じ やっぱりLEAを多用してる VS2017の64bit Releaseビルドの場合 : デフォルトの名無しさん [sage] 2017/11/08(水) 21:39:10.43:u4hO2YM0 VPMOVZXBD xmm0, a VPMADFWD xmm0, xmm0, [掛け算テーブル] VPHADDD xmm0, xmm0, xmm0 VPHADDD xmm0, xmm0, xmm0 : デフォルトの名無しさん [sage] 2017/11/08(水) 21:40:02.30:u4hO2YM0 AVXが使えるならこれ : デフォルトの名無しさん [sage] 2017/11/08(水) 21:42:47.06:u4hO2YM0 微妙に間違った メモリが連続してれば複数同時に出来る 連続してなくても複数同時にやった方が速い : デフォルトの名無しさん [sage] 2017/11/08(水) 21:43:54.20:YMDhJx7T でメモリアクセスに言及されてる話の流れの中で 10億回ループがいちいちキャッシュクリアされてるのかが気になる : デフォルトの名無しさん [sage] 2017/11/08(水) 21:49:19.34:u4hO2YM0 普通はキャッシュに入ったままだが、 処理次第で可能性が無いことはない 他のキャッシュを汚染する可能性もある HTTなどでは特に 他に良い方法が有るのにわざわざ面倒なテーブルにする意味がわからない : デフォルトの名無しさん [sage] 2017/11/10(金) 07:46:10.46:F5y7yLWH std::vector<std::string>からchar*const[]を作成するいい方法ってないですか。 newするしかないですかね。 : デフォルトの名無しさん [sage] 2017/11/10(金) 10:26:44.91:TvDreq2K vector<char*> に各要素 s の &s[0] を入れて済むなら new は要らなさそう。 : デフォルトの名無しさん [sage] 2017/11/10(金) 20:15:55.61:MIqJX5DT まあどうみても内部でnewしてるんだろうけど : デフォルトの名無しさん [sage] 2017/11/10(金) 21:01:13.10:UsP+TtJI クラスの概念がわかりません : デフォルトの名無しさん [sage] 2017/11/10(金) 21:19:13.94:lLb0QJod 構造体みたいなもの : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/11/10(金) 21:39:23.58:x1hu0efq クラスは構造体に関数を追加したようなもの。 クラス内部の関数はメソッドと呼ばれる。 メソッドからは、クラスのデータとメソッドを参照できる。 データとメソッドのそれぞれの項目をクラスのメンバーと呼ぶ。 クラスの実体はインスタンスと呼ばれる。メソッドからは、thisポインターにより、クラスのインスタンスを参照できる。 メンバーは、public:、protected:、private:によってアクセスを制御できる。アクセスできないメンバーを参照するとコンパイルエラーになる。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/11/10(金) 22:11:59.59:x1hu0efq class A { int a; }; と書くとA::aは、privateになる。構造体と同じアクセスにするには class A { public: int a; }; と書かないといけない。このようにクラスのデフォルトのアクセスはprivateになり、構造体はpublicになるという違いもある。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/11/10(金) 22:14:05.73:x1hu0efq クラスはコンストラクタと呼ばれる特殊なメソッドがあり、インスタンスの構築に使われる。 また、インスタンスが破棄されるときに、デストラクタという特殊なメソッドが呼ばれる。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/11/10(金) 22:17:22.95:x1hu0efq コンストラクタの例。 class A { public: int m_a; A(int a) {m_a = a + 1; } }; int main() { A a(2); printf("%d\n", a.m_a); } : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/11/10(金) 22:19:15.61:x1hu0efq 別のコンストラクタの例。 class A { public: int m_a; A(int a, int b) : m_a(a + b) { } }; int main() { A a(2, 3); printf("%d\n", a.m_a); } : はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/10(金) 23:02:09.42:4kUQXTj6 そんなの説明してやらなくてもネット上に無数の解説があるだろ。 ちゃんとした説明を読んで理解できないなら掲示板で短い説明読んだってわかりゃしねーよ。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/11/10(金) 23:14:40.61:x1hu0efq 情報が多過ぎて迷子になってるんじゃないか。マニュアル読め、規格票読め、で終わればいいのだが。 : デフォルトの名無しさん [sage] 2017/11/10(金) 23:21:03.62:YANYSepQ そう思うならなぜ現在地を聞く前に世界地図を渡すのか : デフォルトの名無しさん [sage] 2017/11/10(金) 23:32:23.63:2wx3Dyqu >クラスは構造体に関数を追加したようなもの こういうアホってどこにでもいるんですね : ◆QZaw55cn4c [sage] 2017/11/10(金) 23:40:07.53:qCTAOUdD その理解で8割がたOKだと思うのだが、何が問題なの? : はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/10(金) 23:46:33.90:4kUQXTj6 チュートリアルだってたくさんあるじゃん。 : デフォルトの名無しさん [sage] 2017/11/11(土) 00:24:04.64:5MIg+SHx クラスがわからんやつにこんな説明しても通じないだろ : デフォルトの名無しさん [sage] 2017/11/11(土) 00:49:17.73:1PUme0lw 山田さんってどんな人?と聞かれて 原子の集まりだよ。って答えるようなもの 形式的にウソじゃあないんだが そこじゃないだろっていう : デフォルトの名無しさん [sage] 2017/11/11(土) 02:47:19.31:fW1Ux/Kl 純粋にC++のクラスそれ自体の概念というなら C言語(ベース)でのオブジェクト指向プログラミングをサポートするために言語機能で用意された部品 オブジェクト指向プログラミングにおけるオブジェクト、オブジェクトの状態、 メッセージの送受信、メッセージを受けたときの振る舞いといった概念を具体化した仕組みの一例 : デフォルトの名無しさん [sage] 2017/11/12(日) 13:22:39.97:134uacB+ 記憶クラスについての質問の可能性 : デフォルトの名無しさん [sage] 2017/11/12(日) 23:51:21.74:nDRVLcBe 実のところはOOPを知らないからクラスをどう使えばいいのかわからない/ 他人の真似でなんとなく使ってるけどなぜクラスを使うのかがわからないといったあたりの話だろ : デフォルトの名無しさん [sage] 2017/11/22(水) 02:18:46.71:jSfISRI4 下手にクラスを説明するやつが多いせいで、コーディング経験なくても理解できる概念的なものだと思われちゃう クラスは実用あってこそ : デフォルトの名無しさん [sage] 2017/11/22(水) 07:58:58.54:gxZQPw73 アニマルクラスがわんにゃー鳴くのがオブジェクト指向です : デフォルトの名無しさん [sage] 2017/11/22(水) 17:16:56.90:ehTxx6H6 メンバ関数を呼び出す際の 「オブジェクトにメッセージを送る」って言い回しも C++だと分かりにくいね。 この表現がしっくりくるプログラミング言語というか 環境もあるのだろうけど。 : デフォルトの名無しさん [sage] 2017/11/22(水) 17:52:35.50:NgxFNsMl そういうのをベタで実現しているOO言語はないかな… : デフォルトの名無しさん [sage] 2017/11/22(水) 18:04:22.80:evJ3QlJY smalltalkは? : デフォルトの名無しさん [sage] 2017/11/22(水) 20:55:50.24:6XHR1ElK あれも結局、関数(メソッド)の動的なコールをそう呼ばせてるだけ 同じSmalltalkでもSmalltalk-72までさかのぼるとメッセージ送信と呼べなくもない仕組みにはなっているけど それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと まあ、ともあれC++の「オブジェクト指向」を説明するときには「メッセージを送る」とかはすっかり忘れていいよ そもそもC++の設計者の提唱するオブジェクト指向は「抽象データ型(端的にはユーザー定義の型)」を Simulaという言語から拝借した「クラス」という言語機能で実現することが主軸のアイデアなので ttp://www.stroustrup.com/whatis.pdf : はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/22(水) 21:08:20.60:Rn9KsJdK 言語の意味論とそれを実現するメカニズムは別物だから、 仕組みがどうなっているかから考察するのは無粋だと思うけどなぁ。 まあ C++ は低水準レイヤでの仕組みを意識せざるを得ない、 意味論とメカニズムが不可分なデザインではあるから概念としてのメッセージ指向よりも メカニズムに意識が引きずられてしまうというのは確かにあるかもしれない。 : デフォルトの名無しさん [sage] 2017/11/22(水) 21:21:24.87:3PrpHuiB メソッド呼び出しってメッセージパッシング感すげー出てない? : デフォルトの名無しさん [sage] 2017/11/22(水) 21:28:03.86:+hB2MqUt >それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと 違いがわからないw : デフォルトの名無しさん [sage] 2017/11/22(水) 22:33:35.60:2YdhEIzW メッセージパッシング言うなら、何かが静的に決定してる時点で興醒めだよ ttp://wiki.c2.com/?AlanKayOnMessaging : デフォルトの名無しさん [sage] 2017/11/22(水) 23:02:11.68:XGz0BDt0 C++のポリモーフィックなメソッドは動的ディスパッチだろう : デフォルトの名無しさん [sage] 2017/11/22(水) 23:09:00.03:NgxFNsMl >抽象データ型 これがすべてなのに、どうしてメッセージ駆動の話が今でももちきりなのだろうか? : デフォルトの名無しさん [sage] 2017/11/23(木) 08:26:45.55:Qr4pYIOt C++に「動的なものは何もない」という主張ではなく 「静的に決まる何かが一つでもある」時点でそれをメッセージングに例えるのは興醒めという意味 少なくともケイは彼のOOPにおけるメッセージングを「遅延結合の徹底」の目的で提案している ttp://d.hatena.ne.jp/katzchang/touch/20080807/p2 「私が考えるOOPはメッセージング、状態処理のローカルでの保有・保護・隠蔽、 そして全ての物に対する強力な遅延束縛、これだけだ。 これはSmalltalkとLISPだけが実現できている。他のシステムでも可能かもしれないが、私は知らない。」 つまるところ、これはすなわち、SmalltalkやLispみたいな変態言語でもなければ、 (あるいはアクター機構のように、並列化を意識して本当にメッセージを送るのでもなければ) 無理して「メッセージパッシング」なんてたとえる必要は無いんやで、という話でしかない : デフォルトの名無しさん [sage] 2017/11/23(木) 08:27:38.45:Qr4pYIOt まったくもってその通り : デフォルトの名無しさん [sage] 2017/11/23(木) 14:15:04.16:76J8bh8G Cのキャストについて教えてください int a,b; long c; の条件下で、a+b 、a*100+b*100(a*100、b*100のどちらもlong型になる) がそれぞれlong型の解になるような場合のキャストとしては 1 c=(long)a+b; 2 c=(long)a+(long)b; 3 c=(long)a*100+b*100 4 c=(long)a*100+(long)b*100 とそれぞれ、どの記載が正しいのでしょうか? : デフォルトの名無しさん [sage] 2017/11/23(木) 14:19:02.83:5K7m7Mmt >a*100、b*100のどちらもlong型になる intでは表せなくてlongが必要 って意味なら3以外 : デフォルトの名無しさん [sage] 2017/11/23(木) 14:20:46.83:76J8bh8G ありがとうございます。 1と3は似ていますが1はa,bそれぞれキャストされるが 3ではb*100はキャストされずint型で計算されてしまう、ということなのですね : デフォルトの名無しさん [sage] 2017/11/24(金) 16:57:14.87:L5ESShiZ よろしかったら教えてください if(a==0){ } と記述するのにfor文では for(i=0;1<100;i++){} と書き、for(i==0;i<100;i++){} と書かないのはなぜでしょうか?(==の使い方) : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/11/24(金) 17:05:28.65:ELoh0Abo 代入と比較は違う。 : デフォルトの名無しさん [] 2017/11/24(金) 17:07:52.77:QRhLqwOG スーパー初心者か? forでも書いてもいい。だが意味がないか低い。 「=」は代入だが「==」は代入でない。 : デフォルトの名無しさん [sage] 2017/11/24(金) 17:08:50.74:L5ESShiZ 片山先生、ありがとうございました! そういうことなのですね。理解できました、いつもありがとうございます! : はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/24(金) 17:38:47.92:lG8HVUMw わかってる人にとってはクソみたいな質問だけど、 数学だと代入 (定義) するっていうのと等しいっていうのは区別がはっきりしないので、 そういうメンタルモデルで考えてると混乱しちゃうってのはわからんでもない。 とはいうものの、よっぽど出来の悪い入門書でもそこらへんわからんようなのは無いと思うんだが、 どういう学び方をしてるんだかちょっと疑問。 : デフォルトの名無しさん [sage] 2017/11/24(金) 17:51:57.71:L5ESShiZ なんかすみません ネットで優しそうなサイトで進めてます : デフォルトの名無しさん [sage] 2017/11/28(火) 12:50:21.53:bi1wDt8X 数学のイコールには比較(の結果等しい)の意味しかないだろう Pascalみたいに代入が:=なら良かったのに : デフォルトの名無しさん [sage] 2017/11/28(火) 12:57:44.05:cL+Re6N7 プログラムを記述する際、等しいかを比較するより、代入のほうが頻度が高いから Cでは多く入力するであろう代入側を 1文字にして そうでない側を 2文字にした って聞いたことがある : デフォルトの名無しさん [sage] 2017/11/28(火) 13:22:50.66:8wOk3LC1 Fortranだって代入は=だから、Cで採用されたのも仕方ない とはいえ、文字数ごときにこだわらずに、:=を採用してくれていたらタラレバ : デフォルトの名無しさん [sage] 2017/11/28(火) 13:44:24.58:9QEYjjOS 力添えを頂きたい。 SunAwt系のソフト内で表示されているテキストを取得したいんだが、尻尾も掴めず困り果て、どうすれば良いか全く分からない状態。 何かヒントを頂けないだろうか。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/28(火) 13:50:31.60:1OfFiaid 別のプロセスから取得するって意味? : デフォルトの名無しさん [sage] 2017/11/28(火) 18:08:18.05:9QEYjjOS YES。 別プロセスからテキストを取りたい。 他の例えばIEやハンドルが取れる様なソフト内の文字ならgettextやcom操作で取ったりできるがSun系のソフトは同じ様にはいかず、メモリを読むのかどうすればいいのか、知識が足りなくて検索も上手に出来ず...頭打ち状態。 何か足掛かりになる物を教えて頂きたい。 : デフォルトの名無しさん [sage] 2017/11/29(水) 00:32:03.31:/GAULuFW 試したことないけどこれは? ttp://www.oracle.com/technetwork/articles/javase/index-jsp-136191.html : デフォルトの名無しさん [sage] 2017/11/29(水) 13:08:28.50:GlJ85cMo #include<stio.h> int main(){ int i,num[5]; for(i=0;i<5;i++){ printf("***\n"); scanf("%*c%d"&num[i]); } } 実行し、num[]に、10、20,30,40,50と入力すると num[0]の値は0、num[1]は20、その後50まで代入されてます num[0]に10が代入されないのは何故なのでしょうか? : デフォルトの名無しさん [sage] 2017/11/29(水) 13:26:13.79:NrhyqkWd "%*c"のせいじゃね : デフォルトの名無しさん [sage] 2017/11/29(水) 13:36:20.41:GlJ85cMo そうでした。ありがとうございました。 : デフォルトの名無しさん [sage] 2017/11/30(木) 14:49:53.66:t+LxFq0J テフ? : デフォルトの名無しさん [sage] 2017/12/01(金) 03:20:07.32:VClmrWfc boost::qiでマルチバイト文字を扱うにはどうすればいいんですかね : デフォルトの名無しさん [sage] 2017/12/01(金) 12:48:46.21:UzEJxhfp 5人の生徒に3教科のテストをし、その点数を入力する 入力後、 テストA テストB テストC 0点〜19点 0人 0人 0人 20点〜39点 0人 0人 0人 40点〜59点 2人 0人 1人 ・・・ 80点〜100点 1人 3人 2人 と集計する方法に悩んでいます。 どういう考え方が考えられますか? : デフォルトの名無しさん [sage] 2017/12/01(金) 13:06:08.20:p7Y4uOcI char_に替わるパーサー書けばいいんじゃないかね マルチバイトの最初の文字を認識する自作パーサーをmb1、マルチバイト文字のパーサーをmbcharとして mbchar = (mb1 >> char_) || char_; とか? : デフォルトの名無しさん [sage] 2017/12/01(金) 13:14:35.24:LYbXDWPH 宿題は自分で考えるのが原則。どこまで考えた? : デフォルトの名無しさん [sage] 2017/12/01(金) 13:21:20.74:UzEJxhfp ありがとうございます。 入力された点数を3次元配列に格納するところまでです。 今は、繰り返し分を使い、配列に格納された数字が0でなかったら その数字をカウントして人数を集計しようとしてるのですが、できていません : デフォルトの名無しさん [sage] 2017/12/01(金) 13:56:35.70:LYbXDWPH なぜ3次元?生徒と教科がインデックスだから2次元では? あと、表示さえすればいいだけなら、 効率度外視である教科のある得点範囲の人数をカウントするくらいできるでしょ。 効率考えるなら表示用に0で初期化した2次元配列を別に用意する。 : デフォルトの名無しさん [sage] 2017/12/01(金) 14:01:47.55:UzEJxhfp ありがとうございます。2次元です。 ten[5][3]で得点を格納したあとが進まないのです 得点範囲の人数のカウントについてもう少し考えてみます : デフォルトの名無しさん [] 2017/12/02(土) 00:04:56.97:F3lbt2G4 中古本でプログラミング言語c++の3版が4000円で4版が6000円なんだが やっぱり4版を買ったほうがいいのかな : デフォルトの名無しさん [sage] 2017/12/02(土) 00:18:15.85:4X8AnX6A あんまり良い本じゃないから買わなくていい : デフォルトの名無しさん [] 2017/12/02(土) 00:54:45.18:F3lbt2G4 そうなのか・・・聞いておいてよかった ありがとう : デフォルトの名無しさん [sage] 2017/12/02(土) 09:08:29.93:XeWd0teH 昨日はありがとうございました 90行程度と長いプログラムになりましたが 人数をカウントし表示させることができました カウントは、教科毎にfor文で呼び出し 20以下、20〜39、・・・80〜99、100とif文で条件指定し 各範囲で人数をカウントし、最後に表示させました また分からないことがありましたらご指導お願いいたします。 : デフォルトの名無しさん [sage] 2017/12/02(土) 14:58:42.41:XeWd0teH ファイルを開いた回数を記録するというプログラムを作っています int main(){ int count; FILE *fp; if((fp=fopen("log.txt","r"))==NULL){ count=0; }else{ fscanf(fp,"log.txt",&count); fclose(fp); } if((fp=fopen("log.txt","w"))==NULL){ printf("Error\n"); return -1; } count++; printf("%d回目のプログラムを実行です\n",count); fprintf(fp,"%d\n",count); fclose(fp); } これを実行するたびに 2752513回目の・・・ 3444737回目の・・・ 2953217回目の・・・ となってしまい、ファイルを開いた数が記録されません 最初にlog.txtがない状態で実行したときの、一番最初だけ、countに1が代入され log.txtにも1が記載されるのですが、2回目以降のcountには7桁の乱数みたいのが代入され記載されてしまいます どうして不具合が出るのか分からなくなっております。よろしくご教授くださいませ : デフォルトの名無しさん [sage] 2017/12/02(土) 15:12:26.31:jpnrbmV1 fscanfで書式の指定ミス : デフォルトの名無しさん [sage] 2017/12/02(土) 15:16:24.33:XeWd0teH さっそくありがとうございます。fscanf(fp,"%d",&count)と訂正しました。 初歩的なミスで申し訳ありませんでした、そしてありがとうございました。 : デフォルトの名無しさん [sage] 2017/12/02(土) 15:18:37.18:Jd1ioDh8 > fscanf(fp,"log.txt",&count); 二番目の引数を再確認してみ : デフォルトの名無しさん [sage] 2017/12/02(土) 15:35:47.69:XeWd0teH ありがとうございました。 おかげさまで正常にカウントされるよになりました。 確認不足でご迷惑おかけしました。ありがとうございます。 : デフォルトの名無しさん [sage] 2017/12/02(土) 18:53:18.55:K6qIkKEG 超初心者です c言語でGetPixelが動きません どうすれば直るのか教えてください COLORREF GetPixel (float 変数x, float 変数y); //指定座標の色取得。 if float GetPixel(float 変数x, float 変数y == RGBCOLOR( 0, 0,255)) ; //指定座標のピクセルが青色ならコード実行 //以下、実行するコード : デフォルトの名無しさん [sage] 2017/12/02(土) 19:09:54.54:4pmjT1Fk >if float GetPixel(float 変数x, float 変数y == RGBCOLOR( 0, 0,255)) ; //指定座標のピクセルが青色ならコード実行 if (GetPixel(x, y) == RGBCOLOR( 0, 0,255)) { 条件が真のとき実行するコード } ではどうですか? : デフォルトの名無しさん [sage] 2017/12/04(月) 17:32:02.17:K3o+GgF3 boost::qiって読み方ブースト・チーでいいの? : デフォルトの名無しさん [sage] 2017/12/04(月) 18:32:18.36:m/Ygi57i boostのパーサの使い方わかんね : デフォルトの名無しさん [sage] 2017/12/04(月) 21:33:58.20:K2rBoL+r 氣 : デフォルトの名無しさん [] 2017/12/05(火) 04:28:16.53:NJ16QKFF 組み込みの場合例えばRs232Cのチャンネルが三つあるようなばあいにクラスに するとIOの初期化がそれぞれ違う。しかもチャンネル1を初期化するとチャンネル3 にも影響する場合がある。こういう場合にはどんな風にクラスをつくったらいい? : デフォルトの名無しさん [sage] 2017/12/05(火) 10:59:54.97:BooJAJ3p よろしくお願いします。 fp=fopen("out.txt","r"); while(fscanf(fp,"%d",&da2[i])!=EOF){ fscanf(fp,"%d",&da2[i]); i++; } fclose(fp); これを実行するとテキストファイルに記録されている整数を 一行飛ばしで読みだしてしまいます どうして飛ばされる行ができてしまうのでしょうか? : デフォルトの名無しさん [sage] 2017/12/05(火) 11:22:39.33:tMsGMSrl friend : ◆QZaw55cn4c [sage] 2017/12/05(火) 11:42:25.43:x6DQdw1l fscanf() を二箇所に書いているけれども、それでいいのですか? : デフォルトの名無しさん [sage] 2017/12/05(火) 11:54:34.95:GUcDlKUg whileでのfscanfのあとでiを変更してないから次のfscanfで同じda2[i]に上書きしてる : デフォルトの名無しさん [sage] 2017/12/05(火) 12:02:08.68:BooJAJ3p 、 そういう事だったのですね ありがとうございました! : デフォルトの名無しさん [sage] 2017/12/05(火) 15:40:18.03:BooJAJ3p 再びよろしくお願いいたします。 int main(){ char ch1,ch2; printf("二文字入力\n"); scanf("%c",&ch1); scanf("%c",&ch2); printf("ch1=[%c]\nch2=[%c]\n",ch1,ch2); return 0; } これを実行すると、2回目のscanfを飛び越えてしまいます。 その理由と回避方法をご指南いただけませんでしょうか? よろしくお願いいたします。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/12/05(火) 15:46:59.33:KBxdaLdg 再びよろしくお願いいたします。 int main(){ char buf[3], ch1,ch2; printf("二文字入力\n"); fgets(buf, 3, stdin); ch1 = buf[0]; ch2 = buf[1]; printf("ch1=[%c]\nch2=[%c]\n",ch1,ch2); return 0; } : デフォルトの名無しさん [sage] 2017/12/05(火) 16:20:49.08:BooJAJ3p ありがとうございます 標準入力によって処理し、scanfを使わないということなのですね 文法を覚えて活用できるようにします 何度もありがとうございます : デフォルトの名無しさん [sage] 2017/12/05(火) 16:50:17.51:VZfNuCLu 改行文字を次のscanfで読込むから 回避方法は例えば ttp://blog.unfindable.net/archives/604 : デフォルトの名無しさん [sage] 2017/12/05(火) 16:59:28.01:BooJAJ3p ありがとうございます しっかり理解できるには時間がかかりますが とりあえず、お礼申し上げます 改行文字を処理しないと次のscanfが改行文字を読んでしまうのですね とても勉強になりますし、皆様のおかげで前進できます ありがとうございます : デフォルトの名無しさん [sage] 2017/12/07(木) 00:17:29.58:fcKh4od9 皆すげーな 俺みたいなライブラリのインクルードが通せなくて そもそもコンパイルって何だっけってところから調べるような奴には恐れ多いわ : デフォルトの名無しさん [sage] 2017/12/07(木) 12:53:50.82:4zvLzkC0 毎日すみません。ご教授お願いします。 out,txtに記録されている下記文字に対して --------------- AAA BB ababb 099 --------------- ファイルを開いて、文字列を読み出し 配列で一文字一文字を表示させようとしています i=0; fp=fopen("out.txt","r"); while(fscanf(fp,"%c",&c)!=EOF){ i++; } for(t=0;t<=i;t++){ printf("%c\n",c[t]); } これだと18行表示されますが 表示されたのは全く異なるものでした どこが不適切なのか2日考えても分かりません いつも申し訳ありません><よろしくご指導願います : デフォルトの名無しさん [sage] 2017/12/07(木) 13:10:52.74:dicAL8ON c は大きさの十分ある char への配列と想定した前提で fscanf の引数がおかしい 1文字毎に配列へ順繰りに読み込ますのなら fscanf(fp,"%c", &c[i]); こうなってないと : デフォルトの名無しさん [sage] 2017/12/07(木) 13:39:27.89:4zvLzkC0 &が抜けていたのは恥ずかしいです 申し訳ありませんでした しっかり覚えさせていただきます プログラムもちゃんと動きました いつも簡単なことばかりなのに理解が浅くてすみません とても勉強になりました。ありがとうございました : デフォルトの名無しさん [sage] 2017/12/07(木) 16:08:02.33:dicAL8ON 書いてあることが違うけど(&が抜けていたのではなく [i] がない) 本当に分かっているのか不安になる返答だが、そのうち慣れてくるだろう。 (文字と文字列の違いと (f)scanf に渡すフォーマットの指示と 変数をどう渡すか の一連が整理されてないと、また繰り返すだろう) : デフォルトの名無しさん [sage] 2017/12/07(木) 16:29:02.63:4zvLzkC0 はい、ありがとうございます。 配列にして直してあります。 fscanf(fp,"%s",c)として読み込んだ後に c[i]で一文字一文字表示させられると思い込んでいました 先ほどの156のおかげでfscanf(**** &c[i])を覚えられました ありがとうございます!感謝してます : デフォルトの名無しさん [sage] 2017/12/08(金) 15:46:12.24:b0CgZ3o1 こんにちは。どうか本日もよろしくお願いいたします。 10人分の点数を入れて表示するプログラムです。 下記のように作成したのですが、main()内から関数を呼び出すところで parameter names(without typesというエラーがでてしまいます。 どうかよろしくお願いします。 #include<stdio.h> void da(int ten[10]){ int i; for(i=0;i<10;i++){ printf("%d input ",i);scanf("%d",&ten[i]); } return; } void out(int ten[10]){ int i; for(i=0;i<10;i++){ printf("%d人目 : %d点\n",i,ten[i]); } return; } int main(){ int ten[10]; void da(ten); void out(ten); return 0; } : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/12/08(金) 15:56:23.80:8LWGXCju #include <stdio.h> void da(int ten[10]){ int i; for(i = 0; i < 10; i++){ printf("%d input ", i); scanf("%d",&ten[i]); } } void out(int ten[10]){ int i; for(i = 0; i < 10; i++){ printf("%d人目 : %d点\n", i + 1, ten[i]); } } int main(void) { int ten[10]; da(ten); out(ten); return 0; } : デフォルトの名無しさん [sage] 2017/12/08(金) 16:02:05.10:C0Y4l8FE そろそろうっとしいな : デフォルトの名無しさん [sage] 2017/12/08(金) 16:06:39.52:b0CgZ3o1 すみません、ここは質問するところじゃなかったのですね 他のC言語のスレから誘導されたので、こちらで質問していいかと思ったのですが 今後質問は控えます。自力で学習を進めようと思います。 ご迷惑をおかけしてすみませんでした。 片山先生、本日もありがとうございました。感謝です。 : デフォルトの名無しさん [sage] 2017/12/16(土) 05:14:03.17:Nra/Nglb #pragma pack(1) struct { char a; short b; int c; } x; Cでバイナリデータとかパディング除けに上のような感じに書いて読み書きしたりしますが(例は適当)、 C++ではpragmaを使用せず記述量も少ないスマートな記述方法はあるでしょうか? : デフォルトの名無しさん [sage] 2017/12/16(土) 09:10:24.00:67ZudMHx ない : デフォルトの名無しさん [sage] 2017/12/16(土) 09:52:53.87:Nra/Nglb ありがとうございます。やっぱりないですか。 pragmaがコンパイラ依存とか書かれてて非常に嫌なんですが慣れます。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/12/16(土) 16:18:44.15:2NfYNG63 #include <pshpack1.h> ... #include <poppack.h> : デフォルトの名無しさん [sage] 2017/12/17(日) 02:47:22.67:T7tjmkgj C/C++は言語自体は好きなんですが、GUIとかがプラットフォームに依存するみたいですが、そういった場合黙ってqt使うのが最善ですか? : デフォルトの名無しさん [] 2017/12/18(月) 01:24:26.49:vrG0ZJDQ そのような構造体で直接読み書きしないのがベスト : デフォルトの名無しさん [] 2017/12/21(木) 16:50:57.91:FN6C0PcS ここが適切かわかりませんが、 make の Makefile を Visual Studio や NetBeans 等の IDE の プロジェクトファイルに変換するツールはありませんか。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/12/21(木) 16:54:33.43:fHSTQ7CK makeにはないが、似たようなものにCMakeというものがあって、CMakeならプロジェクトファイルを生成できる。 : 168 [sage] 2017/12/21(木) 17:10:02.95:FN6C0PcS そこまでは分ったのですが、 Makefile を CMakeLists.txt に変換するのはありますか? 見つけられたのは、nmake.exe 用の Makefile.mak を *.vsproj に変換する、 Python のスクリプトだけでした。。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/12/21(木) 17:15:07.21:fHSTQ7CK ない。 : 168 [sage] 2017/12/21(木) 17:25:55.41:FN6C0PcS ありがとうございました。 CMake 勉強します。 : デフォルトの名無しさん [sage] 2018/01/09(火) 19:29:59.07:cBwAL66C ライブラリ作成の指南書みたいな本ってありますか。 : デフォルトの名無しさん [sage] 2018/01/09(火) 22:23:30.03:9ubHCBZ8 環境によるんじゃ? : デフォルトの名無しさん [] 2018/01/10(水) 01:19:44.15:CtX3Z92R とりあえず c++のためのapiデザイン でも読んでみるといいと思う : デフォルトの名無しさん [sage] 2018/01/10(水) 02:59:55.08:QjjLPcN0 読んでみるわ : デフォルトの名無しさん [age] 2018/01/13(土) 06:17:45.46:hj3TLdcf 定数以外の名前に「 _ 」を使うのって良くないって聞いたけどどうなの? : デフォルトの名無しさん [sage] 2018/01/13(土) 09:08:14.97:P3TI7O0+ 趣味とか宗教とかの話であって、別に使って問題ない ただ名前の先頭だったり、2回連続で使ったりすると 予約語に引っかかることがあるので注意(定数の場合も) : デフォルトの名無しさん [sage] 2018/01/13(土) 09:13:05.82:M+vRxjCB その辺有名ライブラリのルール付けとか調べてみるのもいいかもね : デフォルトの名無しさん [sage] 2018/01/13(土) 09:23:55.53:M+vRxjCB GoogleがC++のスタイルガイド公開してる これも参考になりそう : デフォルトの名無しさん [sage] 2018/01/16(火) 10:54:12.13 C++で何つくんの? GUIプログラムならC#のほうが圧倒的に簡単だし : デフォルトの名無しさん [sage] 2018/01/16(火) 11:06:50.90:E1MTmeKy CAD : デフォルトの名無しさん [sage] 2018/01/16(火) 11:07:58.52 そんな上級者にしか用途がない言語か : デフォルトの名無しさん [sage] 2018/01/16(火) 11:24:35.41:/aUGqjlJ 個人的にC/C++は高級なアセンブラだと思っている C#とは存在するレイヤが違うから、比較条件として用途を挙げるのはちょっと違うかなって : デフォルトの名無しさん [sage] 2018/01/16(火) 11:25:50.16 で、何つくんの? 高級アセンブリの用途は? : デフォルトの名無しさん [sage] 2018/01/16(火) 12:09:46.86:J2S5K16W 画像処理 大規模ゲーム開発 : デフォルトの名無しさん [sage] 2018/01/16(火) 12:32:40.41:6i0TmEx8 GoogleChrome : デフォルトの名無しさん [sage] 2018/01/16(火) 13:22:26.10:6uwiuQcq ゲームとか速度が必要な場面でまだまだ使われてるでしょ : デフォルトの名無しさん [sage] 2018/01/16(火) 15:46:42.36:e8xaSAkW CPUパワーを必要とするようなまとまった処理は C/C++のような低級な高級言語が適している 組み込み用の小規模マイコンもCがほとんど : デフォルトの名無しさん [sage] 2018/01/16(火) 19:09:30.75:Vb1E5r0O Pythonのライブラリも結局はCで作ってたりするしな。 : デフォルトの名無しさん [sage] 2018/01/17(水) 00:06:48.74:kWLOq5lU GUIはC#でWPFだけど、そこから使用するdllとか連携するサービスとかはc++。OSのAPIをいろいろ使う場合はC#だと面倒くさいからc++を選ぶ。 : デフォルトの名無しさん [sage] 2018/01/17(水) 01:07:00.24:X2mlxDcY OpenGLもC#か大変そうだな : 愛知人 [sage] 2018/01/17(水) 09:14:59.53 Unityでいいよね : デフォルトの名無しさん [sage] 2018/01/17(水) 11:15:20.21:X2mlxDcY ライセンス料が只ならいいよ : デフォルトの名無しさん [sage] 2018/01/17(水) 11:23:31.36:4ILD3/U5 Unityでも速度が必要な場所はC++で書いて呼び出し : 愛知人 [sage] 2018/01/17(水) 11:48:22.30 なんでC++ってendlいるの? : デフォルトの名無しさん [sage] 2018/01/17(水) 12:24:58.46:/z6RTYd5 ちょっと何言ってるかわかんないです : 愛知人 [sage] 2018/01/17(水) 13:34:56.30 なんでprintf使わないの? : デフォルトの名無しさん [sage] 2018/01/17(水) 13:41:03.90:lhJfQamL 浪人と引き換えに無知を手に入れた男 : 愛知人 [sage] 2018/01/17(水) 13:43:22.44 で、返答は? : デフォルトの名無しさん [sage] 2018/01/17(水) 14:07:42.46:l2H41H1D <cstdio>は正しくC++だからprintf使っても構わん 味噌 よ 後々になって「iostreamはでかいし あんまりうみゃくいかないエビフリャー」いうことになった きしめん だしね endlは、改行の無い出力と在る出力を統一的に(フォーマット使わずストリームで)扱うには必要でしょ ひつまぶし? 愛知語は詳しくないけど察し手羽先 : 愛知人 [sage] 2018/01/17(水) 14:16:18.48 どうやったらこんなつまんないレスを返せるんだよ... 重症やな w : デフォルトの名無しさん [sage] 2018/01/17(水) 14:19:41.37:l2H41H1D 言うな 自分でも検索履歴に「愛知 名物」って残ってるの見て 「人生を無駄にした」と真顔で後悔してるところだから : デフォルトの名無しさん [] 2018/01/17(水) 15:03:17.62:MeUm47mp 何言ってんだこのバカ : 愛知人 [sage] 2018/01/17(水) 16:08:09.91 あらら、怒っちゃった(笑) : デフォルトの名無しさん [sage] 2018/01/17(水) 17:39:52.90:sykUBtM3 C++でしかできないもの作りたいだけど何かいいアイデアない? : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/01/17(水) 17:52:07.55:89SqY/Kf エクセルのような操作性の、画像レイアウト印刷アプリなんてどう? : デフォルトの名無しさん [sage] 2018/01/17(水) 18:18:50.66:sykUBtM3 印刷はしたくないです.. : デフォルトの名無しさん [sage] 2018/01/17(水) 20:00:30.20:W2btjMLE おs : デフォルトの名無しさん [] 2018/01/27(土) 06:58:59.63:1R9xhZBX windowsとLinuxで動くクライアントアプリ開発してて、Linuxコンパイラは化石みたいなバージョンからgcc4.4をようやく使えるようになった そこでC+11の一部が使えるようになったから使いたいと思ってる ユーザにAPIを公開してるんだけど、ユーザがAPIを使うに際してはコンパイルオプションstdc++0xが必要なことにはしたくない。今までできてたのに、バージョンアップしたらコンパイルできなくなったとかいわれるからね。 ここで質問なんだけど、ユーザに公開しているヘッダファイルにC+11の記述がなければ、ユーザからの使い方は変わらないかな?手元で試してみた感じだと行けそうだって思ったけど、このへん危ないんじゃないのとか気をつけた方がいいよとかあれば意見よろしくです : デフォルトの名無しさん [sage] 2018/01/27(土) 08:45:12.76:x9sgfrz+ バイナリで配布するんだったらとりあえずシンボルをnmで取得して見比べてみるとか。 : デフォルトの名無しさん [] 2018/01/27(土) 10:25:52.07:RqfNKOXi ユーザからクロスコンパイラ提供してもらってバイナリ配布っす nmコマンド、試す価値はありそうだありがとう : デフォルトの名無しさん [sage] 2018/01/28(日) 06:43:38.82:yhuRz+yt 以下のコードをgccでコンパイルすると #include <iostream> #include <functional> using namespace std; struct functor { int& operator()(int& i) { return ++i; } }; int main() { int i = 0; cout << functor{}(i) << endl; // 関数オブジェクトは問題なし function<int& (int&)> lambda = [] (int& i) { return ++i; }; // コンパイルエラー cout << lambda(i) << endl; return 0; } 「'main()::<ラムダ(int&)>' から非スカラ型 'std::function<int&(int&)>' への変換が要求されました」 というエラーになるのですが、どうしてでしょうか? そもそもラムダ式は関数オブジェクトのシンタックシュガー、つまり等価なのではないんでしょうか? : デフォルトの名無しさん [sage] 2018/01/28(日) 07:45:35.06:kxFN6buW 戻り値がintになってる 戻り値の型を後置で書いてやればいいかな function<int& (int&)> lambda = [] (int& i) -> int& { return ++i; }; : デフォルトの名無しさん [sage] 2018/01/28(日) 22:25:05.79:yhuRz+yt ありがとうございます。 戻り値の型を明示してあげないと値渡しになってしまうということですね。 勉強になりました。 : デフォルトの名無しさん [] 2018/02/06(火) 23:57:09.32:ZZWnbRb2 typedef int myTypeA; typedef int myTypeB; class Test { void set(myTypeA a); void set(myTypeB b); priate: int A; int B; }; のような事例で、引数に応じて専用のセッターを用意したいのですが、 int型の2種類の引数に対して、上記のように書くとコンパイルエラーになってしまいます。 どのようにするのが良いでしょうか? : デフォルトの名無しさん [sage] 2018/02/07(水) 00:04:25.80:k5RJAFTX structを使う? struct my_TypeA{ int v;}; : デフォルトの名無しさん [sage] 2018/02/07(水) 00:18:25.18:yuAfwWTK なるほど、、、確かにtypedefだと別名になるだけですね structかclassで別の型にしないとダメですね ありがとうございます! : デフォルトの名無しさん [sage] 2018/02/07(水) 03:43:04.13:LQaGrglb オブジェクト指向では、型による分岐処理は無くなる。 汎化 f(親型) ここに、親型の子型であるA型・B型が入っても、正常に動くのが、オブジェクト指向 : デフォルトの名無しさん [sage] 2018/02/09(金) 15:21:46.70:+q9wZMZv などと訳のわからないこと(でもないが)を供述しており : デフォルトの名無しさん [sage] 2018/02/11(日) 04:59:49.56:9irhhPDg C++には強いエイリアスが無いからなあ : デフォルトの名無しさん [sage] 2018/02/23(金) 16:21:25.57:UAqVoMsi C++じvtable参照することになるから遅いだろ : デフォルトの名無しさん [sage] 2018/02/25(日) 04:05:35.43:Zrtx8k52 セットする値の名称にする 例えば三角形を表すオブジェクトで底辺と高さをセットするのであれば、base()とheight()になる プロパティとして使うのだから、setXXX()みたいに書かなくてもいい setter単独で存在することはありえないからgetterも設けること setterって余り必要ない コンストラクタからの初期化で十分の場合が多い : デフォルトの名無しさん [sage] 2018/02/25(日) 14:23:16.60:8l5JrV0a だぶるでぃすぱっち : デフォルトの名無しさん [] 2018/03/03(土) 13:43:59.95:Vl4EAVf3 2の累乗でないときのmod演算の高速化の方法、何かありませんか? そこらへんはコンパイラで最適化されるんですかね : デフォルトの名無しさん [sage] 2018/03/03(土) 14:09:48.07:xC+xvi0u 法を2進数にしたときほとんど1かほとんど0なら手間の少ない方法はある。 法が固定で何度も剰余を取るならモンゴメリリダクションがある。 どちらも乗算はそれなりに必要。 : デフォルトの名無しさん [] 2018/03/03(土) 14:14:16.62:Vl4EAVf3 ありがとう ちょっと調べてくる : デフォルトの名無しさん [] 2018/03/06(火) 00:16:25.34:EXuXevGu ユニークポインターにキャラの可変配列をヒープからとってリセットしたはいいけど、デリーターって簡単に実装/定義できる?例が欲しい。 : デフォルトの名無しさん [sage] 2018/03/06(火) 00:47:05.22:yCnPPW+5 mutex g_Mtx; int g_Val = 0; int Func( int A, int B ) { int Val = A * B; lock_guard<mutex> Lock( g_Mtx ); return g_Val = Val; } void ThreadFunc0() { } : デフォルトの名無しさん [sage] 2018/03/06(火) 00:55:45.44:yCnPPW+5 mutex g_Mtx; すみません、途中で送信してしまいました。 int g_Val = 0; int Func( int A, int B ) { int Val = A * B; lock_guard<mutex> Lock( g_Mtx ); return g_Val = Val; } void ThreadFunc0() { int Val = Func( 2, 3 ); // Valを参照する処理 } void ThreadFunc1() { lock_guard<mutex> Lock( g_Mtx ); // g_Valを参照する処理 } 上記のようなスレッド関数が非同期に実行されるとき、 Func()はスレッドセーフ(g_Val書き換え中に参照されない)でしょうか? (1)lock_guard<mutex>によるミューテックスロック (2)g_Valの書き換え (3)戻り値を読み出し元スレッドにコピー(あるいはムーブ) (4)lock_guard<mutex>がスコープから外れアンロック というシーケンスを期待しています。 : 230 [sage] 2018/03/06(火) 00:58:37.27:yCnPPW+5 誤:読み出し元スレッド 正:呼び出し元スレッド : 230 [sage] 2018/03/07(水) 00:28:47.80:+JS1hm36 すみません、他スレで聞きます。 : デフォルトの名無しさん [sage] 2018/03/07(水) 19:00:17.77:BpTZedcA 事情があって下記の型の関数を、 void Func1(char a); 下記の型の関数ポインタに代入して呼びたいと思っています。 int*(*p)(int*); p = (int*(*)(int*))Func1; p((int*)123); 動作としてはFunc1(123)と呼んだときと同じものを期待しており、 試したところそれっぽく動作しているのですが、 致命的な問題等あります? "暴走の危険あり"など。 : デフォルトの名無しさん [sage] 2018/03/07(水) 19:20:05.55:/Jrz1mw6 スタックに積むサイズは通常int long longとかで無ければ実害は無い : デフォルトの名無しさん [sage] 2018/03/07(水) 19:29:05.35:iizJnzkK C11の6.3.2.3の8によると、the behavior is undefinedだ。 たとえばcharが4バイトに自動昇格して、ポインタが8バイトだったりすると、 どうなるかわかったもんじゃない。鼻からなんちゃらだ。 C++は知らん。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/03/07(水) 19:29:59.98:Ssa+vNsg sizeof(int) != sizeof(int*)の場合(例えばx64)、どうなるかな? : デフォルトの名無しさん [sage] 2018/03/07(水) 19:34:38.56:iizJnzkK そうそう、undefinedのあとはほんとに何が起きるかわからんよ。 コンパイラが何をしでかしても文句言えない。 たまたま今の環境で動いても、明日コンパイラを更新したら挙動が変わりうる。 : デフォルトの名無しさん [sage] 2018/03/07(水) 20:01:22.38:MtWgjxh8 「事情があって」の事情を解消する方が安全だと思うけど…。 void Func1(char a); を呼び出すラッパ関数を使うのはどうだろ? int* Func1_wrapper(int *p) { uintptr_t arg = (uintptr_t)p; Func1((char)arg); // 縮小変換が危険 return NULL; } int* (*p)(int*); p = Func1_wrapper; p((int*)123); // 明らかに不正アラインメントだが : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/07(水) 20:34:34.64:TWOfgg7C 関数ポインタ同士は互換で、お互いにキャストすることは許される。 が、呼ぶときは元の型にキャストしなおしてからじゃないとあかん。 : デフォルトの名無しさん [sage] 2018/03/10(土) 22:50:07.25:tBgkA+tH C++で窓出してプログラム組みたい時ってどういう風にするもんなんでしょうか windows.hで一つ一つボタンの位置を設定してハンドルやらコールバックと格闘するもんなんでしょうか それとも何か気の利いた便利なライブラリとかがあるんでしょうか というかこの手のライブラリやフレームワーク的なものを探したりしたい場合はどういう場所から情報を集めるものなんでしょうか それっぽいキーワードでgoogleで検索して探そうとしても上手く情報を見つけられないのですが、根気よくページを確認していくしかないのでしょうか : ◆QZaw55cn4c [sage] 2018/03/10(土) 23:05:33.56:+Ww908Qw 基本的には win32api を使うことになり、私は C++ からwin32api( ::DefWindowProc() とか)を個別呼び出している 気の利いたライブラリのことはよく知らない : デフォルトの名無しさん [sage] 2018/03/10(土) 23:18:25.22:tBgkA+tH やっぱりそういう感じになるんですね 頑張って勉強します : デフォルトの名無しさん [sage] 2018/03/10(土) 23:42:00.51:4x8PIJN4 Windowsに特化するなら Win32APIのほかにMFCやWTLや.NET framework(C++/CLIで良ければ)などのライブラリを使う サードパーティならC++ BuilderのVCLとかあとはクロスプラットホームのQtとかGtk+とかwxWidgetsとか他にもあると思うけど 最近はデスクトップアプリが落ち目なのでこれという定番はなくて目的に応じて分散しているのでは? 自力で情報が集められない程度ならC++でGUIなんて止めとけという気がしないでもない : デフォルトの名無しさん [sage] 2018/03/11(日) 00:23:13.22:5+tjHPTy ありがとうございます。それぞれ見てみます : デフォルトの名無しさん [sage] 2018/03/11(日) 00:43:28.70:QedwXA9H vs2010以降ならWIN32SDKベースでも雛型吐いてくれるだろうに : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/03/11(日) 03:53:08.43:4ez4tjCr ボタンの配置などは、リソースエディタでダイアログテンプレートを作ってDialogBox関数を呼べば、細かい調整ができる。 イベント駆動やメッセージ送信などについては、<windowsx.h>で提供されるメッセージクラッカーやマクロを使えば便利になる。 私が複雑なことをする場合は、MZC4という自作のクラスライブラリを使ってる。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/03/11(日) 03:59:42.40:4ez4tjCr HANDLE_MSGマクロによるメッセージクラッカーという仕組みを使えば、ウィンドウプロシージャやダイアログプロシージャの記述が楽になる。 私はさらに、HANDLE_MSGの呼び出し先の関数の入力を楽にする自作のMsgCrackというツールを使っている。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/11(日) 04:12:58.32:f5R2yX0u WinRT が綺麗にまとまってると思う。 ttps://github.com/Microsoft/cppwinrt Windows API を現代的な C++ に合わせて整理したものなので、 C++ 的にある程度まともな感じがする。 昔は仕方がなかったんだろうけど、 今にしてみればメッセージクラッカーっていかにもクソダサい方法だよな〜。 : デフォルトの名無しさん [] 2018/03/11(日) 10:27:16.51:zWe+i43K tcl/tkが一番手軽 : デフォルトの名無しさん [sage] 2018/03/11(日) 10:40:38.07:1J69PCFW Win32プログラミングスレあったっけ : デフォルトの名無しさん [sage] 2018/03/11(日) 10:51:25.22:QedwXA9H Win32API質問箱 Build124 ttp://mevius.5ch.net/test/read.cgi/tech/1510395780/ : デフォルトの名無しさん [] 2018/03/11(日) 10:55:00.37:zWe+i43K Win32APIスレは限定的だからGUI一般スレみたいなのの方を紹介しようと思ったが面倒なので 次の方どうぞ ↓ : デフォルトの名無しさん [sage] 2018/03/11(日) 11:28:30.29:1J69PCFW どうも : デフォルトの名無しさん [sage] 2018/03/12(月) 02:15:34.18:Cvix3isA 何度も呼ばれる関数内ではローカル変数をstaticにした方が速いのですか? : ◆QZaw55cn4c [sage] 2018/03/12(月) 02:19:53.88:9vbtopii 誤差だ、 プログラミングスタイルを曲げてまですることではない : デフォルトの名無しさん [sage] 2018/03/12(月) 02:23:59.34:Cvix3isA さいですか ありがとうございました : デフォルトの名無しさん [sage] 2018/03/12(月) 02:50:45.99:SGROmA8V 皆様はプログラムを遅くし過ぎない為に気をつけている事などありますか? 速さを突き詰める為の工夫というより、誤って異常に処理時間のかかるようなプログラムを作らないようにする為にはどのような事を意識すると良いのでしょうか : デフォルトの名無しさん [sage] 2018/03/12(月) 03:02:50.40:9wDOvV2B staticの方が速い理由なんて一つも無いような あまり呼ばれない場合はstaticの方が遅いよね、キャッシュ的に マルチスレッドで邪魔だし、必要がある時以外は使うもんじゃないよ : デフォルトの名無しさん [sage] 2018/03/12(月) 03:20:38.17:IdW8RVi3 メモリアクセスのコストだあ : デフォルトの名無しさん [sage] 2018/03/12(月) 03:57:56.72:SGROmA8V 多分、メモリを毎回確保し直す事や、コンストラクタを何度も呼ぶ事により処理が遅くなると考えたのではないでしょうか : デフォルトの名無しさん [sage] 2018/03/12(月) 04:48:35.89:Ajs1ZroQ 実行速度は推測ではなく測定することが鉄則だから 出来ることは気になったときに正しく測定出来るようにすることくらいだ : デフォルトの名無しさん [sage] 2018/03/12(月) 08:13:41.87:0T8K0H1S ファイルアクセスのような重い処理とか深いループの中の計算処理とかは必要に応じて適切なデータ構造やアルゴリズムをあらかじめ検討しておくけど、頻度が少なく問題にならない箇所は分かりやすさ実装しやすさ優先で無理に速度は追求しないかな。 あとは将来的に性能改善が必要になることもあり得るから基本的には柔軟性のある変更に強い設計を普段から意識しておくとか。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/12(月) 12:47:06.75:wZFlYBXj 計算量とかメモリ使用量のオーダーは気にするけど、オーダーが変わらないレベルの差はそんなに気にしてもしょうがない。 : デフォルトの名無しさん [sage] 2018/03/12(月) 16:25:47.91:JoWTM6VO ほんこれ : デフォルトの名無しさん [sage] 2018/03/12(月) 17:58:03.22:WDt4qsqW 待て待て、は速度追求の話ではないだろう 無駄なループを通らせないとかそういう話でしょ? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/13(火) 04:04:12.70:jwCzlKtk エッジケースで極端なことになってしまうって話かな? そういうのは単に気をつけるしかしゃーない。 発覚したときに直せるような体制にしておけ〜 : デフォルトの名無しさん [sage] 2018/03/13(火) 11:25:42.37:nL3Sy1ZA とりあえず注意すべきは線形探索かな 何も考えずに使われると素敵なことになる : デフォルトの名無しさん [sage] 2018/03/13(火) 11:43:48.99:WyB9s+s4 クラスAのメンバ関数へのアクセスをクラスBのみに許すにはどうすればいいですか? (メンバ関数をfriend指定するのはBがAのプライベートメンバにもアクセスできてしまうのでNGです) : デフォルトの名無しさん [sage] 2018/03/13(火) 13:15:04.74:WyB9s+s4 自己解決 passkeyイディオムを使えばいいんですね 言語仕様でサポートしてほしい気もしますが : デフォルトの名無しさん [] 2018/03/15(木) 23:07:46.82:rOhYRyTV できる人にとってはくだらないことなんだと思うのですが、 char* c; char *c; この2つは一緒なのですか? : デフォルトの名無しさん [sage] 2018/03/15(木) 23:12:48.58:jcfpYhJu char * c; とか char * c ; も含めて一緒 : ◆QZaw55cn4c [sage] 2018/03/15(木) 23:13:16.42:xYxZI4zx 一緒ですが個人的に後者を推奨します : デフォルトの名無しさん [] 2018/03/15(木) 23:21:50.62:rOhYRyTV ありがとうございます どちらが正しいのか、機能が違うのか、よくわかっていなかったのがスッキリしました : デフォルトの名無しさん [sage] 2018/03/15(木) 23:24:52.27:dUMa9unA 前者だと char* a, b; って書いたとaとbの型が変わっちゃうから常に後者方式で char *a, *b; みたく書くことをオススメする : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/15(木) 23:48:02.28:VBbQqJBt ワイはアスタリスクを型名の方に寄せて、複数の変数の宣言をまとめないスタイルを推しておるやぞ。 char* a; char* b; まあ人によって色々やね。 : デフォルトの名無しさん [sage] 2018/03/15(木) 23:48:51.41:ipLBerzI そんな迷うならtypedefしてしまえ : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/15(木) 23:52:42.60:VBbQqJBt C++ なら std::add_pointer を使うのも手やぞ。 普段から使うには綴りが長い気もするな。 : デフォルトの名無しさん [sage] 2018/03/16(金) 00:04:03.30:/SwLgzhl ワイも後ろに寄せるスタイルの方が好きやな 別に自由ではあるけど、前に寄ってるとなんか違和感あるわ : デフォルトの名無しさん [sage] 2018/03/16(金) 00:12:21.27:eqCACABM この話始まるとスレが荒れるわけだが。 俺は char *a; int & ref; だ。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/16(金) 00:27:41.31:5DWUPgeG C++ だとスッポスッポ先生が (というより D&E の文中にあるコードが) アスタリスクを型名にくっつけるスタイルで書いてあるから、 設計者的にはこれが推しなんやろなて思うたんや。 : デフォルトの名無しさん [sage] 2018/03/16(金) 00:49:37.90:7Nt6p3N1 そもそもCならまだわかるがC++になってもこの謎仕様が改善されてないのがおかしいわな : デフォルトの名無しさん [sage] 2018/03/16(金) 01:19:43.79:pAByTZwR char *a;派だがキャストは(char*)だな : デフォルトの名無しさん [sage] 2018/03/16(金) 06:18:52.71:hczQTGC7 両方に空白入れたり 両方詰めたらどうなるん : デフォルトの名無しさん [sage] 2018/03/16(金) 10:14:04.60:x1iYgKqh これ : デフォルトの名無しさん [] 2018/03/16(金) 16:35:23.76:3ma6aQHv それな 前者は誰が流行らしたんだハゲか : デフォルトの名無しさん [sage] 2018/03/16(金) 18:15:24.73:tA4eZSmU ``int* p;''と``int *p;''はどちらが正しいですか ttp://www.libjingu.jp/trans/bs_faq2-j.html#whitespace まあハゲの影響はあると思う : デフォルトの名無しさん [sage] 2018/03/16(金) 18:16:24.05:YfjbsaKN 偉い人が前で統一させてたから倣ってる : デフォルトの名無しさん [sage] 2018/03/16(金) 19:01:00.72:EjV6B4+T マイクロソフトじゃないか? : デフォルトの名無しさん [sage] 2018/03/16(金) 22:46:14.86:KxYkqF9B []演算子は変数の後ろしか置けないので迷いがない : デフォルトの名無しさん [sage] 2018/03/16(金) 22:50:13.34:r/T+njCz 変数との間に空白を入れるか入れないか選択の余地がある : デフォルトの名無しさん [sage] 2018/03/16(金) 23:05:45.65:/SwLgzhl 正直、選択の余地が無い方が嬉しい : デフォルトの名無しさん [sage] 2018/03/16(金) 23:17:53.08:7Nt6p3N1 ある意味欠陥の1つ : デフォルトの名無しさん [sage] 2018/03/16(金) 23:24:49.74:YbTBBkUF リテラルの後ろにも置ける : デフォルトの名無しさん [sage] 2018/03/16(金) 23:28:34.45:/SwLgzhl あと数字の後ろにも置けるよな確か x[2]は2[x]でも普通に動作するらしい、使ったことはないが : デフォルトの名無しさん [sage] 2018/03/16(金) 23:32:56.43:W1kNbC1+ 参照型&ってあまり使われないのか : デフォルトの名無しさん [sage] 2018/03/17(土) 02:01:02.93:UGDcJiJh 宣言の中の型としての*の位置を問題にしてるのだから、式の中での*が使える位置については別の話でしょ。 : デフォルトの名無しさん [sage] 2018/03/17(土) 17:02:13.24:B2oEmArJ インデントってタブ文字使うよりもスペース使った方がいいんですか? : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/03/17(土) 17:07:21.02:6umCop+M 見た目とコンパイル速度のどちらを優先するかによる。 : デフォルトの名無しさん [sage] 2018/03/17(土) 17:32:05.08:Ak7laUjo タブコードはエディタの設定に見た目が左右されるので使わない方がいい : デフォルトの名無しさん [sage] 2018/03/17(土) 17:39:18.45:B2oEmArJ うーん、やっぱりタブは使うべきではないんですね : デフォルトの名無しさん [sage] 2018/03/17(土) 17:41:47.51:Ak7laUjo 昔は1バイト当たり単価が高かったからね : デフォルトの名無しさん [sage] 2018/03/17(土) 20:01:33.65:hl7Y0kGo エディタの機能向上による要素が大きいな。 インデントやその削除にキーを何度も叩かなきゃならない状態だったらTABがまだ主流だったろう。 : デフォルトの名無しさん [sage] 2018/03/17(土) 22:45:16.37:NcDC59dQ 初めて知ったw : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/18(日) 04:35:20.62:7ElIFee1 他にも変な仕組みは色々とあるけど、これはひとつとして使いどころが思いつかんよな。 : デフォルトの名無しさん [sage] 2018/03/18(日) 06:08:40.04:QnqZv5w6 int a[10]; で a[5] でも 5[a] でも同じようにアクセスできるのは、 a[5] と *(a + 5) が同等で + 演算子の交換可能性から *(5 + a) も可、 それなら 5[a] も同じじゃなきゃ片手落ちだよね、って発想というか、 過去のコンパイラの実装とも関係がありそうな気がする。 もちろん、古いCコンパイラとのソース互換性が問題になるほど みんなが使ってた書き方とは思わないけど。 : ◆QZaw55cn4c [sage] 2018/03/18(日) 11:53:22.56:ojW1vPJY IOCCC … : デフォルトの名無しさん [sage] 2018/03/20(火) 16:56:43.36:PiAC+2Zr i++ と ++iって最適化すればほとんど変わらないか、あるいは++iの方がちょっと速いくらいですよね? なんでi++の方がデファクトスタンダードみたいになってるんでしょう? ほぼ無視できる程度のメリットしかないとしても、++iと書くデメリットがないと思うのですが : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/20(火) 18:20:40.65:N1yoGURK インクリメントの対象が整数しかなかった C からの習慣がなんとなく引き継がれてるだけ。 後インクリメントは気持ち悪いと考える人は少なくはないし、 値を使わないなら前インクリメントにするのは C++ では良い習慣だよ。 : デフォルトの名無しさん [sage] 2018/03/20(火) 20:17:17.59:UFFOOrdu ++C言語 : デフォルトの名無しさん [sage] 2018/03/20(火) 20:18:05.88:O958tZqO なるほど、最初はちゃんと意味があったんですね 納得できました ありがとうございます : デフォルトの名無しさん [sage] 2018/03/20(火) 22:04:48.60:+J5xJfYE Cでインクリメントやデクリメントに後置が使われがちな理由は a = *p++; みたいなポインタの使い方で手が慣れたせいもあるかと思う。 C++では性能的な理由で前置が好まれたのは指摘のとおり。 個人的には、どっちでも構わない場面ではCでは後置、C++では前置で書くかな。 特に単純なforで++iと打つと、途端にC++で書いてる気がしてくる。 : デフォルトの名無しさん [sage] 2018/03/20(火) 22:08:04.94:I2zEd3jr 本当に性能に差が出たの?測ったの? : デフォルトの名無しさん [sage] 2018/03/20(火) 23:46:13.85:ZVuOcNlA GCC 6.4.0 最適化なしで計測してみたけど、平均的な差は無いな : デフォルトの名無しさん [sage] 2018/03/21(水) 00:00:26.00:2Gb2uvWn 単純なforなら同じコード吐くんじゃね? : デフォルトの名無しさん [sage] 2018/03/21(水) 00:36:19.45:OwhHF7Zm 単純な整数型のインクリメントなら前置も後置もさが無いだろうけど、C++ではユーザー定義のクラスでインクリメントを実装できるから、 基本的には更新前のオブジェクトの状態の退避などの処理が必要な後置インクリメントよりコストの少ない前置インクリメントが好まれるのだと思うよ。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/21(水) 01:30:43.51:MouF+uE4 結果が使われないことが明らかな場合には後インクリメントのかわりに前インクリメントを呼び出すとかいったことをしても ほとんどのコードは壊れないと思うんだけど、そういうルールを言語仕様に追加するのはもう出来ないかなぁ? : デフォルトの名無しさん [sage] 2018/03/21(水) 01:40:04.19:CmybL5Dk まぁ、出来るなら既にやってるでしょ ぶっちゃけ、よっぽどシビアに速度を求める訳でないなら前置後置の差なんて気にする必要無いんじゃないかなぁ : デフォルトの名無しさん [sage] 2018/03/21(水) 19:45:28.97:2N3cG+sW そもそも速度を気にして 記述を変えるって 間違ってる気がする・・ : デフォルトの名無しさん [sage] 2018/03/21(水) 19:50:40.96:eUhtaSa6 時代は変わったか 昔はそんな事は当たり前だった : デフォルトの名無しさん [sage] 2018/03/21(水) 19:51:54.96:eUhtaSa6 機能に対して糞重いソフトが多いのも ソフトに対する価値観が変わったからか : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/21(水) 19:55:34.20:MouF+uE4 速度を気にするというのもあるけど、意味的にも無意味な処理をするってのがダサいだろ? : デフォルトの名無しさん [sage] 2018/03/21(水) 20:23:31.47:NRxI71LE お前のコードは無駄ばかり コンパイラも無駄命令を吐く そもそもCPUの動作自体が無駄ばかり そのプログラムを作るのも無駄だったり お前の存在は? : デフォルトの名無しさん [sage] 2018/03/21(水) 20:37:50.64:L8aCdycT 本スレでやれ : デフォルトの名無しさん [sage] 2018/03/21(水) 20:54:50.63:b8e3mX8M 手間が変わらず、かつデメリットもないのにその選択肢を取らない理由がなくない? 後置の方が保守性が高いとか可読性が高いならともかく、そうじゃないんだから天秤にかける必要さえない : デフォルトの名無しさん [sage] 2018/03/21(水) 20:59:28.52:CmybL5Dk それで見やすくなるなら別にいんじゃね : デフォルトの名無しさん [sage] 2018/03/21(水) 22:35:08.33:TV3lE0eZ 効率を言い出すと値を返さないインクリメント、デクリメントが標準で欲しくなる : デフォルトの名無しさん [sage] 2018/03/21(水) 22:37:05.71:D2465Z9C どんなメリットがあるので? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/21(水) 22:39:19.66:MouF+uE4 ホントは最適化でだいぶん上手いことやってくれるんやけどな。 というか最適化でやるべきことだと思う。 細かいことまでいちいち配慮しなきゃならないのは最適化技術の敗北。 仕様に [[likely]] なんて入ったのは不格好な話だ。 : デフォルトの名無しさん [sage] 2018/03/21(水) 23:03:06.41:TV3lE0eZ イテレータの++や―に戻り値があること自体設計ミス ポインタのと類似性そこまで要らんし イテレータで *it++ とか書きたくて仕方ない人もそんなに居ないだろ void型でよかった : デフォルトの名無しさん [sage] 2018/03/21(水) 23:08:57.12:52xrh1Hk アセンブラの inc やdec 命令実行時のフラグ反映は不要? 高級アセンブラの名残じゃね? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/21(水) 23:14:08.41:MouF+uE4 逆じゃないかなぁ。 ポインタをイテレータとしても使えるように一貫性を持たせたら結果的にそうなったって感じじゃないの。 どちらにしても、そこで無理に一貫性を持たせようとしてしまったことが良くなかったとは思うけど。 ちなみに operator++ の返却値を void にすることは出来ます。 : ◆QZaw55cn4c [sage] 2018/03/22(木) 00:37:09.57:2FEQ/Wa3 inc/dec でフラグが変化しないアーキがあった、というか、それが普通だと思っていたんだが : デフォルトの名無しさん [sage] 2018/03/22(木) 00:58:21.46:dLiR/Xt3 なぜポストインクリメントがよく使われるかは、 PDP-11とかのアドレッシングモードにあるオートインクリメントが起源。 間接参照したあとにレジスタが増える。 オートデクリメントは逆にプレデクリメント。 あとinc,decでフラグが変化するのもPDP当時は当然の動作。 : デフォルトの名無しさん [] 2018/03/22(木) 06:11:13.57:I/iO4/8S Linuxさあ、Ubuntuとか使ってるんだけど、俺はプログラムやネット以外にあまり PCつかわないから、Ubuntuなんてプログラム環境は大体パッケージで手に入るし スゲエ良いと思ってたんだけど、エロ動画配信サイトが今時は必ず専用の○○プレーヤーじゃないと 見れないんだな。たとえば、DMMプレーヤーとかそのサイトの専用の奴。なんでもDRMとかいう不正禁止のが 付いてて、普通のプレーヤーじゃ見れないのよ。スゲエ不便だからそれ専用にWindows10準備しちゃおうかな・・w 俺はプログラム言語でC++が一番すきです。 : デフォルトの名無しさん [sage] 2018/03/22(木) 07:05:57.55:C5Ula1AM またイミフなレスしてるのか : デフォルトの名無しさん [] 2018/03/22(木) 07:15:53.52:tiDItZ1f C--があってもいいかもしれないな。 : デフォルトの名無しさん [] 2018/03/22(木) 09:44:57.12:Q2/ylW7b C♭思い出した : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/22(木) 10:24:04.20:HExEyyqO ググればすぐにわかることだけど、有るよ。 : デフォルトの名無しさん [sage] 2018/03/22(木) 17:42:41.78:Z5xjYgF/ unordered_setやunordered_mapは reserve(size_type)はあるのにshrink_to_fit()がないのはなぜですか? : デフォルトの名無しさん [] 2018/03/22(木) 18:14:23.23:tiDItZ1f ハッシュだからじゃないの。 : デフォルトの名無しさん [] 2018/03/26(月) 20:46:12.70:qgnj+CJa void DumpCode(const char* str) { for (int i = 0; str[i] != '\0'; ++i) { printf("%02X ", (unsigned char)str[i]); } cout << endl; } ↑の文字コードを16進数で表示する関数ですが、なぜ printf("%02X ", str[i]); ではなく、 printf("%02X ", (unsigned char)str[i]); とキャストしているのでしょうか? : デフォルトの名無しさん [sage] 2018/03/26(月) 20:52:31.38:Sl5sXtlN 0x80以上の時符号拡張されてマイナスになるから : デフォルトの名無しさん [sage] 2018/03/26(月) 20:55:55.86:qgnj+CJa char型の値は 0 から 127 までであると本に書いてあるのですが。。。 : デフォルトの名無しさん [sage] 2018/03/26(月) 20:58:30.32:Sl5sXtlN その本は窓から投げ捨てろ。 ー128〜127が正解だ : デフォルトの名無しさん [sage] 2018/03/26(月) 21:01:09.95:qgnj+CJa 本にはそうは書かれていませんでした。申し訳ありません。間違っていました。 アスキー文字コードは、0から127までの値しか取らないからOKかなと思ってしまったのですが。 : デフォルトの名無しさん [sage] 2018/03/26(月) 21:02:33.45:qgnj+CJa 何か不具合が起こる例を教えていただけると助かります。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/03/26(月) 21:06:19.73:42MV7MT1 char ch = 255; printf("%d\n", ch); C/C++では、オーバーフローは警告なく普通に起こる。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/03/26(月) 21:10:11.27:42MV7MT1 signedな整数型は、最上位ビットが符号フラグになるんだ。charは8ビットの整数型で、printfに渡す過程で、符号付きのint型になる。まあ、やってみたらわかるけど、 printf("%c\n", (char)255); : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/03/26(月) 21:11:26.75:42MV7MT1 printf("%d\n", (char)255); %dね。 : デフォルトの名無しさん [sage] 2018/03/26(月) 21:42:10.96:3IjTFjn0 そんな事は決まってない : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/03/26(月) 21:52:30.42:42MV7MT1 charのビット数、CHAR_BITが8ではない環境はほとんどない。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/03/26(月) 22:00:14.93:42MV7MT1 4ビットCPUで動作するトースターのコンピューターの話でもするつもりかね。 : デフォルトの名無しさん [sage] 2018/03/26(月) 22:58:41.82:3IjTFjn0 ほとんど無いから何? 「決まってない」の反論になってないよ 現行品でcharが16bitの環境があるんだけどね : デフォルトの名無しさん [sage] 2018/03/26(月) 23:00:24.31:3IjTFjn0 charが符号付きとも決まってない ちょうど今符号無しの環境を使ってるよ : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/03/26(月) 23:02:53.12:8aZ5PUAj インテル入ってない : デフォルトの名無しさん [] 2018/03/26(月) 23:03:06.95 俺のcharは100bitあるぜ!! : デフォルトの名無しさん [sage] 2018/03/26(月) 23:04:42.66:3IjTFjn0 とりあえずを読んどけ : デフォルトの名無しさん [sage] 2018/03/26(月) 23:55:34.36:2w8Ha0HC char と signed char を混同するクソコテ : デフォルトの名無しさん [sage] 2018/03/27(火) 01:28:23.66:bCiMyjcv 今後char関連の質問をするときは、charのビット数や符号などの環境を明示しましょうということで。 初心者お断り感あるけど、重箱の隅を全力でほじくり返す人がいるからしょうがないね。 : デフォルトの名無しさん [sage] 2018/03/27(火) 01:33:34.51:GW1/xmrB unsigned char がデフォなんてMS-C 3.x or 4.xの /J オプション付き 以外に遭遇した事無いけどな : デフォルトの名無しさん [sage] 2018/03/27(火) 02:55:06.24:oddUVIdN の質問に対してcharの符号有無が環境によって異なるというのは本質的な回答であり、ビット数の話は不適切だったというだけで、重箱の隅がどうこうという話では無いだろう。 そもそも初心者歓迎のスレで初心者を除外する要件を設けるのは本末転倒では? : デフォルトの名無しさん [sage] 2018/03/27(火) 07:09:18.07:vavxlF2f ??? 環境を明示しろって言うのはにも書いてあるんだが... : デフォルトの名無しさん [sage] 2018/03/27(火) 07:42:58.98:7BdcIkqa 初心者だろうと質問に付随する前提知識は必要 変数知らんデータ型知らん制御文も分からないじゃ説明しようがない事なんていくらでもある まずそこら辺の知識を理解してもらわん事には説明できないですってのは初心者を除外とは言わんだろう : デフォルトの名無しさん [sage] 2018/03/27(火) 07:52:49.58:ofLFYE4b 回答者もわかってないからな とか : デフォルトの名無しさん [sage] 2018/03/27(火) 08:13:51.03:ofLFYE4b 4ビットCPUだとcharは4ビットと思ってんのか? : デフォルトの名無しさん [] 2018/03/27(火) 08:39:25.07:tnecWY6M 不都合と言う程の不都合か分からないけど、 単なる char が signed char のコンパイラで、例えば str[i] == -1 の時、 printf("%02X ", (unsigned char)str[i]); なら表示は "FF " printf("%02X ", str[i]); だと表示は "FFFFFFFF " (intが32bitの環境) てな具合に表示結果が指定桁数とずれて見苦しい、という現象が起きる。 ただし void DumpCode(const char* str) でASCII文字列しか扱わないなら、 意図せずASCII以外(漢字など)を含んだ文字列を引数に与えたときに 「見苦しい表示結果」のおかげで関数の使い方の間違いに気付きやすい。 よって (unsigined char) のキャストをしない方が好ましい、て考え方もある。 ARM で GCC だと、単なる char は unsigined が普通みたい。 元のCPU設計で符号付8bitが拡張機能だったことと関係あるとかないとか。 : デフォルトの名無しさん [sage] 2018/03/27(火) 08:41:45.88:7BdcIkqa 4bitのcharか、アルファベットが表現できないな まぁ、341の例だと渡されるポインタ配列が文字コードの範囲内ならキャストは要らんね なんかの理由で文字コード外の数値が入ってきた時に文字揃えがズレる事を嫌って一応キャストしたって感じだとは思うけど : デフォルトの名無しさん [] 2018/03/27(火) 09:55:59.95:dDmfqIPV int *p = new int[100]; delete[] p; delete[] p で int 100個分の領域を解放するのだと思いますが、 どうやって、 p が int 100個分の領域を指していると分かるのでしょうか? p は単なる int 型へのポインタです。 : デフォルトの名無しさん [sage] 2018/03/27(火) 10:02:58.95:GW1/xmrB つ -fsigned-char/-funsigned-char : デフォルトの名無しさん [] 2018/03/27(火) 10:03:09.61:dDmfqIPV スタックオーバーフローが起こった時に、すぐにエラーが起こらない可能性がある そうですが、なぜ、エラー終了にしないのでしょうか? : デフォルトの名無しさん [sage] 2018/03/27(火) 10:56:59.81:r9AxIBc/ 良くある実装としては newが返すアドレスの前にヘッダ情報がある : デフォルトの名無しさん [sage] 2018/03/27(火) 10:59:24.01:r9AxIBc/ (すぐに)わからないから : デフォルトの名無しさん [sage] 2018/03/27(火) 13:22:10.84:KACb5w79 素人考えだと並のOS環境ではスタックオーバーフローは自動伸長に失敗してアドレスを割り当てられない時に起こると思うから直ぐにエラー終了しそう バッファオーバーフローの場合は割り当てたメモリとバッファ境界がミスマッチなら直ぐにエラー検出できないとしても仕方がないけどこれは質問とは別の話 : デフォルトの名無しさん [sage] 2018/03/27(火) 14:41:48.71:1PffFgMm 配列への添え字アクセスの計算量はO(1)の定数時間とのことですが、これは通常の変数へのアクセスと同じということでしょうか? 例えばint型配列のfooとint型変数のbarがあったとして、 int n = foo[10000]; と int n = bar; の速度は同じですか? : デフォルトの名無しさん [sage] 2018/03/27(火) 14:55:45.68:Z/OsE5Ku 添字の値にかかわらず一定 foo[10000] と foo[1] が同じって話だぞ : デフォルトの名無しさん [sage] 2018/03/27(火) 14:59:13.83:1PffFgMm ありがとうございます だとすると、同じ添え字に何度もアクセス(読み取りのみ)する場合、一旦変数に待避させてその変数を参照した方がいいですかね? : デフォルトの名無しさん [sage] 2018/03/27(火) 15:02:49.07:jMKP3TFv レッツ実測&吐き出したコードを確認 最適化具合でも全然ちがう : デフォルトの名無しさん [] 2018/03/27(火) 15:06:05.02:dDmfqIPV 吐き出したコードってどうやって確認するんですか? : デフォルトの名無しさん [] 2018/03/27(火) 15:06:56.79:dDmfqIPV ありがとうございました。 そのあたりのことを詳しく書いてある本はありますか? : デフォルトの名無しさん [sage] 2018/03/27(火) 15:07:03.67:1PffFgMm 確かにそうですね ありがとうございます、やってみます : デフォルトの名無しさん [sage] 2018/03/27(火) 15:08:28.42:Di3KX/fh ポインタから値を読み込む場合は? : デフォルトの名無しさん [sage] 2018/03/27(火) 15:16:11.82:jMKP3TFv 使っている環境による 機械語一歩前のアセンブラも出力するオプションで出てきたアセンブラとデータシートから推定する もっと前のアルゴリズムの検討は済んでて、 もはや、枝葉を削ってでも速度を出さなきゃいけないという最終段階の話だよね? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/27(火) 17:26:05.07:6NyejsSC char 型が符号付きであってもなくても格納可能な範囲という意味では 0 〜 127 であると思って使ってれば間違いないのは確か。 あと、厳密にはマイナスの表現に 1 の補数を使ってる環境は有りうるので char が符号付きだとしても -127 〜 127 しか表現できないかもしれない。 言語仕様では文字がアスキーコードとは保証してないんだ。 ほとんどの環境ではアスキーコードかそれと互換な文字コードだろうけど、 EBCDIC とかでも言語仕様には違反しない。 : デフォルトの名無しさん [sage] 2018/03/27(火) 18:20:11.37:ofLFYE4b 並のOS環境って何だよwww 一般的なMCUのほとんどは アドレス変換テーブルの仕組みがなく スタックオーバーフローを検出するハード的仕組みも無い : デフォルトの名無しさん [sage] 2018/03/27(火) 18:21:21.80:ofLFYE4b 無知は出てくるな : デフォルトの名無しさん [sage] 2018/03/27(火) 20:25:43.43:GW1/xmrB BASIC Stamp でもやってればいいのに : デフォルトの名無しさん [] 2018/03/27(火) 22:12:36.71:gjFRbLOq 二つスレッドがある 片方はstd::queueにつんで、もう片方はそれを取る これで詰まれた瞬間に取るにはどうするのがいいのかな? 簡単に作るなら、無限ループでスリープ挟みながら取り続けることだけど、無駄も多いから積んだのをトリガーに取りたい 環境はg++とVC++です : デフォルトの名無しさん [sage] 2018/03/27(火) 23:17:24.98:7OwU1Hvz stackoverflow で、たまたまアクセスしたメモリに、 どんな値が入っているかは、誰にも分からない。 単に前に入っていた値が、入っているだけだから その値が、たまたまCPU 命令にあれば、CPU を実行するから、 エラーになるのは次の命令以降になる 一方、CPU命令に無ければ、不正な命令となり、即座にエラーとなる : デフォルトの名無しさん [] 2018/03/27(火) 23:21:17.42:dDmfqIPV スタックのメモリ領域がこの範囲からこの範囲というように管理はしていないのですか? : デフォルトの名無しさん [] 2018/03/27(火) 23:30:03.49:4E83+S2j 昔汎用メッセージポンプを検討したときのサーベイにstd::condition_variableと書いてある。 注意としてspurious wakeupというのも書いてある。 もうすっかり忘れてしまって何のことだか自分でも思い出せないのだが、「条件変数」というのがキーワードになるようだ。 : デフォルトの名無しさん [sage] 2018/03/27(火) 23:38:12.48:zFrY2ZyB してる環境もあれはしてない環境もある : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/03/27(火) 23:46:19.51:6NyejsSC ページ単位ではしていることがある。 OS がメモリの割付を管理していて、 足りなければ追加で割り当てたりもする。 割り付けてないメモリ空間に変に触ったら検出できる。 : デフォルトの名無しさん [sage] 2018/03/28(水) 06:54:26.81:fYzIlbdt スタックエリアの管理は当然してる オーバーランの監視は環境次第 ハード的に仕組みがあるものもあし ソフトで(コストをかけて)やる場合もあるし 全くしない環境もある : デフォルトの名無しさん [sage] 2018/03/28(水) 06:56:20.68:fYzIlbdt 今のWindowsとかLinuxとかならもちろん瞬時にわかる : デフォルトの名無しさん [sage] 2018/03/28(水) 10:17:21.31:qnpV2Jxp セマフォの類を使え : デフォルトの名無しさん [] 2018/03/30(金) 10:25:28.98:8epIcCej 最近のC++ってかなり進化していてTaskとかLinqなんかもできるんだろ? PCだとC#があるから C++は使わないが組み込みだとC++を使いたい。CからC++に変えてみようとおもっってテスト してみたことがあるが、メモリーを食い過ぎてStringはつかえなかった。 どこまでなら使えるんだろ? なにか目安はないか? : デフォルトの名無しさん [sage] 2018/03/30(金) 11:36:04.01:Wx9gH+Ym 組み込みなら自分で書いたものだけ使うというか STLは一切使わないのが普通じゃないか? : デフォルトの名無しさん [sage] 2018/03/30(金) 12:31:15.37:HVaF4kSp new/delete 例外 ラムダ式 は使わない もちろん規模によるけど : デフォルトの名無しさん [sage] 2018/03/30(金) 12:36:38.56:MnRWcQoL 組み込みってピンキリだからなんとも言えんわ 業務用複合機なんてそこらのパソコンより凝ったハード積んでたりするし : デフォルトの名無しさん [sage] 2018/03/30(金) 12:43:29.07:HVaF4kSp はMCU/DSPくらいの話 : デフォルトの名無しさん [sage] 2018/03/30(金) 12:47:07.67:TqB3XhjJ どれぐらいのDSP? ADSP-21573ぐらい : デフォルトの名無しさん [] 2018/03/30(金) 13:46:55.20:8epIcCej STLってC#のLinq並みに表現力があるんだろうか? Linqは最初嫌いだったが使い始めて 見ると非常に便利で驚いた。C++のSTLは全然しらなかったがWikiを読んだらなんかかなり魅力 的に見えてきた。 : デフォルトの名無しさん [sage] 2018/03/30(金) 13:52:10.17:Wx9gH+Ym 内部で new / delete 使用している stl は使わないリストに入れず new / delete は使わないリストに入れんのかよ… : デフォルトの名無しさん [sage] 2018/03/30(金) 14:08:56.04:2gx9kNrJ STLコンテナとSTLアルゴリズム どっちの話をしているんだ : デフォルトの名無しさん [sage] 2018/03/30(金) 14:25:29.65:FxYI+k+J コンテナ使わない有用なアルゴリズムってあるか あるなら使いたいからご教授ください min とかあるか : デフォルトの名無しさん [sage] 2018/03/30(金) 16:24:55.88:HVaF4kSp 内部でnew/deleteしてるものは当然含まれる 当たり前 そもそもヒープエリア自体無かったりするし あってもアロケートのみで解放機能が無かったりする 小規模組み込みでメモリを確保出来ないなんてことは想定しないし 確保解放のコストもバカにならない アドレス変換が無いから隙間だらけで連続領域が取れなくなるなんてことも心配したくない : デフォルトの名無しさん [sage] 2018/03/31(土) 14:52:31.93:2aV4tUPq 組み込みって未だにそんなメモリかつかつなの? : デフォルトの名無しさん [sage] 2018/03/31(土) 17:31:27.59:aygih7Tk そりゃ規模による : デフォルトの名無しさん [sage] 2018/03/31(土) 17:45:54.96:OaeapR1O : デフォルトの名無しさん [] 2018/04/02(月) 16:24:48.19:MJzKsai7 ヘッダファイルを作るときに、2重インクルードを防止するための対策を書けと本に書いてあります。 注意していれば、2重インクルードをせずに済むにもかかわらずなぜ、このような 対策をしなければならないのでしょうか? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/02(月) 16:30:09.86:/drqX+oD 人間の注意力なんてクソザコだからだよ。 : デフォルトの名無しさん [sage] 2018/04/02(月) 16:40:04.72:3MXga4hP 注意していれば防げるミスは、いつか必ず発生する : デフォルトの名無しさん [] 2018/04/02(月) 16:42:16.37:r6uHUG7/ 2重includeに気付いてからでも遅くない : デフォルトの名無しさん [sage] 2018/04/02(月) 20:45:42.01:JDmrHTz8 複数のヘッダで共通のヘッダの定義が必要な場合を考えてみようか : デフォルトの名無しさん [sage] 2018/04/02(月) 20:57:46.72:MJzKsai7 header_1 header_2 … header_n で共通に必要なヘッダ header_a がある。 header_1 header_2 … header_n のそれぞれの中で header_a をインクルードしている。 header_i と header_j (i ≠ j) が必要なファイル file1 がある。 というような状況でしょうか? 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) : デフォルトの名無しさん [sage] 2018/04/02(月) 21:43:19.92:JDmrHTz8 あなたはstdlib.hとstdio.hの作者です stdlib.hとstdio.hの両方でerrno.hが必要だとします あなたはstdlib.h stdio.hの中でerrno.hをインクルードしますか?しませんか? : デフォルトの名無しさん [sage] 2018/04/02(月) 22:36:25.27:7E1ezZvV 入門書にこう書きます 「studio.h や stdlib.h をインクルードする際には、事前に errno.h をインクルードすること」 どうかなとは思うが実際こういう流儀でヘッダーファイル書く人も見かける : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/02(月) 22:37:53.93:APYGmZJZ スタジオじゃなくてスタンダード・アイオーや : デフォルトの名無しさん [sage] 2018/04/02(月) 22:38:24.97:7E1ezZvV ごめんごめん : デフォルトの名無しさん [sage] 2018/04/02(月) 22:51:41.33:Y3fpn4XN なんで前半はフルで後半は省略したの? : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/02(月) 22:58:42.67:APYGmZJZ アイオー、アイオー、声を上げて : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/02(月) 23:06:11.93:APYGmZJZ Input/Output、日本語では入出力 : デフォルトの名無しさん [sage] 2018/04/02(月) 23:10:11.92:yv4S6fVx 関数名にしろヘッダーにしろ6文字の縛りって何か歴史的理由があったのだろうか? : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/02(月) 23:22:51.53:APYGmZJZ fprintfは、7文字。 : デフォルトの名無しさん [sage] 2018/04/02(月) 23:23:14.96:yv4S6fVx あー : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/02(月) 23:26:45.74:APYGmZJZ vfprintfは八文字。文字数削るメリットがあった時代だったからな。 : デフォルトの名無しさん [sage] 2018/04/02(月) 23:48:48.36:OHYuqcPP つ FORTRAN77 : デフォルトの名無しさん [sage] 2018/04/02(月) 23:55:39.95:d0d9WT+s FORTRAN77は識別子の長さが6文字以下とかの制限があったからそれに倣ったんじゃないかな : デフォルトの名無しさん [sage] 2018/04/02(月) 23:57:30.68:yv4S6fVx ありがとう FORTRAN からの流れですか : デフォルトの名無しさん [] 2018/04/03(火) 00:51:55.59:cU9BUIMs プリコンパイルヘッダが汚れたり無駄にでかくなったりするからな : デフォルトの名無しさん [sage] 2018/04/03(火) 01:02:56.47:FKLo0jPW 以下のboost::factoryを使う練習用コードにおいて ttps://wandbox.org/permlink/K1TIhC61VQztTbOd map<string, boost::function<base* (int)>> factories; とするとコンパイルエラーになり、ググって見つけた方法で map<string, boost::function<base* (int const&)>> factories; とすると何故かコンパイルが通り、問題なく動作します。 コンストラクタの引数が実際の int ではなぜ駄目なんでしょうか? : デフォルトの名無しさん [sage] 2018/04/03(火) 01:48:18.62:JvEghgri 実装依存のヘッダファイルの場合とか、ユーザに事前にincludeしろとは言えないケースもあるよ : デフォルトの名無しさん [sage] 2018/04/03(火) 02:16:15.79:1GcrBwMo stackoverflow では boost::factory が引数の参照渡しを前提にしてるから、とあるな。 実際 factory 以外の普通の関数なら問題ないし : デフォルトの名無しさん [] 2018/04/03(火) 02:31:59.43:uUh7wFma dxd9みたいにincludeすると可笑しくなるヘッダもあるしなーω : デフォルトの名無しさん [sage] 2018/04/03(火) 08:56:24.86:1fV6RHaF 先頭6文字だけ見て一意に決まることが条件で、名前の長さ自体に制限はない、 じゃなかったかな。大文字小文字は同一視で。 : デフォルトの名無しさん [] 2018/04/03(火) 11:32:26.11:R6gDm2yr _st とか _s とかごちゃごちゃ付き始めたころからつまらなくなった : デフォルトの名無しさん [sage] 2018/04/03(火) 11:42:41.83:MWvT17WL ほんとそれ : デフォルトの名無しさん [sage] 2018/04/03(火) 11:43:28.33:Z1fbtkqU 公式ドキュメントにはさらりと「技術的理由によりfunction objectに渡す引数はlvalueでないと駄目」と書いてあるのみなので、さっぱり理解できませんでした。 そもそもコンストラクタbase (int const&)は定義していないのにコンパイルが通るのが不思議・・・ 結局 boost::bind(boost::factory<derived*>(), _1); が何しているのか理解しないと先に進めなそうですね。 : デフォルトの名無しさん [sage] 2018/04/03(火) 12:17:26.04:1GcrBwMo そこ bind しなくてもいいんじゃないだろうか : デフォルトの名無しさん [sage] 2018/04/03(火) 13:48:08.68:Z1fbtkqU 引数のある関数の場合はboost::bindを使うのではないでしょうか? いちおう公式にもその例が書いてあります。 ちなみにどんぴしゃな質問がstackoverflowにあり、Answerには親切にDemoまで付けてくれてて、 速攻で解決したと糠喜びしたんですが見事にコンパイルエラーでした。 ttps://stackoverflow.com/questions/37137117/passing-arguments-in-constructor-with-boost-factory : デフォルトの名無しさん [sage] 2018/04/03(火) 15:04:56.72:rDNMxPWT 引数を部分的に何かにbindしたfunctionを作るのがbindなわけで、 (add(a,b) の a だけ1にbindしてadd1を作るとか) 何もbindせず引数の順序も同じなら factories["derived"] = boost::factory<derived*>(); で良い : デフォルトの名無しさん [sage] 2018/04/04(水) 23:06:46.13:t1HAuKeq 確かにbindのそもそもの目的はそれですよね>(add(a,b) の a だけ1にbindしてadd1を作るとか) 仰る通りの書き方でコンパイルも実行も通りました。 ただ、ググった限り引数のある場合はbindをかます例しか見つからなかったです。 「bindが必要」と明言してる人すらいて、結局よくわからないです・・・ その後、いくらコンパイルも実行も問題ないとはいえ実際のコンストラクタとは違うのを boost::function<〜> に指定するのはなんとも気持ち悪く思い、試行錯誤したところ boost::forward_adapter を使う方法を見つけました。 ttps://wandbox.org/permlink/D3Q75cgRNR43Nulc ヒントとなったのは以下のサイトでした。 ttps://lists.boost.org/Archives/boost/2017/02/232695.php 正直なぜこれで通るのか完全には理解していませんが、とりあえずの解決とします。 ご助言どうもありがとうございました。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/05(木) 03:23:00.79:3RJ8YXR4 公式にドキュメントがあるだろう。 なんでググりまくるんだ? : デフォルトの名無しさん [sage] 2018/04/05(木) 07:41:24.21:ev3xPrwL 公式ドキュメントはこれです。 ttps://www.boost.org/doc/libs/1_66_0/libs/functional/factory/doc/html/index.html ここに以下のような「stringキーzとコンストラクタのmapにコンストラクタを登録」するという方法が書いてあればよかったのですが・・・ map<string, boost::function<〜>> factories; factories["derived"] = 〜 でもboostの公式ドキュメントはこんなものというか、隅から隅まで説明しないわからない素人はお断りってやつですよね。 : デフォルトの名無しさん [sage] 2018/04/05(木) 14:37:25.23:LhrJ/WaU 質問です. 以下のようなことが書いてあるファイルを読み込んで, 文字列,数値,...,数値,数値...数値 ... str, a[0],...a[n-1],b[0],...b[m-1] という配列に入れたいです. nとmは可変の場合,どうすればよいか教えてください. スッキリとした書き方が知りたいです. std::string str; double a[n],b[m]; です. : デフォルトの名無しさん [sage] 2018/04/05(木) 14:51:56.82:8vk43UVU std::string知ってるなら std::vectorを使えば早かろう std::vector<double> a, b; a.resize(n); b.resize(m); a[0] = ... : デフォルトの名無しさん [sage] 2018/04/05(木) 14:54:56.53:AQLHpii5 可変の n, m が読み込む前に確定するのか ファイルの記述内容から n, m が確定するのか : 445 [sage] 2018/04/05(木) 15:16:31.21:LhrJ/WaU 今回はstringを見て,nとmを決めます. str="a"ならn=2,m=3のような感じです. 読み込み方が分かりません.すいません. Google先生に聞いてこんな感じのプログラムを書いてます. std::string line; std::ifstream infile("hoge.dat"); std::getline(infile,line); sscanf(line.data(),...//どう書くの? : デフォルトの名無しさん [] 2018/04/06(金) 18:11:46.66:CDFchtjR void Show(const IntArray& array){ ... } というような関数内で、 array の const メンバ関数ではないメンバ変数を変更しないメンバ関数を 使っているとコンパイルエラーになりますが、それはなぜでしょうか? コンパイラーはarrayのメンバ関数がメンバ変数を変更していないことはソースコードから 分かるのではないでしょうか? そういうチェックをするコンパイラを作るのは難しいからということでしょうか? : デフォルトの名無しさん [] 2018/04/06(金) 18:16:26.47:CDFchtjR const メンバ関数の中でメンバ変数の内容を変更しているとコンパイルエラーになります。 ということはどのみちメンバ変数を変更しているかどうかはチェック可能ということですよね? : デフォルトの名無しさん [] 2018/04/06(金) 18:17:58.47:KjpzCJso void Show(IntArray& const array) : デフォルトの名無しさん [sage] 2018/04/06(金) 19:04:45.09:zGB1Hjc3 コンパイル単位を越えたらチェックするのは難しいし言語の壁を越えたら不可能に近いから 中途半端な事をするくらいならconst明示されてるかという線引きの方が分かり易い : デフォルトの名無しさん [sage] 2018/04/06(金) 19:43:28.40:EFVHWowI 難しいというか不可能だからですよ 呼び出す関数はまだコンパイルされてないかもしれないしまだソースコードもないかもしれない : デフォルトの名無しさん [] 2018/04/07(土) 02:18:30.08 メンバ変数を変更しないなら素直にメンバ関数にconst付けれや : デフォルトの名無しさん [] 2018/04/07(土) 12:11:18.49:BRhgC8GS コンタミュ連鎖地獄ω : デフォルトの名無しさん [sage] 2018/04/08(日) 06:44:19.17:fQMOYFpe の質問者は、分割コンパイルにまだ慣れてないと思えるなぁ。 ソースファイルを分けてみればピンと来るかと。 片方をソースなしのオブジェクトやライブラリにしないとダメかな。 : デフォルトの名無しさん [] 2018/04/08(日) 07:56:39.59:peS6i82l C#のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに 戻るようにするにはどうした出来ますか? : デフォルトの名無しさん [sage] 2018/04/08(日) 08:06:10.70:hcdQKQ5m COM使えばできるけど、スレタイも読めないお前にできるかどうかはわからん : デフォルトの名無しさん [] 2018/04/08(日) 08:13:28.62:peS6i82l そんなことは当たり前ですね。その方法が説明できますか? : デフォルトの名無しさん [sage] 2018/04/08(日) 08:25:17.68:28momF5z できるがスレチだからな : デフォルトの名無しさん [sage] 2018/04/08(日) 08:29:30.70:fQMOYFpe C#のことはC#のスレッドで尋ねればいいでしょ、てお話。 C/C++のスレッドに質問を持ち込むより確実で早いと思うよ。 : デフォルトの名無しさん [] 2018/04/08(日) 08:37:40.87:peS6i82l あ、ごめん。++が#に見えた。でも普通は++を#に書き間違ったんだろうと判断すると 思うが。 : デフォルトの名無しさん [] 2018/04/08(日) 08:39:38.92:peS6i82l ところでC++のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに 戻るようにするにはどうした出来ますか? : デフォルトの名無しさん [sage] 2018/04/08(日) 08:44:37.90:TD+h4nB6 判断する訳ねーだろガイジか : デフォルトの名無しさん [sage] 2018/04/08(日) 08:50:08.72:D3gITJpj CreateProcess() win32API スレへgo : デフォルトの名無しさん [] 2018/04/08(日) 08:56:58.76:peS6i82l thanks yey! : デフォルトの名無しさん [sage] 2018/04/08(日) 08:58:12.94:hcdQKQ5m : デフォルトの名無しさん [] 2018/04/08(日) 09:14:13.86:peS6i82l it is conditional on your ability, although its mean applying in the case of a usual Japanese. : デフォルトの名無しさん [sage] 2018/04/08(日) 09:23:25.66:tUhRYmJS 真性の障害者手帳持ちだったか : デフォルトの名無しさん [] 2018/04/08(日) 09:44:32.26:nHJNjK41 main関数の中でstaticを使う意味は何でしょうか? ロベールの本のpp.318-319にそのような例が出てきて意味不明です。 : デフォルトの名無しさん [sage] 2018/04/08(日) 11:18:10.91:4aXSD6ZQ キチガイに触るな : デフォルトの名無しさん [sage] 2018/04/08(日) 11:47:04.28:fQMOYFpe ロベールの本を持ってないんで、適切な回答じゃないかもしれんが。 main() 関数の中でstatic変数を使う意味といえば、 単純型の初期化の処理時間を回避したいか、 セクション(変数のメモリ配置)の説明のためか、 「staticなインスタンスのコンストラクタはmain()より前に実行される」 ていう話の前フリかなぁ。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/08(日) 13:50:30.74:RvzgDq0H ローカル変数に static 変数が付いていた場合は最初に通過したときに初期化されるルール。 (コンストラクタもそのときに走る。) これは C のときから変わってないよ。 : デフォルトの名無しさん [sage] 2018/04/08(日) 14:41:24.43:b4O4Usd0 普通に考えると、 単にスコープをローカルにしたいってのがまず考えられる : デフォルトの名無しさん [sage] 2018/04/08(日) 14:46:24.29:drN9+cfC 横からだけど訂正乙 初心者が読んで間違えて覚えるので、初心者スレでは嘘を書かないように特に気をつける必要ある : デフォルトの名無しさん [sage] 2018/04/08(日) 15:12:26.18:nkM5b3tX mainの中だから意味無い っつーかstaticは二つの意味があって全然別物 スコープと性的と混ぜるな危険 : デフォルトの名無しさん [sage] 2018/04/08(日) 15:18:18.11:4aXSD6ZQ 覗きでもやってんのか? : デフォルトの名無しさん [sage] 2018/04/08(日) 15:20:01.32:drN9+cfC は 関数内でstatic変数を使うのは静的変数のスコープを関数ローカルにしたいからでは、 というごく当たり前の文意だろ普通に読むと。 どう読むと 関数内だからファイルローカルの話とか関係ない!勘違いするな!となるんだよ 自分以外は文法もセマンティックもろくに知らないという前提はやめるべき : デフォルトの名無しさん [sage] 2018/04/08(日) 20:18:51.07:B7amW+qm スコープはmaim( )内にしたいけどスタックは使いたくないってケースかな : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/09(月) 01:15:21.26:fbTUuQs/ ウェブ版をざっと探してみたら main 内で satatic 変数を使ってるのはこれだけだったんだけど、 これのことか? ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02037.html : 472 [sage] 2018/04/09(月) 08:00:59.66:4Qmw3/oH 関数スコープのstaticなクラス・インスタンスのコンストラクタは main()以前でなく、最初にその部分が実行されたときに初期化されるんだっけか。 static なら一律にmain()の前、基本型や単純な構造体のstaticはロード時に初期化、 だと勘違いしていた。 訂正してくれてありがとう。そして間違ったことを書いてすまぬ。 : デフォルトの名無しさん [sage] 2018/04/09(月) 08:28:16.55:arNj8dw4 初期化が固定データのメモリコピーで済むものはロード時に初期化するコンパイラが普通 : デフォルトの名無しさん [sage] 2018/04/09(月) 14:14:56.77:iBEYls0Z いつやっても同じものはいつやっても同じだからな : デフォルトの名無しさん [] 2018/04/09(月) 15:10:57.47:cuDt6une ありがとうございます。本とは内容が違うようです。 int main() { static const double ARRAY1[] = {1, 2, 3, -1}; static const double ARRAY2[] = {0.5, 1.5, ,-1}; static const double ARRAY3[] = {-1}; static const double* const ARRAY[] = {ARRAY1, ARRAY2, ARRAY3}; … } というコードが該当箇所です。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/09(月) 15:13:59.63:4wbW7ji0 staticを付けなければスタックに確保されるかもしれない。その場合、どうしても遅くなる。 : デフォルトの名無しさん [sage] 2018/04/09(月) 15:16:14.76:cuDt6une でも、速さがどうとかいうことについては何も書いていないんです。 staticを付けていることについては何の説明もありません。 : デフォルトの名無しさん [sage] 2018/04/09(月) 15:31:05.83:iBEYls0Z はきちんとした回答だと思うよ。 配列が大きくなれば顕著になる。 「その本に書かれていないから」と拒絶するのは憲法に基づいて自由だけど : デフォルトの名無しさん [sage] 2018/04/09(月) 15:38:58.45:7w9BViIO 定数だからstatic constにした というだけのことでそれ以上の意味はないと思うが : デフォルトの名無しさん [sage] 2018/04/09(月) 15:39:52.73:Cpp6LEO8 その変数をコンパイル時点で確定しようとしている。 ローディング時間も早くなる : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/09(月) 15:40:56.15:fbTUuQs/ だぶんだけど、 が言おうとしているのは「 だとしたら入門書としては不親切だよね!」って話じゃねーの。 : デフォルトの名無しさん [sage] 2018/04/09(月) 15:57:19.85:XexqtlKa ROMとRAMに別れてる環境、 つまりほとんどの小規模な組み込み環境だと static const は通常ROMに配置される 要するにRAMの節約 速度は逆にRAMの方が速いのが普通 : デフォルトの名無しさん [] 2018/04/09(月) 16:42:59.75:cuDt6une クラスの定義をヘッダファイルに書くときに、 privateなメンバまで書くのはなぜですか? 必要ないように思います。 : デフォルトの名無しさん [sage] 2018/04/09(月) 16:45:14.78:cuDt6une みなさん、ありがとうございました。 速度について気にしているのなら、ロベールにはそう書いてほしかったです。 例では、非常に小さな配列ですから速度について気にしていることは読み取りにくい ように思います。 定数だから const にしたというのなら分かるのですが、なぜstaticをつけるのでしょうか? : デフォルトの名無しさん [] 2018/04/09(月) 16:46:43.49:cuDt6une private なメンバはむしろ、クラスのメンバ関数を実装する .cpp ファイルに書いた方がいいように思います。 : デフォルトの名無しさん [sage] 2018/04/09(月) 16:48:38.97:EW8VU1tO sizeof で大きさ取れなくなるね : デフォルトの名無しさん [sage] 2018/04/09(月) 16:50:38.53:cuDt6une なるほど、ありがとうございました。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/09(月) 16:52:05.66:4wbW7ji0 pimplイディオムで、クラス詳細を隠蔽できるよ。 : デフォルトの名無しさん [sage] 2018/04/09(月) 18:17:18.89:R2K+YmFs あの部分では特別に速度を意識した記述ではなく普通に意識する程度の事だから一々説明されないということではないかな 速度や使用メモリを気にするのはCやC++プログラマの癖または習慣みたいなもので特にロベールみたいな昔の人は体に染み付いているだろうからね : デフォルトの名無しさん [sage] 2018/04/09(月) 18:28:43.00:arNj8dw4 今回はたまたまmainであり、 たまたま小さなデータだったというだけで、 より汎用性の高いコードにするのはプログラミングの基本 staticを付けるメリットは ・データ構造の初期化が1回(ROMだと0回)で済む ・スタックを浪費しない ・関数を抜けてもデータが保持される ・番地が固定 デメリットは ・関数を通らなくても初期化される ・関数外でもメモリを使う : デフォルトの名無しさん [sage] 2018/04/09(月) 18:32:13.19:arNj8dw4 一番重要なのは PCプログラムしかやらない人は知らないだろうけど : デフォルトの名無しさん [sage] 2018/04/09(月) 18:49:30.99:m9zaOBXx test2の形だと上手く動作しないのですが何故でしょうか 環境はvc6とstlport521です void test1(const char* cstr, ...) { char buf[1024]; va_list args; va_start(args, cstr); vsprintf(buf, cstr, args); va_end(args); printf(buf); } void test2(std::string str, ...) { const char* cstr = str.c_str(); char buf[1024]; va_list args; va_start(args, cstr); vsprintf(buf, cstr, args); va_end(args); printf(buf); } void main() { test1("hello1 %d\n", 123); test2("hello2 %d\n", 123); } //結果 //hello1 123 //hello2 1819043176 : デフォルトの名無しさん [sage] 2018/04/09(月) 18:56:07.59:arNj8dw4 引数を std::string &str, ... にすればなおる : デフォルトの名無しさん [sage] 2018/04/09(月) 19:06:25.54:m9zaOBXx 引数を参照とポインタでも試してみましたが結果は変わらなかったです void test3(std::string& str, ...) { const char* cstr = str.c_str(); ・・・ void test4(std::string* str, ...) { const char* cstr = str->c_str(); ・・・ void main() { ・・・ std::string str3("hello3 %d\n"); test3(str3, 123); std::string str4("hello4 %d\n"); test4(&str4, 123); } //結果 //hello1 123 //hello2 1819043176 //hello3 1819043176 //hello4 1819043176 : デフォルトの名無しさん [sage] 2018/04/09(月) 19:14:40.36:arNj8dw4 va_start(args, cstr); なんでcstr? : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/09(月) 19:15:26.84:4wbW7ji0 va_startの指定が間違ってる。 : デフォルトの名無しさん [sage] 2018/04/09(月) 19:22:49.12:m9zaOBXx ああなんとなく意味が分かってきました va_startはマクロであってcstrの部分は引数の変数名が指定されなければならないということですかね : デフォルトの名無しさん [sage] 2018/04/09(月) 19:41:37.65:m9zaOBXx こういうコードにすると期待した動作をするようになりました ありがとうございました void test5(std::string str, ...) { char buf[1024]; va_list args; va_start(args, str); vsprintf(buf, str.c_str(), args); va_end(args); printf(buf); } void main() { ・・・ test5("hello5 %d\n", 123); } //結果 //hello1 123 //hello2 1819043176 //hello3 1819043176 //hello4 1819043176 //hello5 123 : デフォルトの名無しさん [sage] 2018/04/09(月) 19:45:39.82:yhCzF70B ついでに言うと va_start の第二引数については仕様上結構な制限、 各 argument に課される制約と同じ制約がある 配列はダメ、参照はダメ、基本型が格上げされる型との互換性が必要、など 最後のはクラスオブジェクトや float はダメということ 仕様として結果が不定なだけで違反してもエラーにはならないし 意図した通りに動くことも多い 詳しくは default argument promotions va_start で検索 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/09(月) 20:00:39.54:4wbW7ji0 va_listとC++は、相性が合わないんだよな。呼び出し側でc_str()するとか。 : デフォルトの名無しさん [sage] 2018/04/09(月) 20:14:56.03:arNj8dw4 相性が合わない : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/10(火) 00:44:35.92:141aKXKv 特に強い理由がなければ variadic template を使った方が安全だし簡単に書ける。 template<class... T> void test6(std::string str, T... args) { char buf[1024]; std::sprintf(buf, str.c_str(), args...); std::printf(buf); } : デフォルトの名無しさん [sage] 2018/04/10(火) 08:29:44.17:aAychsYe strがなんで値渡し? アホなの? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/10(火) 11:04:36.10:141aKXKv クソザコです : デフォルトの名無しさん [sage] 2018/04/10(火) 21:38:17.71:sbGIaKQd なにこのバッファ溢れさせてくださいって釣り針 : デフォルトの名無しさん [sage] 2018/04/11(水) 07:10:13.25:5X4H9iqq 色々とクソコテクオリティ : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/11(水) 11:17:54.25:ZSzBt9iE えー、可変長引数の例にしただけなので、そんなどうでもいいとこを言われても困るよ。 : デフォルトの名無しさん [sage] 2018/04/11(水) 12:37:28.30:FCilzVhB そう言うところにしか突っ込めない雑魚の相手するなよ... : デフォルトの名無しさん [sage] 2018/04/11(水) 12:58:23.58:0UD5Vzkt わざわざ互換性を下げなくてもいいのに : デフォルトの名無しさん [sage] 2018/04/11(水) 21:16:27.05:0UD5Vzkt なんでbufに一旦書いてるの? 直接printfじゃだめなん? : デフォルトの名無しさん [sage] 2018/04/11(水) 21:20:49.36:yjo2onbY 実行目的ならvprintf使うんじゃね? : デフォルトの名無しさん [sage] 2018/04/11(水) 21:29:16.68:0UD5Vzkt 普通はね クソコテがコードサイズ、互換性、実行速度など 全て犠牲にしてもテンプレートを使いたかったみたい : デフォルトの名無しさん [sage] 2018/04/11(水) 21:46:51.95:4xNEGOrU va_start の第2引数の型の制限を知らなくてもor気にしなくても良いように C++ らしく va_start 使わない例を出したんだろ… と書いてはみたが、 そういう意図が通じるわけないか 通じる人は最初からわかってるもんな : デフォルトの名無しさん [sage] 2018/04/11(水) 21:49:14.05:4xNEGOrU そもそも何でbufにって質問は コメント元のにすべきだろ : デフォルトの名無しさん [sage] 2018/04/11(水) 21:50:42.77:IGuJq2PQ こんな辺境ですらイキリ散らすなんて呆れる他ありませんわ : デフォルトの名無しさん [sage] 2018/04/11(水) 21:54:51.56:5X4H9iqq 誰も求めてないwww : デフォルトの名無しさん [sage] 2018/04/11(水) 22:01:42.55:5X4H9iqq 危険てんこ盛りなコードの危険性が低い部分をなおしてどうすんの?アホなの? オナニーは隠れてやれ : デフォルトの名無しさん [sage] 2018/04/11(水) 22:53:04.70:4xNEGOrU c++ スレで variadic template 紹介されてこの反応 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/12(木) 00:24:16.88:csgoYI7G 危険性が高いかどうかは重要じゃなくて、話題のテーマに近いかどうかだろ。 本題に関係ないところなんてどうでもいいじゃないの。 : デフォルトの名無しさん [sage] 2018/04/12(木) 02:27:29.73:iYyApZ27 とvariadic templateは関係ないわけだが : デフォルトの名無しさん [sage] 2018/04/12(木) 02:36:35.20:iYyApZ27 わざわざ環境まで書いてあるのに アホですね : デフォルトの名無しさん [] 2018/04/12(木) 10:41:06.56:KhnSMF/h const double const ARRAY[] = { 3, -1 }; const double ARRAY[] = { 3, -1 }; の違いを教えてください。 : デフォルトの名無しさん [sage] 2018/04/12(木) 10:48:56.23:ySRK5Kj5 ポインタ変数なら ・変数も指し先も書き換えられない ・変数は書き換え可能。 指し先は書き換えられない のパターンだけど 対象が配列の場合、元々変数の書き換えができないから同じ意味じゃないかと : デフォルトの名無しさん [sage] 2018/04/12(木) 12:23:14.02:aCAyQDuf > const double const ARRAY[] = { 3, -1 }; コンパイルエラーにならないんだっけ? : デフォルトの名無しさん [] 2018/04/12(木) 12:25:36.92:KhnSMF/h ありがとうございました。 Visual Studioではコンパイルエラーになりません。 : デフォルトの名無しさん [sage] 2018/04/12(木) 14:29:59.20:ZdndFYj4 あいうえお : デフォルトの名無しさん [sage] 2018/04/12(木) 14:43:04.91:Htzfym0f おこそとの : ◆QZaw55cn4c [sage] 2018/04/12(木) 15:19:35.63:4odEe1Tq とりなくこえすゆめさませ : デフォルトの名無しさん [sage] 2018/04/12(木) 21:59:02.17:nMaemNOx const double const a[]; は const double a[]; と同じ意味 const const double const const a[]; なんて書いてもいいし double const a[]; と書いてもいい const typename と typename const と同じ しかもconstはいくつ書いてもいい : デフォルトの名無しさん [sage] 2018/04/13(金) 10:38:13.53:roGFrSR8 Win32のBOOL型を返す関数を複数回呼んで、 すべて成功したときのみTRUEを返したいのですが (途中で失敗しても関数自体はすべて呼んでおく)、 BOOL Test() { BOOL bResult = TRUE; bResult &= Api(...); bResult &= Api(...); bResult &= Api(...); return bResult; } と書いてとりあえず動くのですが、よく考えたら&=はビット演算だし、 Win32のBOOL関数は成功時にTRUEを返すとは書いていないので、 例えば関数が成功時に2を返すパターンがあったら、 すべて成功しても戻り値はFALSEになるのではと思っています。 この場合、 bResult = Api(...) && bResult; bResult = Api(...) && bResult; bResult = Api(...) && bResult; みたいな書き方をするしかないのでしょうか。 : デフォルトの名無しさん [sage] 2018/04/13(金) 10:57:04.94:UdLtdLwz result &= !!api(...); という風に!!を使うのも zero, non zero を false/true に正規化するイディオムだけど、 何にしても見た目は汚いと思う 文字数は増えるがif文を使って if (!api()) result=false; の方が可読性高いかもしれない : デフォルトの名無しさん [sage] 2018/04/13(金) 11:38:56.36:OgXHMhZG 成功した回数をカウントして呼び出す関数が3つなら3でTRUEにするかな BOOL Test() { int count = 0; if(Api() != FALSE) count++; if(Api() != FALSE) count++; if(Api() != FALSE) count++; if(count == 3) return TRUE; } : デフォルトの名無しさん [sage] 2018/04/13(金) 12:44:10.91:mVcRE5FO 結果を std::vector にでもまとめておいて、 std::all_of で全てがFALSEでないことを確認するとか。 : デフォルトの名無しさん [sage] 2018/04/13(金) 12:50:27.67:UkpF6ptq > bResult = Api(...) && bResult; > bResult = Api(...) && bResult; > bResult = Api(...) && bResult; これでいいと思う 3個位ならいいけどたくさんになると数え間違いとかやらかしそう : デフォルトの名無しさん [sage] 2018/04/13(金) 14:35:54.06:OgXHMhZG 1年後の自分がやらかしそうだわw : デフォルトの名無しさん [sage] 2018/04/13(金) 14:37:30.50:eQfDSJES 普通に&で繋げてしまえば。 return Api()&Api()&Api()...; : デフォルトの名無しさん [sage] 2018/04/13(金) 14:44:49.05:lxf6ix6+ そもそもの質問のキモがわかってないよ : 539 [sage] 2018/04/13(金) 15:24:49.14:roGFrSR8 みなさんご意見ありがとうございます。 例を簡略化しすぎてしまいましたが、処理は状況によって分かれるため、 常に同じ関数が3回というわけではありませんでした。 失礼しました。 bResult = Api(...) && bResult; の書き方自体は、そこまで汚いわけではないのですね。 同じような書き方をしているソースも、検索してみたら出てきました。 個人的には、 bResult &&= Api(...); のような記述ができるとありがたかったです。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/13(金) 16:20:54.65:RMqAMM1S こういう手段もあるぞ。 bResult *= Api(...); 一度 0 になったら何をかけても 0 だ。 : デフォルトの名無しさん [sage] 2018/04/13(金) 16:33:04.14:cn4ajNkQ &&= と書けないことをこの質問で知ったわ。 「返り値が0でなければ成功」の関数で変テコな返り値が来ると 組み合わせでダメになるかも。 256 * 256 == 65536 で オーヴァーフローして0、みたいな感じ。 : デフォルトの名無しさん [sage] 2018/04/13(金) 16:33:39.54:aZorcSvM 明確なメリットが無いのに、 無駄にトリッキーなコードを書くのはおすすめしない : デフォルトの名無しさん [sage] 2018/04/13(金) 16:39:34.39:aZorcSvM 数が少なく重要な箇所であれば、 デバッグ用コードを追加しやすい以下で良い if (!Api(...)){ bResult = FALSE; } ... 数が少なく重要じゃなければ で良い 数が多ければ色々と工夫しようか : ◆QZaw55cn4c [sage] 2018/04/13(金) 16:44:07.64:fORiWt/O 適当なニ数をかけたら 0 になってしまった、とかはあり得るのでしょうか? …んー、ないな、何故ないのだろう? : デフォルトの名無しさん [] 2018/04/13(金) 17:53:26.34:ledbPVdv 基底クラスのメンバ関数に virtual をつけないことってあるんですか? つけてもつけなくてもどちらでもいいという場合はあると思いますが、 つけちゃいけないという場合が考えにくいのですが、そういう場合は あるのでしょうか? : デフォルトの名無しさん [] 2018/04/13(金) 17:55:06.07:ledbPVdv 逆に言うと、今のC++でvirtualをつけた場合の機能をvirtualをつけなかった場合の デフォルトの機能にすればいいのにと思います。 どうでしょうか? : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/13(金) 17:56:07.81:meZ//aXI 仮想メソッドは、最適化がなければ関数ポインタのように確保されるので、不必要なものはメモリーの無駄になる。 : デフォルトの名無しさん [sage] 2018/04/13(金) 17:58:31.25:ledbPVdv virtualはつけなくてもかまわない場合には付けない方がいいということなんですね。 ありがとうございました。 : デフォルトの名無しさん [sage] 2018/04/13(金) 19:32:26.21:UkpF6ptq オーバーフローで0とか : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/13(金) 21:02:41.55:RMqAMM1S せやな。 普通はないと思うが、無いと言い切ることもできない。 ここまでいろんな案が出てるけど、なんだかんだで が自分で結論出してるのがベストだと思う。 書き方の話なら、マクロでもクラスでも適当なものでラップすれば見栄えはどうとでも出来ることだし。 : デフォルトの名無しさん [sage] 2018/04/13(金) 21:13:39.42:ko86uHhA 浮動小数点ならダーティー0とかあるけど 普通は意識しないでしょうねぇ : デフォルトの名無しさん [sage] 2018/04/14(土) 00:48:59.29:qJeIaUAA 今回は「非ゼロ」が様々な数値である場合について考えているわけだから 0x80000 等掛けたらゼロになるケースを意識しないのはむしろ不自然 : デフォルトの名無しさん [] 2018/04/14(土) 01:08:45.20 int64_t 使えばいいだろwww ケチケチすんなってwwwww : デフォルトの名無しさん [sage] 2018/04/14(土) 03:21:52.45:yJ5VtHzf 4つ掛けたらアウトじゃん ほんとうにバカだなあ : デフォルトの名無しさん [sage] 2018/04/14(土) 05:40:34.13:DUdlBUp3 汚い書き方とまでは言わないけど、個人的にはあまりいいやり方だとも思わないかな。 俺もC, C++を覚えた当初はなるべく冗長な記述を省くことが正義であると考えていたけど、 そのうち高々数文字削ることなんかより、素直に可読性や保守性が高い記述をする方が美しいと感じるようになったよ。 : デフォルトの名無しさん [sage] 2018/04/14(土) 07:52:50.53:Fxbc5uis !か!!使えば1か0にしかならんからそれかけるとか : デフォルトの名無しさん [sage] 2018/04/14(土) 08:44:41.44:whWbsAFN それをシフトと組み合わせると、エラー箇所までわかって便利だね : デフォルトの名無しさん [sage] 2018/04/14(土) 10:42:40.78:pziCCgl7 補足すると、仮想関数は呼び出しのコストも同じ理由で非仮想のメンバ関数より高い(わずかだけど あと、仮想関数が一つでもあるクラスは、そのクラスのオブジェクトの先頭に仮想関数テーブルへのポインタが入る つまり純粋にメンバ変数のデータ通りのメモリイメージになるクラスが作れなくなる virtualかどうかを選ぶ余地があるってことは選ぶ必要があるということだよ : デフォルトの名無しさん [sage] 2018/04/14(土) 11:38:28.43:aYmqXLA5 ネタだろうけど、ほんとにそれが必要としてもよほどメモリーに困ってるのでないならとかでいいだろ : デフォルトの名無しさん [sage] 2018/04/14(土) 11:59:10.38:gkV4B+Je メモリをけちるとかそんなけちな理由じゃない : デフォルトの名無しさん [sage] 2018/04/14(土) 12:05:20.64:whWbsAFN selectって知っている? : デフォルトの名無しさん [sage] 2018/04/14(土) 12:31:15.66:aYmqXLA5 select? その時代の知識で止まってるの? : デフォルトの名無しさん [sage] 2018/04/14(土) 17:00:09.46:6q9VmxFv a=1に対して、 cout << a << a++なら21 cout << a++ << aなら12 cout << a++ << a++なら21 と表示されました。 coutはどんな順番で評価されているのでしょうか? : デフォルトの名無しさん [] 2018/04/14(土) 18:21:04.74 確かに以下は ttps://ideone.com/sBACG3 21 12 21 と表示される でも、手元のVC 2017 / Windows 10 では 11 12 11 と表示された g++ x86_64-posix-seh 7.1.0 / Ubuntu 16.04.3 LTS on Windows 10 では 11 12 12 と表示された : デフォルトの名無しさん [] 2018/04/14(土) 18:31:12.32 ttp://codepad.org/KVv4KD8O ではコンパイルエラーになった。 cc1plus: warnings being treated as errors In function 'void test1()': Line 6: warning: operation on 'a' may be undefined In function 'void test2()': Line 12: warning: operation on 'a' may be undefined In function 'void test3()': Line 18: warning: operation on 'a' may be undefined ttp://techtipshoge.blogspot.jp/2012/01/c.html ttp://www.kouno.jp/home/c_faq/c3.html ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html こんな書き方をするなってことだね : デフォルトの名無しさん [sage] 2018/04/15(日) 00:38:00.30:/OvgYAab いくつかの例外を除いて式中の各項が評価される順序は決まっていないので、 評価される順を知りたいのなら実際にコンパイルされた結果のコードや挙動を見て調べるしかない。 : デフォルトの名無しさん [sage] 2018/04/15(日) 08:36:03.86:IUBKEb9a 未定義動作になるから、今回のコンパイル時と次回のコンパイル時とで 同じ順序で評価されない可能性もある、じゃないかな。 実際のところ、コンパイルごとに評価順が変化するとも思えないけど。 いずれにせよ「未定義動作は避けろ」が間違いない方針だわね。 : デフォルトの名無しさん [sage] 2018/04/15(日) 09:17:15.75:CIuag2/D おお、「未定義動作となること」を検出してコンパイルエラーにする環境もあるんだな : デフォルトの名無しさん [] 2018/04/15(日) 10:08:58.88:c4dXLki+ class Base { public: void A(); protected virtual void B(); } void Base::A() { B(); } void Base::B() { cout << "Base" << endl; } class Derived : public Base { protected virtual void B(); } void Derived::B() { cout << "Derived" << endl; } Base b; b.A(); ⇒ 「Base」が表示される。 Derived d; d.A(); ⇒ 「Derived」が表示される。 b = d; b.A() ⇒ 「Base」が表示される。 : デフォルトの名無しさん [] 2018/04/15(日) 10:11:08.98:c4dXLki+ b = d; b.A() ⇒ 「Base」が表示される。 ↑で、なぜ、「Derived」が表示されないのでしょうか? ロベールの本に、 「仮想関数はどんな状況でもそのオブジェクトの本来の型のものが呼ばれる」 と書いてあります。 : デフォルトの名無しさん [sage] 2018/04/15(日) 10:29:12.58:VXOW+WoG void Base::A() { B(); } void Base::B() { cout << "Base" << endl; } A() の中で、B() を呼んでいるから A(), B() は異なる関数なのに、呼ぶなんてあり得ないだろ。 こんなコーディングはしない : デフォルトの名無しさん [sage] 2018/04/15(日) 10:37:36.78:sXJBpbWg バカを装った荒らしか本当のバカか : デフォルトの名無しさん [] 2018/04/15(日) 10:41:29.91:c4dXLki+ よく分かりません。 ポリモーフィズムというのがありますが、その考え方だと b = d; b.A() ⇒ 「Derived」が表示される。 のではないかと思ってしまいます。 : デフォルトの名無しさん [] 2018/04/15(日) 10:59:34.87:c4dXLki+ Base::B() の virtual を削除する: class Base { public: void A(); protected void B(); }; すると、 Base b; b.A(); ⇒ 「Base」が表示される。 Derived d; d.A(); ⇒ 「Base」が表示される。 : デフォルトの名無しさん [sage] 2018/04/15(日) 11:27:00.75:ZEcSoj1Y ポインタじゃなくて実体をBase bに代入(コピー)したらDerivedじゃなくなるのは当然。「スライシング」でググれ。 : デフォルトの名無しさん [sage] 2018/04/15(日) 11:33:52.43:q/GS/gh9 スライシングとも別の問題のような : デフォルトの名無しさん [sage] 2018/04/15(日) 11:52:13.52:igXjAIRS bの型がBaseだからだろ? : デフォルトの名無しさん [sage] 2018/04/15(日) 12:16:46.54:VXOW+WoG まずこの本で、オブジェクト指向を学ぶ。 スッキリわかる Java入門 第2版、2014 最難関のC++ で、オブジェクト指向を学ぶなんて、夢のまた夢w 軽く、数年を無駄にするだけ C++ なんて、偏差値70以上しか無理やのに : デフォルトの名無しさん [] 2018/04/15(日) 12:34:26.84 > b = d; > b.A() ⇒ 「Base」が表示される。 Base bp; bp = &d; b->A(); こうやね : デフォルトの名無しさん [] 2018/04/15(日) 12:35:11.72 間違えた Base *bp; bp = &d; b->A(); : デフォルトの名無しさん [] 2018/04/15(日) 12:36:47.16:c4dXLki+ ありがとうございました。 C++が難しいというのは、設計が悪いからですか? C++と同等の機能を持った言語で、C++よりも分かりやすい言語を新たに 設計することは無理ですか? : デフォルトの名無しさん [] 2018/04/15(日) 12:37:23.54:c4dXLki+ ありがとうございました。 試してみようと思います。 : デフォルトの名無しさん [] 2018/04/15(日) 12:43:40.81:c4dXLki+ 理由があってC++を習得するのが難しいのならOKですが、設計が悪いから 難しいということになると、利用者にとっては迷惑な話ですね。 : デフォルトの名無しさん [sage] 2018/04/15(日) 13:30:31.42:VXOW+WoG C++ は、何でも出来るようにしているから、ルール数が100以上ある さらに、ルールAでは、B, C は除くとか、 1つのルールが、他のルールとからむから、 非常に難しいし、組み合わせ爆発が起こる 膨大な時間を無駄にしても、さほど理解できず、身につかない。 組み込み機器も想定しているから、 どうしてこういうルールが必要なのか、初心者には理解できない。 Rust ですら、初心者には無理だろ だから、ドワンゴ江添の本を持って、数年山ごもりしろって言われる。 ルールの多さで、廃人になってしまう 初心者には、絶対に無理。 最初から、エベレストを登るようなもの。 まず「スッキリわかる Java入門」とかの、低い山で修行を積むべし このレベルでは言語どうこうじゃない。 小中高大学まで行くような、研修制度・道筋が大事。 徐々に基礎体力を付けていかないと、何もできない : 592 [sage] 2018/04/15(日) 13:45:38.29:VXOW+WoG ロベールでC++ を勉強するのも良いけど、 あくまで、C++ の初心者というだけで、 C++ をやるには、最低でも数言語は知っている必要がある 特に、Java, C, Rust は、絶対に知っていないといけない。 組み込みの知識も必要 C++ の初心者だけど、他の言語はプロ級で、 PC・組み込み・Linux コマンドも知っていて、C++ を始められる それでも、ほとんどのC プログラマーは、C++ へ進めない : デフォルトの名無しさん [sage] 2018/04/15(日) 13:49:36.88:ldkcKhuZ スッキリ厨はちゃんとコテ付けてくれ : デフォルトの名無しさん [sage] 2018/04/15(日) 15:24:18.71:qZPDSYA2 某洋氏翻訳の第4版がロベール本より先に出てくる理由について3行で述べよ。 第3版が難読版というのは判る : デフォルトの名無しさん [sage] 2018/04/15(日) 15:55:19.09:/OvgYAab = が代入じゃなく単に Base クラスのオブジェクトのoperator = を呼んでるだけ、 という理解が必要なんだろうけれどこれ難しいだろうか? cから来た人なら struct base b; b = ...; で b の型が変わるなんて考えもしないだろうけど 最近の人は c やらないのかな : デフォルトの名無しさん [sage] 2018/04/15(日) 16:39:48.86:VXOW+WoG ロベールの方が、独習・柴田望洋・林 晴比古などよりも、簡単 : デフォルトの名無しさん [sage] 2018/04/15(日) 17:20:50.44:s7NpyR5v 原典も読まずに能書き垂れる奴っているんだなぁ : デフォルトの名無しさん [] 2018/04/15(日) 18:07:17.49:c4dXLki+ 試してみました。 確かにポインタを使うと期待通りの結果でしたが、参照を使うと期待通りにはいきませんでした。 これはなぜでしょうか? #include "Derived.h" int main() { Base b; Base& br = b; br.A(); Derived d; br = d; br.A(); Base *bp; bp = &b; bp->A(); bp = &d; bp->A(); } 実行結果は以下です。 Base Base Base Derived : デフォルトの名無しさん [sage] 2018/04/15(日) 18:44:29.81:ZEcSoj1Y 参照は書き換えられないからな。 >br = d; 参照先のbに代入してるのと同じこと。 : デフォルトの名無しさん [sage] 2018/04/15(日) 18:50:44.48:CIuag2/D 当たり前 br は b の別名なだけだから b = d; ってやってるのと同じ b は Base の領域しかないんだから b.A() で Delived::A() を呼び出した時に Delived にしかないメンバ変数とか参照してたら困るし : デフォルトの名無しさん [sage] 2018/04/16(月) 00:20:31.20:TXxoP4/a 参照のポインタっぽい振る舞いを確認したいならこう Derived d; Base & b1(d); b1.A(); : デフォルトの名無しさん [] 2018/04/16(月) 07:57:32.89:PsSdBUuj ありがとうございました。 下の結果は、 Base Derived Derived になりました。1番目と2番目の違いがよく分かりません。この違いが分かれば、疑問が 解消することになると思うので、理解したいです。 #include "Derived.h" int main() { Derived d; Base b; Base& br1 = b; br1 = d; br1.A(); Base& br2(d); br2.A(); Base *bp; bp = &d; bp->A(); } : デフォルトの名無しさん [] 2018/04/16(月) 08:01:12.80:PsSdBUuj Base Derived Derived となりました。 2番目と3番目は同じことの別表現のようですね。 見た感じ、1番目と2番目に違いがあるようには思えません。 Derived d; Base b; Base& br1 = b; br1 = d; br1.A(); Base& br2 = d; br2.A(); Base& br3(d); br3.A(); : デフォルトの名無しさん [sage] 2018/04/16(月) 08:14:10.02:TXxoP4/a 参照は初期化時に参照先が設定され、以降の操作は参照先に対してなされる。 初期化と代入を区別すること。 Base& br1 = b; // 初期化 br1 は b の参照 br1 = d; // 代入 b = d と同じ動作 Base& br2 = d; // 初期化 br2 は d の参照 : デフォルトの名無しさん [sage] 2018/04/16(月) 08:32:20.53:PsSdBUuj ありがとうございました。 >Base& br1 = b; // 初期化 br1 は b の参照 >br1 = d; // 代入 b = d と同じ動作 br1 = d としても参照先は変わらないんですね。 ありがとうございました。 : デフォルトの名無しさん [sage] 2018/04/16(月) 12:10:28.34:rDfY3L1y Java,C#などのプログラマです。 C++にC#などのインターフェースはない代わりに多重継承?できるのでそれを使うとのことで、 ttps://ideone.com/k7g2nn ITestAとITestBはインターフェース的なものです。 で、ITestAを実装したCBaseAを作り、CBaseAを継承しITestBを実装したCTestBを 作ったのですが、 CBaseBをnewなど実体化するとITestA::methodAがオーバーライドされておらずCBaseBは 抽象クラスになってて実体化できません。 ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか?? というかこういう場合C++ではどうすればいいのでしょうか? : デフォルトの名無しさん [sage] 2018/04/16(月) 12:43:19.10:qlfABgAK Base Pointer : 100〜119 Derived Pointer : 120〜139 こういう状況で、Base クラスを指す際、クラスポインターは100 を指している。 100〜119 内で、Base クラスの変数・メソッドのアドレスを探す Derived クラスを指す際、クラスポインターは自動的に、120 に変わる。 120〜139 内で、Derived クラスの変数・メソッドのアドレスを探す : デフォルトの名無しさん [sage] 2018/04/16(月) 13:08:20.92:5MYyAHFg 単なる文法エラーだからエラーメッセージみてコードを直してください : デフォルトの名無しさん [sage] 2018/04/16(月) 14:01:04.61:rDfY3L1y 文法エラー?? ttps://ideone.com/k7g2nn の今回の部分と関係ないエラーは無視してください。 あくまでイメージ目的でそこらへん適当にやりました。 すみません。 ttps://ideone.com/QxErKY こっちですね。 : デフォルトの名無しさん [sage] 2018/04/16(月) 14:08:31.72:rDfY3L1y ちなみに、C#だとこんな感じです。 ttps://ideone.com/8SZhJ7 : デフォルトの名無しさん [sage] 2018/04/16(月) 14:29:48.23:7XdbFr6Z CBaseAのmethodAをCBaseBを実体化して呼びたいんだよな? ならCBaseAとITestBどっちのmethodA呼ぶのかあいまいって怒られる これならok ttps://ideone.com/FGHyda : デフォルトの名無しさん [sage] 2018/04/16(月) 14:32:34.81:rDfY3L1y もちろん、エラーなくしてコンパイルを通す方法は の >ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか?? で書いたようにすればとりあえず、コンパイルは通ります。 聞きたいのは、 C#の場合はBaseAの方で一度MethodAを宣言・定義すればいいのですが、 C++の場合は毎回CBaseAの派生クラスでmethodAを宣言して定義しなおさなければいけないのでしょうか?? それともC++では他の方法があるのでしょうか? : デフォルトの名無しさん [sage] 2018/04/16(月) 14:34:54.92:rDfY3L1y あ、すみません。ちょっと被ってしましましたね。は忘れて下さい。 のコードを見てみます。 : デフォルトの名無しさん [sage] 2018/04/16(月) 15:08:36.13:rDfY3L1y そっか。純粋仮想関数じゃなくて仮想関数にするって手もありましたか。 まぁ、インターフェース的なクラスの方をいじくるのが気になりますが。 ありがとうございます。 : デフォルトの名無しさん [sage] 2018/04/16(月) 15:30:44.68:7XdbFr6Z インターフェース側をいじるのは仕方ない どっちかになる ttps://ideone.com/qrd4fN ttps://ideone.com/kVZzRi : デフォルトの名無しさん [sage] 2018/04/16(月) 16:21:16.33:Gm7LZDiq 実装とインタフェースの両方を継承するならこういう書き方もある ATL なんかがこれ式かな ttps://ideone.com/B7JWER : デフォルトの名無しさん [sage] 2018/04/16(月) 17:30:50.30:rDfY3L1y 色々ありがとうございます。がよさそうなのでこれで行こうかなと思います。 : デフォルトの名無しさん [sage] 2018/04/17(火) 17:08:59.76:SGgdop5e 巨大なファァイルの読み込みに関してです。 たとえば1000行のテキストからなるファイルの1000行目だけを読み込んで、配列に 代入したいのですが、ファイルをopenしていきなり1000行目にアクセスする方法はありますでしょうか? 現在、forループで1000回廻して1行ずつ増やしてアクセスし1000回目にfgetsで読み込んで配列に入れているのですが、999回のループが無駄なので高速化したいのですが、どなたかご教授いただけないでしょうか? : デフォルトの名無しさん [sage] 2018/04/17(火) 17:20:32.18:/qMRupTB 行という概念が 先頭から読んでいって逐次確認しないと行の区切りが確定しないのでどうしようもないんじゃない? ファイルサイズ分一気にオンメモリで読んで後から行の切り出しするとかの工夫はあるだろうけど : デフォルトの名無しさん [sage] 2018/04/17(火) 17:29:32.71:KTfx2aCu テキストのフォーマットによっては高速化は可能 例えば1行が固定サイズとか行番号が書いてあるとか 全く自由なフォーマットだと頭から解析するしかない 読み込みスレッドと解析スレッドを分けると速くなることもあるかも 同じファイルが複数回指定されることが多ければ ファイル名と更新日時と1000行目の位置 のデータベースを持つとか : デフォルトの名無しさん [sage] 2018/04/17(火) 17:30:11.39:cVYjBdTw 「1000行目」の定義が先頭から数えて999番目の改行の次、である以上ありません。 1行のバイト数を全て同一にすることができれば(この場合しばしば行ではなくレコードと呼ばれる) 1000番目のバイト位置を計算してそこから読むことができます。 FILE * を用いてシーケンシャルにたくさん読む場合は setvbuf でバッファサイズを拡大しておくと高速になることも多いので試す価値はあるでしょう いろんな行に何度もアクセスするなら、 全てメモリに読み込んだ上で各行の先頭位置を配列に記録しておくと良いでしょう。 : デフォルトの名無しさん [sage] 2018/04/17(火) 17:36:06.95:p5xwhAV/ 末尾にseekして、適当に戻って読んでみて、 改行がなければまた戻って、を繰り返すのが現実的。 : デフォルトの名無しさん [sage] 2018/04/17(火) 17:40:13.25:/qMRupTB 巨大なファイルの中途の行じゃなく、ファイルの最終行だけを抜き出したい のか? : デフォルトの名無しさん [sage] 2018/04/17(火) 17:50:32.61:yyY2OAEq 対象のテキストファイルとは独立に、 「そのテキストファイルの各行がファイルの何バイト目から始まるか」 という情報を覚えておく手はあると思うけど、整合を保つのが面倒よね。 の後半部分だな。 : 619 [sage] 2018/04/17(火) 18:03:45.64:SGgdop5e 皆様いろいろご指導ありがとうございました。 私の能力では難しそうですが、いろいろ高速化を試してみます。 : デフォルトの名無しさん [sage] 2018/04/17(火) 18:46:11.69:NCQX7EWc 末尾にseek して1文字抜出し(末尾が\n の場合はそれを無視して) \n が現れるまで1文字ずつ戻りながらキューに積んで 最後にキューの中身を逆順にする : デフォルトの名無しさん [sage] 2018/04/17(火) 18:55:56.84:gaNnpc4H 配列の要素数が分からないときscanfで読み込んだ値を要素数にするにはどのようにしたらよいですか? : デフォルトの名無しさん [sage] 2018/04/17(火) 19:35:04.61:wvS91pUR scanf("%d",&n); int array[n]; //読み込んだ値を要素数にするってこういう事? : デフォルトの名無しさん [sage] 2018/04/17(火) 20:21:29.36:AHw7lgSX 基本的な事なんだろうけど、vectorを範囲ベースのforループしたいのですができません。 auto v = vector<int>()だとfor (auto &i : v)でいけるのですが、 newした場合はどうすればいいのでしょうか? autov = new vector<int>(); for (auto &i : v)だと begin関数が見つかりませんといってコンパイルできません。 どうすればいいでしょうか? : デフォルトの名無しさん [sage] 2018/04/17(火) 20:24:11.47:AHw7lgSX すみませんでした。普通に逆参照すればいいのか。 auto v = new vector<int>(); for (auto &i : *v) : デフォルトの名無しさん [sage] 2018/04/17(火) 20:46:42.62:hZ2W0cz8 ありがとうございました : デフォルトの名無しさん [sage] 2018/04/18(水) 11:35:26.22:uQo81sbZ MFCのアプリで排他制御のルーチンを作っていて疑問に思ったことなのですが、 CやC++の仕組みのことなので、こちらで質問させていただきます。 複数のスレッドから呼ばれる関数の内部は、 CCriticalSectionを使って排他制御しています。 void Test() { static CCriticalSection cs; cs.Lock(); : cs.Unlock(); } 関数内のstatic変数は、その関数が初めて呼ばれたときに 実体が作成されると理解しているのですが、 1回目のTest()でCCriticalSectionのコンストラクタを実行している最中に 他のスレッドがTest()を呼んだ場合、このコンストラクタ自体は、 正しく排他制御されるのでしょうか? コンストラクタが終わるまで、他のスレッドは待ってくれるのでしょうか? それとも、CCriticalSectionの変数は、 関数の外に置かなくてはいけないものでしょうか? MFCの内部でも、AFXPlaySystemSound()などで 同じようなことをやっているようなのですが。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/18(水) 11:57:34.76:iSn0xXbj ttps://cpprefjp.github.io/lang/cpp11/static_initialization_thread_safely.html ttp://d.hatena.ne.jp/yohhoy/touch/20120309/p1 : デフォルトの名無しさん [sage] 2018/04/18(水) 12:00:55.78:EfAk4eu6 C++11 でローカルなスタティック変数の初期化はスレッドセーフであると定められた。 (C++03 にはこの規定はなく、実際その頃はmsvcもgccもスレッドセーフではなかった) msvc では 2015 から。 c言語バージョンの指定のほか、専用のオプションによっても有効化、無効化できる 以下を参照 ttps://docs.microsoft.com/ja-jp/cpp/build/reference/zc-threadsafeinit-thread-safe-local-static-initialization gcc / clang では -fno-threadsafe-statics オプション : デフォルトの名無しさん [sage] 2018/04/18(水) 12:06:23.94:H8UzlwrM 他の言語ではコンパイルエラーで悩むことはないのですが、コンパイルが通らなくてかれこれ2日。 エラーの行番号見ても、あってるよーな?よくわからない。 どうすりゃいいの。 : デフォルトの名無しさん [sage] 2018/04/18(水) 12:26:53.25:MXcoXWvI 独り言ならチラシの裏にかけ : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/18(水) 12:28:10.26:iSn0xXbj ソースとエラー貼って : デフォルトの名無しさん [sage] 2018/04/18(水) 12:39:00.98:8LhMtFC1 NDAを結ばないと出せません : デフォルトの名無しさん [sage] 2018/04/18(水) 12:48:05.38:Odk+F4n0 コードすら貼らないオツムの足りなさじゃ諦めろ : 633 [sage] 2018/04/18(水) 12:59:22.55:uQo81sbZ ありがとうございます。 VSは2015よりも前なので、このやり方はダメってことですね。 関数の外に置くようにします。 MFCの内部ではやっちゃってますが。 : デフォルトの名無しさん [sage] 2018/04/18(水) 13:03:03.18:H8UzlwrM なんだよ。このクソ言語。やっとわかったわ。 ちょっとずつコンパイルしていかねぇとダメじゃん。このクソ言語。 エラーの内容はhファイルの方に"{"が期待されるところに"}"がありますなエラー。 ヘッダファイルと睨めっこしても、{}の数あってるし仕方なくcppファイルの方の実装の中身を全部コメントアウトしたら コンパイル通った。で、cppファイルの方を数行ずつコメントアウト解除したらエラーわかったわ。 hファイルにエラーがあるとかミスリードしてんじゃねぇよ。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/18(水) 13:07:10.12:iSn0xXbj エラーも貼れないなら、助けるのはムリ。 テレパシーは秘密保持違反になるから、このスレッドでは君を助けられないね。 つーか、仕事中にパソコンで5チャンネル閲覧記録は、大きな企業なら会社にチェックされているだろうね。 : デフォルトの名無しさん [sage] 2018/04/18(水) 13:12:55.50:H8UzlwrM そりゃ、ソースコード全部張れば分かるとは思うけど、 エラーの内容は 「hファイルの方に"{"が期待されるところに"}"がありますなエラー。」 みたいなエラーでて、この意味ぐらい自分で分かるし。 だから、このエラーの内容だけ張っても君たちが分かるとは思えなかったら張りませんでした。 お手数かけました片山さん。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/18(水) 13:22:59.72:iSn0xXbj May the source be with you. : デフォルトの名無しさん [sage] 2018/04/18(水) 13:25:36.89:whM0Cl8U プリプロセッサの結果を見れば判るだろうに : デフォルトの名無しさん [sage] 2018/04/18(水) 13:37:08.45:H8UzlwrM そうでしたか。まだ、C++やりだして1週間未満なものでして、そういうノウハウというか関連知識が ありませんでした。 まだ、Visual Studioの「エラー一覧」ウィンドウしかまだ見てないもので。とりあえず、初心者の自分は 頻繁に数行書いたらコンパイルすることにします。 : デフォルトの名無しさん [sage] 2018/04/18(水) 13:45:55.17:MXcoXWvI C++の文法のクソさには誰も異論はない。 : デフォルトの名無しさん [sage] 2018/04/18(水) 13:59:47.30:+aOsPa5t プリプロセッサによる不便さだから c++ の文法とは全く関係ないけどな : デフォルトの名無しさん [sage] 2018/04/18(水) 14:01:11.21:v7hqXOET クソどころじゃない : デフォルトの名無しさん [sage] 2018/04/18(水) 15:30:25.37:EU/tZBmZ 今後のためにそのエラーになる最少構成でやってみ : デフォルトの名無しさん [sage] 2018/04/18(水) 20:25:53.95:hZhORVVR ヘッダファイルがこんなふうにconst用と非const用の関数があるとして class A { B b; B& get() { return b; } const B& get() const { return b; } } このBがくっそ長くて書くのが面倒な場合、autoで代用するのはまずい習慣ですか? auto& get() { return b; } auto& get() const { return b; } : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/18(水) 20:49:19.46:cGcFIcRA 型名が長すぎるときは、typedef。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/18(水) 20:52:50.32:5Rgz0HeV 型の別名を定義することについての是非は置くとして、 typedef はオワコン。 using を使うのがモダンな C++ やで。 : デフォルトの名無しさん [sage] 2018/04/18(水) 21:22:43.95:hZhORVVR typedefやusingはなるべく使いたくないんですよね やはりヘッダーの返り型くらいはちゃんと記述すべきですかね イタレータとか長くなりがちだけど・・・ : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/18(水) 21:26:54.29:cGcFIcRA こうだな。動くかどうか知らんけど。 auto& get() { return b; } const auto& get() const { return b; } : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/18(水) 21:27:07.88:5Rgz0HeV decltype(b) でもええんやで。 : デフォルトの名無しさん [sage] 2018/04/19(木) 01:18:42.72:AYGORpen 悩んでる時間があったら素直に全て書け と思う : デフォルトの名無しさん [] 2018/04/24(火) 10:32:40.90:Z9G2Fq/H 柴田望洋訳のC++の本とロベールのC++の本以外にまともな日本語のC++の本ってありますか? : デフォルトの名無しさん [sage] 2018/04/24(火) 12:27:26.17:1D4v+3Mx ロベール、独習(Herbert Schildt)、柴田望洋、林 晴比古 修験者になって、数年山籠もりしたいのなら(笑)、ドワンゴ江添の、 C++11/14 コア言語、江添 亮、2015 : デフォルトの名無しさん [sage] 2018/04/24(火) 13:18:05.66:+bGv0z3c 「C++の設計と進化」は良いよ : デフォルトの名無しさん [] 2018/04/24(火) 15:48:30.83:Z9G2Fq/H ありがとうございます。 Herbert Schildtの本は、ロベールに比べると細かい話がないように思います。 柴田さんの中級という本も細かい話がないように思います。 : デフォルトの名無しさん [] 2018/04/24(火) 18:56:34.08:Z9G2Fq/H vector について質問です。 コピーコンストラクタ、operator= について一応勉強したのですが、 vector などのクラスでは、 コピーコンストラクタや operator= はどうなっているのでしょうか? : デフォルトの名無しさん [sage] 2018/04/24(火) 19:23:44.30:4uyKjeBM 実際にヘッダ読んで見るしかないと思うが ディープコピーしてるよとしか : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/24(火) 19:27:47.73:Eukzbh8y Visual Studioなどでデバッグするとヘッダーが見れるよ。vectorはテンプレートのクラスだから、 読み進めるにはテンプレートの知識が必要かもね。 : デフォルトの名無しさん [] 2018/04/24(火) 19:32:21.39:Z9G2Fq/H ありがとうございました。 ディープコピーでしたら、使う上では、何も考えずに関数の引数として渡したり、 関数から返したりしてもかまわないですね。 ありがとうございました。 : デフォルトの名無しさん [sage] 2018/04/24(火) 19:40:11.28:4uyKjeBM それはディープコピーのコストがかさむのでおすすめしない : デフォルトの名無しさん [sage] 2018/04/24(火) 20:11:58.65:Ukt80uX+ >何も考えず引数で渡しても良いですね 何をもってして「良い」と評価するのかはわかりませんが、 そういうのは拙い知識で独断せずそこら中にある 経験豊富な先人の書いたコードを読んで真似するのがいいですよ 引数は大抵 const 参照で渡しているでしょう : デフォルトの名無しさん [sage] 2018/04/26(木) 01:34:48.58:Z7x9U0tp class TestA { TestA() {} ~TestA() {} }; class TestB { TestB() {} ~TestB() {} TestA getA() { return TestA(); } }; int main() { TestB b; TestA a = b.getA(); } TestBクラスの getA() メソッドがこのテストコードで正しく動作しているのですが、TestAの インスタンスは一体どこで作られてるんでしょうか? TestA getA() { TestA a; return a; } としないでいきなり reurn TestA() で良い理由が良く分かりませんでした。 : デフォルトの名無しさん [sage] 2018/04/26(木) 07:25:57.17:E0/AuDcr どこのメモリにどう作られているのかという質問だと思うけど、 C や C++ では式の値として構造体やオブジェクトが認められていて、 コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。 式や式の一部の値としてだけ現れて変数に格納されないオブジェクトはテンポラリーオブジェクトとか言うので、 詳細はテンポラリーオブジェクトでぐぐって。 のmain はテンポラリーオブジェクトを使って b を用意せず TestB().getA(); ともかける ところで今回の質問の、関数の戻り値に関するコンパイラの動作は 「戻り値最適化」なる最適化によって色々複雑なことになっているので これは自分で戻り値最適化でググって調べて欲しい。 : デフォルトの名無しさん [sage] 2018/04/26(木) 07:37:06.21:E0/AuDcr 質問が文法的なことについてだとすると、式中の項ととして TestA() std::string("foo") などのように型名にコンストラタの引数を加えて関数呼び出しのように書くと テンポラリーオブジェクトを生成してそれを値とする頃ということになる。 例 size_t l = std::string("abc").length(); std::string 型のテンポラリーオブジェクト(中身は"abc") が作られ、 それのメンバ関数 length が呼ばれ、l はその値(3)で初期化される。 : デフォルトの名無しさん [sage] 2018/04/26(木) 11:26:25.34:Z7x9U0tp 詳細をありがとうございました。 大変良く解りました。より深くは自分でググってみます。 : デフォルトの名無しさん [sage] 2018/04/26(木) 14:19:03.06:LZqqVlEY 共同ツール 1 ttps://seleck.cc/685 ttps://trello.com/ ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど Trello Chrome拡張機能 elegant ttp://www.kikakulabo.com/service-eft/ trelloのオープンソースあり 共同ツール 2 ttps://www.google.com/intl/ja_jp/sheets/about/ 共同ツール 3 ttps://slack.com/intl/ja-jp ttps://www.dropbox.com/ja/ ttps://bitbucket.org/ ttps://ja.atlassian.com/software/sourcetree ttps://sketchapp.com/extensions/plugins/ ttp://photoshopvip.net/103903 ttps://goodpatch.com/blog/sketch-plugins/ : デフォルトの名無しさん [] 2018/04/27(金) 13:24:43.31:wnXDwKhi for (int i = 0; i < n + 1; ++i) {;} とやると、 i が n + 1 未満かどうかの判定をする際、毎度 n + 1 を計算してそれを i と比較するということになるので しょうか? もし、そうなら、 m = n + 1 for (int i = 0; i < m; ++i) {;} としたほうがよいのでしょうか? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/27(金) 13:35:12.84:GhhThAV7 ただの整数の足し算程度なら最適化されることが期待できるのであまり気にしなくていい。 : デフォルトの名無しさん [] 2018/04/27(金) 14:09:53.91:ouRrzssA 【マイトLーヤとPS4】 FFとDQの最新作、VR開発は危険、プレーヤーの日常感覚を損なうおそれ ttp://rosie.5ch.net/test/read.cgi/liveplus/1524621704/l50 : デフォルトの名無しさん [sage] 2018/04/27(金) 18:21:42.79:qED012zx ttps://ideone.com/TVzVzF 上記のコードで、read関数を持ったIReadableクラス(基底クラス)があって、そのクラスから派生したCFileReaderクラス、 直接は派生していないけどread関数を持ったCMemoryReaderクラスがあって、その両方を受け取れるvector<IReadable*>を作りたいのですがコンパイルが通りません。 どうしたらいいでしょうか? どなたか教えてください。。。 : デフォルトの名無しさん [sage] 2018/04/27(金) 18:38:42.04:yKF4ET93 いまだに最適化されないコンパイラもあることはある 8bitマイコンとかの話 あと、nがvolatileだと当然毎回計算する nがSFRだったり複数スレッド共有変数だったりするなら気を付けよう 普通は気にしなくて大丈夫 コンパイラの最適化の基本の基本なので このループの比較がパフォーマンスに大きく影響するなら 高速化テクニックは色々とある : デフォルトの名無しさん [sage] 2018/04/27(金) 19:03:28.59:uctWpHV6 なんとなく互換性のある read を持つものをエンベロープして IReadable になるエンベロープクラスを用いるのはどう? ifstream も IReadable じゃないからエンベロープする。 ttps://ideone.com/27yhhu : デフォルトの名無しさん [sage] 2018/04/27(金) 19:06:52.81:O6TOHWbP > for (int i = 0; i <= n; ++i) {;} : デフォルトの名無しさん [sage] 2018/04/27(金) 19:18:38.40:uctWpHV6 for ループといえばつい手癖で for (int i =0; i < count-1; ++i ) {...} と書いてて、 後日に count を int から size_t にしたとき countが0のケースではまったことがあるなあ for (int i =0; i + 1 < count; ++i ) {...} と書けば良いだけなんだけど : デフォルトの名無しさん [sage] 2018/04/27(金) 19:27:34.55:mctUhDKo n+1未満とn以下は違うと思うの : デフォルトの名無しさん [sage] 2018/04/27(金) 19:33:05.63:AimUsleE それcountが1でも全くループしないというヘンテコ仕様だけど そんなもの手癖で書くの? : デフォルトの名無しさん [sage] 2018/04/27(金) 19:37:07.17:uctWpHV6 隣り合った2項、例えばv[i] と v[i+1] を用いた処理をするとか 後続のものがある項だけ処理するとか良くある : デフォルトの名無しさん [] 2018/04/27(金) 19:37:30.10:wnXDwKhi int **a を利用して2次元の動的配列を作ります。 a を関数に渡して、計算に利用します。 2次元配列 a の要素は変更しないので、 int func(const int **a){ ... } としました。 main 内には以下のように書きました。 ret = func(a); すると、 a を int** から const int** に変換できませんというエラーが出てしまいます。 これはなぜでしょうか? : デフォルトの名無しさん [] 2018/04/27(金) 19:39:48.54:wnXDwKhi ありがとうございました。 : デフォルトの名無しさん [sage] 2018/04/27(金) 19:49:10.59:O6TOHWbP ん? レアケースを語り出すのか? : デフォルトの名無しさん [sage] 2018/04/27(金) 19:51:18.26:mctUhDKo そんなにヘンテコでもないと思う for (size_t count = 0 ; count < 10 ; count++){ for (size_t i = 0 ; i < count - 1 ; i++){ .... } } こんなのはありがちかと : デフォルトの名無しさん [sage] 2018/04/27(金) 19:52:51.39:mctUhDKo レアケースっていうか nが小数の場合だな : デフォルトの名無しさん [sage] 2018/04/27(金) 20:02:30.96:AimUsleE ふむ、なくはないか。 やはり条件の方に+1とか-1とか書くんじゃなくて初期値変える方が素直だろうな。 最適化の下手なコンパイラ対策も含めて。 : デフォルトの名無しさん [sage] 2018/04/27(金) 20:03:21.75:O6TOHWbP だからそう言うのをレアケースって言ってるんだが... よく書くと言うなら多分住む世界が違う : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/04/27(金) 20:10:35.47:HF3+Vuoy レイアース : デフォルトの名無しさん [] 2018/04/27(金) 20:28:24.05:wnXDwKhi 具体的なコードは以下です: int func(const int **a) { return 0; } int main() { int n = 10; int **a = new int*[n]; for (int i = 0; i < n; ++i) { a[i] = new int[n]; } func(a); for (int i = 0; i < n; ++i) { delete[] a[i]; } delete[] a; } : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/04/27(金) 20:32:49.73:GhhThAV7 さくらの続編を放送してる今日この頃、レイアースの第三章もワンチャン有るかもな! : デフォルトの名無しさん [sage] 2018/04/27(金) 20:36:06.84:mctUhDKo そんな事言ったら countが0でループだってレアケースだぞ : デフォルトの名無しさん [sage] 2018/04/27(金) 20:43:41.07:mctUhDKo const付きに変換出来るのは ポインタの先がconstに変わる場合 int finc(int * const * a) なら大丈夫 : デフォルトの名無しさん [sage] 2018/04/27(金) 20:52:32.49:wnXDwKhi ありがとうございます。 const についてよくわからないのですが、 func の中で、 a[i][j] = 1; みたいなことをできないようにしたいのですが、どうすればいいでしょうか? : デフォルトの名無しさん [sage] 2018/04/27(金) 20:55:03.35:qED012zx ありがとうございます。その方法で取りあえずの目的は果たせそうなのですが、ほかの方法はないでしょうか? というのも、他のクラスでラッピングしたりキャストしたりせずにifstreamを食わせたいのです。 たとえば、STLの各種関数はポインタでもvector等のコンテナでも大体OKですよね? あれと同様に関数ポインタでもクラスのインスタンスへのポインタでもread()を持つものなら何でも突っ込めるようにしてforでぶん回したいのです。 標準のコンテナや自作クラス等の違いを吸収できるような構造にしたいのです。条件が後出しになってしまって申し訳ありません。 : デフォルトの名無しさん [sage] 2018/04/27(金) 20:57:43.26:mctUhDKo キャスト が一番コストが少ないと思う 関数の中で delete [] a[i]; a[i] = new int[10]; は出来ても良いの? : デフォルトの名無しさん [sage] 2018/04/27(金) 20:58:32.28:mctUhDKo はあて : デフォルトの名無しさん [sage] 2018/04/27(金) 21:19:24.66:wnXDwKhi ありがとうございます。 ちょっと回答が理解できないため、質問を代えさせてください 以下のプログラムの func はNGなのに func2 はOKなのはなぜでしょうか? : デフォルトの名無しさん [sage] 2018/04/27(金) 21:19:40.66:wnXDwKhi int func(const int **a) { return 0; } int func2(const int *b) { return 0; } int main() { int n = 10; int **a = new int*[n]; for (int i = 0; i < n; ++i) { a[i] = new int[n]; } func(a); int *b = new int[n]; func2(b); for (int i = 0; i < n; ++i) { delete[] a[i]; } delete[] a; delete[] b; } : デフォルトの名無しさん [sage] 2018/04/27(金) 21:47:52.98:uctWpHV6 それは c / c++ の欠点の1つで、 T * は const T * に文句も言わず変換してくれるが T ** は const T ** に変換してくれないという問題 T は const T と定数性以外 compatible だよね、という判断を 1 段階しかしてくれない。 キャストが必要 const_cast<const int**>(a) など : デフォルトの名無しさん [sage] 2018/04/27(金) 22:48:56.90:bqnCmOTp 皆が言っているのは質問の内容とはちょっと違うけど、 func の中で a[0] = 0; などを禁止するために内側のポインタ自体も const にして const int * const * にした方がいいよということ : 704 [sage] 2018/04/27(金) 22:53:34.55:bqnCmOTp いやごめん func(int * const * )にすればコンパイル通るのか… T * const * ==> const T * const * という変換は暗黙でokなのか 自分がバカでした : デフォルトの名無しさん [sage] 2018/04/29(日) 14:10:11.64:uFYPLUkV 欠点なの? T ** を const T ** に勝手に変換されると困るんだが。 : デフォルトの名無しさん [sage] 2018/04/29(日) 15:26:18.04:AQKaesvC T * を const T * には勝手に変換するけどな : デフォルトの名無しさん [sage] 2018/04/29(日) 15:27:57.34:AQKaesvC T * を volatile T * にも : デフォルトの名無しさん [sage] 2018/04/29(日) 16:08:44.48:p2Z/45DS ちょっと興味があるので困るコードを教えて : デフォルトの名無しさん [sage] 2018/04/29(日) 16:11:13.28:p2Z/45DS 慌ててたのかこのレス書き間違ってた func(const int * const * )にすればコンパイル通る、 T ** ==> const T * const * という変換は暗黙でok、 と書きたかった(全然違うな) : デフォルトの名無しさん [] 2018/04/29(日) 18:37:23.21:uFYPLUkV int** ipp; const int ci=0; const int ** cipp; cipp = ipp; *cipp= &ci; **ipp = 3; : 711 [sage] 2018/04/29(日) 18:50:17.15:uFYPLUkV おっと ipp の初期化忘れた int** ipp; const int ci=0; const int ** cipp; int *ip; ipp = &ip; cipp = ipp; *cipp= &ci; **ipp = 3; : デフォルトの名無しさん [sage] 2018/04/29(日) 18:55:31.07:tn8JNm3m ロベールの本に、 ios::out | ios::trunc が意味がないと書いてあります。 既存のファイルを破棄してから書き込むということだとすると意味があるように思います。 ios::in | ios::out | ios::trunc とした場合のみ意味があると書いてあります。 どういう意味なのでしょうか? : デフォルトの名無しさん [sage] 2018/04/29(日) 23:14:14.46:hAJLRgtx truncate は、ファイルサイズを切り詰め・縮小する。 これは、読み書き両用時に使える機能 ファイルを読み込んで、ファイルサイズを縮小して書き込む ファイルの書き込みでは、使えない。 書き込みでは、ファイルサイズ0で開くから、前のファイルが消える : デフォルトの名無しさん [sage] 2018/04/30(月) 03:21:44.30:/NJkj9K4 なるほどね。 T ** => cont T ** は許すとcont T を操作できてしまうから禁止されていて、 T * => const T * T ** => const T * const * ...(以下略) にはその問題が無いから許可されているわけか : デフォルトの名無しさん [] 2018/05/05(土) 10:57:39.35:dx2uIifv file.read((char*)buf, sizeof buf); は buf のサイズ分だけ読み込めということだと思います。 ファイルの最後の部分を読み込むとき、サイズが WIDTH 未満の場合にはどうなるのでしょうか? fstream file; file.open("hello.txt", ios::in | ios::binary); do { unsigned char buf[WIDTH]; file.read((char*)buf, sizeof buf); for (int i = 0, size = file.gcount(); i < size; ++i) { printf("%02X ", buf[i]); } cout << endl; } while (!file.eof()); file.close(); 👀 Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b) : デフォルトの名無しさん [] 2018/05/05(土) 11:15:19.94 ttps://cpprefjp.github.io/reference/istream/basic_istream/read.html : デフォルトの名無しさん [sage] 2018/05/05(土) 11:22:41.78:dx2uIifv ありがとうございました。 あともう一つ質問させてください: ロベールの本なのですが、 int n = 0x41424344; file.write((const char*)&n, sizeof n); というコードがあるページにあります。 その少し後ろのページには、以下のコードがあります。 char buf[BUF_SIZE]; dst.write(buf, src.gcount()); ここで、なぜ dst.write((const char*)buf, src.gcount()); としていないのでしょうか? : デフォルトの名無しさん [] 2018/05/05(土) 11:28:13.02:4WOSF73M 【マイトLーヤとUFO】 『月面にはウサギやウルフが棲息』 『宇宙人グレイは溶けてゼリーに』 ttp://rosie.5ch.net/test/read.cgi/liveplus/1525483483/l50 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/05/05(土) 11:56:29.00:y1NIMmWz char *はconst char *に互換だから。constは書き換えないという意味で、constなしはconstありに対して互換性がある。 : デフォルトの名無しさん [] 2018/05/05(土) 11:58:03.35:dx2uIifv すみません。もう一つ質問です。 またロベールの本なんですが、以下のコードが書いてあります。 ファイルから入力中にエラーが起きたときの対処法です。 if(src.fail()) { ではなく、 if(src.fail() && ! src.eof()) { と書いてあります。その理由として、 「読み込みの場合はファイルの終端に到達した際も fail メンバ関数が 真となるため、 eof メンバ関数が真になる場合は除外しておきます。」 と書いてあります。 そこで質問です。 ファイルの終端の直前の部分を読み込む最後の読み込みの際に何等かのエラーが起こった場合、 src.fail() == true かつ src.eof() == true となります。 そのため、 src.fail() && ! src.eof() == false となってしまいます。 この場合、読み込みエラーが起こったにもかかわらず、その対処ができないことになりはしないでしょうか? それともロベールさんのコードはOKなコードなんでしょうか? : デフォルトの名無しさん [] 2018/05/05(土) 11:58:46.39:dx2uIifv fstream src; … char buf[BUF_SIZE]; src.read(buf, sizeof buf); if(src.fail() && ! src.eof()) { error = true; break; } : デフォルトの名無しさん [sage] 2018/05/05(土) 12:03:26.22:dx2uIifv ありがとうございます。 つまりどちらもエラーにはならないということですね。 ですが、記述が統一していない理由というのは何か考えられるでしょうか? int n = 0x41424344; file.write((const char*)&n, sizeof n); に const がついているのは、 n は int 型だから write に渡すときには絶対に キャストしなければならない。(char *) でもいいが、どうせなら const もつけて しまおうということですかね? 一方、 char buf[BUF_SIZE]; dst.write(buf, src.gcount()); の方は、キャストの必要がないからわざわざ (const char*) とキャストすることも ないかなという感じですかね? : デフォルトの名無しさん [sage] 2018/05/05(土) 12:05:14.84:dx2uIifv ロベールさんの本は色々細かいことが書いてあって有用なのですが、なぜこういうコードなんだろう?という 疑問を持って読んでいくと次から次へと疑問が生まれてきて読み進むのが大変です。 : デフォルトの名無しさん [] 2018/05/05(土) 12:18:38.57 再読のこと : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/05/05(土) 12:19:01.91:y1NIMmWz Cスタイルのキャストは強力すぎて、効果が分かりにくいので、モダンでは、そのキャストは、reinterpret_cast<const char *>(&n)って書いた方がいい。 : デフォルトの名無しさん [sage] 2018/05/05(土) 12:23:53.42:LkKePK4y winsowsにはC#コンパイラが標準付属してますが、C++コンパイラは標準付属してないんですか? : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/05/05(土) 12:24:24.44:y1NIMmWz つまり、その本は古い。温故知新とは言うが、Cスタイルのキャストの使用はモダンではない。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/05/05(土) 12:35:42.78:y1NIMmWz 訂正。 × reinterpret_cast<const char *>(&n) ○ reinterpret_cast<char *>(&n) そのCスタイルのキャストは const_cast<const char *>(reinterpret_cast<char *>(&n))と同じ。 下手なキャストはバグのもと。キャストは最小限に。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/05/05(土) 12:43:36.49:y1NIMmWz コンパイラによっては、reinterpret_castとconst_castをCスタイルのキャストで一度にしようとすると、警告やエラーになるものもある。 : 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2018/05/05(土) 12:53:07.14:y1NIMmWz file.write((const char*)&n, sizeof n); ここでconstをわざわざ付けるのは、型で書き換えないことを確認するためだが、 このCスタイルのキャストは強力すぎて、行儀が悪い。reinterpret_castとconst_castに分けるべきだと考える。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/05/05(土) 23:49:27.10:/wbyRxeL 元の趣旨がキャストについての質問だけどそれは置くとして、 そういうことするなら fstream じゃなくて basic_fstream<int> を使った方がよくなくなくない? : デフォルトの名無しさん [sage] 2018/05/06(日) 00:07:10.95:RbjPx358 そんなもんがいいと思ってる人に何言っても無駄だし 他人に強要しなけりゃそれ使ってもいいんじゃないの : デフォルトの名無しさん [sage] 2018/05/06(日) 00:56:59.17:G6stHO5N 初心者が入門書で学習している段階で、途中の過程をすっ飛ばしてこっちの方がいいからこれ使えなんて進めるのはかえって理解を妨げるんでないの? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/05/06(日) 02:31:33.69:ATh7OHAm 繰返すが趣旨と外れてることはわかってるので、元質問は忘れて。 こっちの手段もアリだよね? っていう別の質問。 : デフォルトの名無しさん [sage] 2018/05/09(水) 14:30:37.57:YgEwOBRT 競技プログラミングってやった方がいいんですか? : ◆QZaw55cn4c [sage] 2018/05/09(水) 16:44:52.51:dHqNIKDN 競技プログラミングが流行る前には、宿題請負スレが隆盛を誇り、私もそれに便乗していろいろやっていましたが、 競プロをやりたいとは思わないなあ… : デフォルトの名無しさん [] 2018/05/09(水) 17:28:08.89:bhGLBTeZ ロベールの本に以下のコードがあります。 buf という配列ですが、 for 文の中で宣言されています。 PAGE_HEIGHT 回、配列 buf が作られるのでしょうか? 何か非効率的な気がします。 for (int h = 0; h < PAGE_HEIGHT; ++h) { unsigned char buf[PAGE_WIDTH]; m_file.read((char*)buf, sizeof buf); for (int w = 0, size = m_file.gcount(); w < size; ++w) { printf("%02X ", buf[w]); } cout << endl; } : デフォルトの名無しさん [sage] 2018/05/09(水) 17:38:59.81:J0gm0Ysv スタックポインタをずらす量が変わるだけ これによる時間はゼロと思って良い : デフォルトの名無しさん [] 2018/05/09(水) 17:44:16.81:bhGLBTeZ そういうのを分かるようんなるにはどうすればいいのでしょうか? C++の本だけ読んでいても分からないような気がします。 : デフォルトの名無しさん [sage] 2018/05/09(水) 17:45:58.33:J0gm0Ysv もしパフォーマンスが問題になるなら printfをなんとかすべき : デフォルトの名無しさん [sage] 2018/05/09(水) 17:52:37.44:J0gm0Ysv コードを書いたときに具体的にどんな処理が行われるか を地道に学んで行くしかない アセンブラを見てもいいし本で学んでも良いし 時間を測っても良い C言語の方が簡単なのでC言語にある機能から : デフォルトの名無しさん [] 2018/05/09(水) 18:27:14.15:bhGLBTeZ ありがとうございました。 : デフォルトの名無しさん [sage] 2018/05/09(水) 19:10:47.36:WcTkBSWX 毎ループその buf が作られるかという質問について言えば 関数に入るときに確保された領域が毎ループ使い回されるだけ : デフォルトの名無しさん [] 2018/05/09(水) 19:12:26.96:bhGLBTeZ ありがとうございます。 newした場合にはもちろん毎回別の領域が確保されるわけですよね。 文法だけからでは分からないことだと思うので、そのような部分を解説した本が あればよいのですが。。。 : デフォルトの名無しさん [sage] 2018/05/09(水) 19:21:16.91:sQgpoJ7Q コンストラクターを起こすようなクラスならアレだけど 基本型はループの外においやらている可能性が高い まぁ使ってるコンパイラの最適化次第というのはある 文法/規格だけで解決しない自由な部分は 実際に使ってるコンパイラの吐き出すコードをみるなり 実測して違いが出るか確認いてみたり…… 初心の「それ無駄だろうという直感」は最適化で瑣末ごとになることが多い?かな? : デフォルトの名無しさん [] 2018/05/09(水) 20:03:17.36:bhGLBTeZ ありがとうございました。 : デフォルトの名無しさん [sage] 2018/05/09(水) 20:03:43.32:tbbSaefy C++ スタック ヒープで検索すると解説しているページは山ほどヒットするけどいい本ってあるのかな。 CPUとメモリの動作とか簡単に学んでおくといい気がする。 スタックに収まらないような大きな領域をスタックに取ってはいけないとか 実践的に必要な知識でもあるんだよね。 : デフォルトの名無しさん [sage] 2018/05/10(木) 00:46:37.51:hNESkqkP 個人的には、はじめて読むシリーズがコンパクトで良かった。 はじめて読む8086 はじめて読むPentium はじめて読むMASM はじめて読む486 486は結構ボリュームがある : デフォルトの名無しさん [sage] 2018/05/10(木) 12:36:43.93:dXwOta4y クラスの練習に文字列クラスっぽいものを作ったんですが Mystr Mystr::operator=(Mystr &obj){ //左辺に右辺を代入 return *this } こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが 関数の戻り値をvoidにする以外でなくす方法はありませんか? 一応コード全文 ttps://ideone.com/A1iQ3Y : デフォルトの名無しさん [sage] 2018/05/10(木) 12:55:29.56:vDlJ/Ca2 >Mystr Mystr::operator=(Mystr &obj){ 一般的にはこうする Mystr & Mystr::operator=(Mystr &obj){ : デフォルトの名無しさん [sage] 2018/05/10(木) 13:00:33.59:TqAsciuR Mystr & Mystr::operator=(const Mystr &obj); : デフォルトの名無しさん [sage] 2018/05/10(木) 13:59:44.86:dXwOta4y ありがとうございました 戻り値にも参照が使えることを知りませんでした : デフォルトの名無しさん [sage] 2018/05/10(木) 14:05:03.21:vDlJ/Ca2 おそらくわかっていると思うけど、ローカル変数や テンポラリーオブジェクトの参照は返しちゃダメなので注意 ダメな例 T& f() { T a; .....; return a;} string& g() { string a, b; .....; return a+b;} : ◆QZaw55cn4c [sage] 2018/05/10(木) 17:59:19.87:XVn0zvPu はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね… : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/05/10(木) 18:38:04.46:RiSXhiCD アセンブラって「低水準言語」なはずだけども、今となっては機械語すらもかなり高水準だもんな……。 機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、 機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。 動かすための情報を集約しようとしてはしてるよ。 ある程度は動く。 ttps://github.com/tkmc/486 : ◆QZaw55cn4c [sage] 2018/05/10(木) 19:41:56.87:XVn0zvPu これなんかも、動くかもしれません ttp://takeda-toshiya.my.coocan.jp : デフォルトの名無しさん [sage] 2018/05/10(木) 20:45:54.69:CLWEept/ アドレスでアクセスできるメモリってものがあってデータやコードが書かれてるのかー スタックなる仕組みでローカルな記憶域をほぼコストゼロで確保してんのかー と言うことがわかれば十分な気がする : デフォルトの名無しさん [sage] 2018/05/11(金) 00:09:23.84:cA/jbwin これの上の3冊は薄くてすぐ読めるから、もやもやとした状態でいるよりはいい気がする。 ただ、486以外は古本でしか手に入らなそうだけど。 : デフォルトの名無しさん [] 2018/05/11(金) 07:04:43.76 薄い本ならコミケで売れや : デフォルトの名無しさん [sage] 2018/05/11(金) 13:11:04.97:Mluu9Rs0 アセンブラの前に まずは変数がどこにどのように確保されるかとか どのように初期化されるかとか そっちの方が先だろ スタティック、スタック、ヒープ をまず理解する C++であればvirtual関数が呼ばれる仕組みとかも 知ってた方が良い 例外の仕組みは機種依存が大きいのでもうちょっと先で : デフォルトの名無しさん [sage] 2018/05/11(金) 14:03:43.45:lM6VzEPt つ ttp://zob.club/zob/2018/04/16/ 同人誌-advanced-assembler-386-上ノ巻/ : デフォルトの名無しさん [sage] 2018/05/11(金) 15:32:04.47:L7FGnh/N そう。 でもスタックを理解するにはメモリという概念モデルの理解が必要 だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる : デフォルトの名無しさん [sage] 2018/05/11(金) 16:43:05.52:ArEHxDOw Z80からはじめよう。 : デフォルトの名無しさん [sage] 2018/05/11(金) 17:23:03.14:fUD4+ayW 実用レベルのCで関数ローカル変数がどう実現されてるか、となると ベースポインタというほぼ専用のレジスタが出てくるからなぁ。 そういえば昔、Cが全然分からない頃にMASMの本を読んだら、 Z80や6502のアセンブラではついぞ出てこないディレクティブが色々あって まったく意味が分からなかったのを思い出した。 高級言語のコンパイラを作ったり、ライブラリとして呼べるマシン語の サブルーチンを作るための機能なんだと後になって腑に落ちたけど。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/05/11(金) 17:39:10.37:e+Ei11A7 C の言語としての理屈が現代のコンピュータの仕組みと乖離しててもはや低級言語とは言えないということを 「C は PDP-11 エミュレータ」なんて揶揄してるのをどこかで見たことがあるな。 : デフォルトの名無しさん [sage] 2018/05/11(金) 17:48:59.53:S57n19k4 Cに引きずられて仕様のできたMIPSはCの理解にとてもいいよ : デフォルトの名無しさん [sage] 2018/05/11(金) 19:45:01.89:CPfY1M+a 龍芯3号か : ◆QZaw55cn4c [sage] 2018/05/11(金) 20:48:44.74:/s88DeTW マシン語をやるのなら、実際に石を触れる感じのする環境がいいなあ、あくまで「感じ」だけれども 仮想マシンの中間コードを触るのは疑問 : デフォルトの名無しさん [sage] 2018/05/11(金) 20:52:01.78:Mluu9Rs0 PCはPCで面白いし、 8bitは8bitで面白い : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/05/11(金) 20:54:19.03:e+Ei11A7 AKI-80 の時代の人なのでラズパイで電子工作とかやってるのを見ると隔世の感がある。 : デフォルトの名無しさん [] 2018/05/11(金) 20:56:49.04:2EGPeEG9 Donald Knuth の MMIX っていう言語は勉強するとためになりますか? : デフォルトの名無しさん [sage] 2018/05/12(土) 01:53:53.98:Cq1QtQw6 理解すると言っても何を勉強して理解するのか? という話だと思ったんだけど。 アセンブリやCPU関連の本以外で具体的に分かるものがあるというのがよく分からないな。 : デフォルトの名無しさん [sage] 2018/05/12(土) 04:35:38.94:F7LxnV/h wikipedia の「コールスタック」の項に意外にしっかりした説明あるな コールスタックって何?スタックフレームってなに? って人は読んでおくといいと思う。 : デフォルトの名無しさん [] 2018/05/12(土) 14:17:18.55:CbmhA0Cx メモリとかスタックとかヒープとかって、C/C++ 言語仕様とは直接の関係がないけど、使う上では結構重要な情報だよねー。 Cを学習する上で避けられない割に、C視点側からの詳しい学習書って無いよなー。 環境依存部分だから、言語学習書に適さないってのもわかるんだが…何とかできないものかと常々思ってる。 (思ってる「だけ」で実行には移さないのだけれどもw : デフォルトの名無しさん [] 2018/05/12(土) 14:20:15.63:CbmhA0Cx ならないと思う。 クヌース先生の本を読む上での決まり事を、先生が定義しただけに過ぎない、と理解してる。 : デフォルトの名無しさん [sage] 2018/05/12(土) 15:41:16.04:9vavBtpK RISC-Vの方がまだ有用な可能性が : デフォルトの名無しさん [] 2018/05/23(水) 19:24:44.84:Au5e7VGg 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 AA6VB : デフォルトの名無しさん [sage] 2018/05/24(木) 10:45:43.84:cPlRxlDn AA6VB : ◆QZaw55cn4c [sage] 2018/05/24(木) 20:42:22.15:dCOL2CYR たしかに、そこをつく本を書けば売れるかもしれない そんな本に書くべきことは、他に何があるだろうか? ・qsort() の説明 ・アセンブリ言語とのリンク ・PEフォーマット …etc : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/05/24(木) 21:49:22.52:jqqWnK8Z ,780 江添氏が C++ の入門書で、言語以外の周辺事情もある程度カバーしたものを書こうとしてるみたいだぞ。 今は二の補数を説明すべきかどうかとか TWITTER でグダグダ言ってるから、 当たり前みたいで、しかし説明を省略されがちなことも含まれると思う。 : デフォルトの名無しさん [sage] 2018/05/24(木) 22:04:43.75:hqF4m+Xg シフトを使って多倍長計算とか、ZDDとか(クヌースの4巻だけど日本発) : デフォルトの名無しさん [sage] 2018/05/24(木) 23:04:39.55:agu/wXZc 浮動小数点の誤差がらみとか、バッファオーバーフローでなんで脆弱になるのかとか、キリがなくなるぞ : デフォルトの名無しさん [sage] 2018/05/25(金) 06:31:49.05:ZdzP9wu5 コンパイルとリンクとロードの話とか。 ソースファイルからオブジェクトファイルに変換したときに どんな情報が残ってどんな情報が消えるか。 オブジェクトファイル群をリンクした段階でまだ確定せずに 実行時のロードで配置されるアドレスのこと、あたり。 : デフォルトの名無しさん [] 2018/05/31(木) 19:40:53.15:xDJZQ821 ちょっとCと関係ないですが、コンピュータサイエンティストの人がよくMacを使っているのはなぜですか? : デフォルトの名無しさん [sage] 2018/05/31(木) 19:48:19.66:DFMmAXw3 しねばいいのに : ◆QZaw55cn4c [sage] 2018/05/31(木) 20:29:52.32:4k9lsrlf 二の補数はあたりまえに書いてもいいとおもうけれども、二の補数以外のものがあることを陽に記述する必要はないんじゃないかな… : ◆QZaw55cn4c [sage] 2018/05/31(木) 20:30:39.27:4k9lsrlf Mac はお高いからな… : デフォルトの名無しさん [sage] 2018/05/31(木) 22:34:17.78:Dy3hGHo2 17"でお手頃価格なWindowsなNoteが他に無くてね HPとかDELLだと2.5kgとか : デフォルトの名無しさん [] 2018/05/31(木) 22:37:50.13:xDJZQ821 ありがとうございます。 使い勝手がいいとかそういうことはないですか? : デフォルトの名無しさん [sage] 2018/05/31(木) 22:42:46.81:Dy3hGHo2 当時は無かったな。 MSのセミナーとかもmac+windows多かったよ : デフォルトの名無しさん [] 2018/06/02(土) 18:09:00.04:YEAzW6Zk ヘッダーファイルについて質問なのです。 ヘッダーファイル内で、 ostream というのを使っているのですが、 #include <iostream>をヘッダーファイル内に記述していません。 エラーが出るだろうと思いつつ、ビルドしてみたらエラーが出ませんでした。 これはどういうからくりでしょうか? : デフォルトの名無しさん [sage] 2018/06/02(土) 18:23:14.65:tlq/OxaF ヘッダファイルの中じゃなくostreamを使っている翻訳単位(cppファイル)の中で最低1回include iostreamされてればOK : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/02(土) 18:25:58.96:LSJtd55X 他のヘッダファイルで include してて間接的に読み込んでいることになってるってのが、一番ありそうかなぁ。 : デフォルトの名無しさん [] 2018/06/02(土) 18:30:00.66:YEAzW6Zk ありがとうございました。 ↓のファイルをビルドするとエラーが出るのですが、何が原因かよく分かりません。 フレンド関数関連だと思います。フレンド関数については全く知らないので、真似して 作っただけです。 Vec.h ttp://codepad.org/3ROYH1yq Vec.cpp ttp://codepad.org/f3eSheBS : デフォルトの名無しさん [sage] 2018/06/02(土) 18:30:45.89:YEAzW6Zk ありがとうございました。 もしかしてヘッダーファイルのみをビルドしてもオブジェクトファイルはできないんですか? : デフォルトの名無しさん [sage] 2018/06/02(土) 18:34:39.57:YEAzW6Zk ある本に書いてあるコードでは、 Vec.h と Vec.cpp のようには分かれていないため、 自分で分けたのですが、エラーになってしまいました。 : デフォルトの名無しさん [] 2018/06/02(土) 18:46:23.02:RQ4rJlvL 定義があればヘッダだけでもオブジェクトファイルに実装はできますよ。 : デフォルトの名無しさん [sage] 2018/06/02(土) 18:50:06.69:YEAzW6Zk Vec.h ttp://codepad.org/3ROYH1yq 上のVec.hの最初の方の #include <iostream> #include <cassert> 削除してもビルドエラーが出ません。 プロジェクトにはVec.hしかない状態でビルドしました。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/02(土) 18:55:56.26:LSJtd55X テンプレートのエラーはテンプレートが実体化するときに出ると思うよ。 だから、テンプレートを使ってないなら、エラーがあってもコンパイル自体は出来たりする。 : デフォルトの名無しさん [sage] 2018/06/02(土) 19:00:50.14:YEAzW6Zk ありがとうございました。 あともう一つ質問なのですが、ロベールの本に、 「関数を実体化するには呼び出したところからその実装が見える必要があります。」 「つまり、関数テンプレートは宣言と実装をヘッダファイルとソースファイルに分離して 書くことはできず、すべてヘッダファイルで実装する必要があるのです。」 と書いてあります。 クラステンプレートについては同様の記述がないのですが、 クラステンプレートについても宣言と実装をヘッダファイルとソースファイルに分離して 書くことはできず、すべてヘッダファイルで実装する必要がありますか? : デフォルトの名無しさん [sage] 2018/06/02(土) 19:00:59.43:uqsytqRM このへんの問題かな? ttps://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends) : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/02(土) 19:06:46.84:LSJtd55X Yes。 テンプレートはヘッダファイルに書く必要がある。 同じ実体 (テンプレート引数も同じなテンプレート) はリンク時に統合されるので、 最終的な実行ファイルに複数の実体があったりはしない。 : デフォルトの名無しさん [sage] 2018/06/02(土) 19:21:25.63:YEAzW6Zk ありがとうございました。 ちょっと理解できないと思うので、あきらめて ttp://codepad.org/ABfo8I3a としたところビルドできました。 ありがとうございました。 : デフォルトの名無しさん [sage] 2018/06/02(土) 19:22:03.75:YEAzW6Zk ありがとうございました。 : デフォルトの名無しさん [] 2018/06/03(日) 17:10:25.43:XweloLai ヘッダファイルについて質問です。 assert() が使いたいため、「List2.h」内に、以下のように書いたとします。 #pragma once #include "List.h" #include <cassert> 実は、「List.h」内にも#include <cassert>が書いてあります。 ヘッダファイルにはすべて#pragma onceを書いているので多重インクルードについて 問題はないと思います。 そこで質問なのですが、「List2.h」内で assert() を使っているため、自分としては、 必要ありませんが、「List2.h」内にも#include <cassert>を書いた方が分かりやす いのではないかと思いました。 既にインクルードされていてもあえて、#include <> を書くという人はいるのでしょうか? それとも、既にインクルードされていることに気付いている場合には、できるだけ #include <> は書かないほうがいいのでしょうか? : ◆QZaw55cn4c [sage] 2018/06/03(日) 17:20:14.25:5RsKIUxf すでにインクルードされているかどうかは書いているときにはわからない、から書いとく ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った しかしテンプレート関数に assert() が入る場合があるのだから、こういったこともあり得るのかもしれないが、まだ私は体験していない… : デフォルトの名無しさん [sage] 2018/06/03(日) 17:34:16.61:XweloLai ありがとうございます。 >ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから >ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った ここのところがよく理解できないのですが、 List.h にテンプレートクラス List<T> が書いてあって、 List2.h には List<T> を継承したクラス List2<T> が書いてあります。 そして、List.h, List2.h の両方で assert() を使っています。 : ◆QZaw55cn4c [sage] 2018/06/03(日) 17:36:57.15:5RsKIUxf うんうん、なるほど テンプレートに assert() が含まれているのならば、ヘッダに #include <cassert> が入るのも止むを得ないです : デフォルトの名無しさん [sage] 2018/06/03(日) 17:47:06.72:XweloLai ありがとうございました。 また質問で申し訳ないのですが、今度は、全く違う質問になります。 一方向リスト用のセルである Cell<T> というクラスを作りました。 Cell<T> のメンバ変数は、 T data Cell<T> *next です。 List<T> には、一方向リストの先頭のセルを指すメンバ変数 Cell<T> *head およびリストに挿入したり、 リストから削除したり、リストのサイズを返したりする様々なメンバ関数があります。 List<T> は一方向リストでしたが、List2<T> は双方向リストにしたいとします。 オブジェクト指向プログラミングでは再利用が重要ということなので、 新たに、双方向リスト用のセルを作るのではなく、 Cell<T> を継承して Cell2<T> というクラスを作ることにします。 Cell2<T> には新たにメンバ変数 Cell<T> *prev を追加します。 List2<T> のほうも List<T> と共通で使えるメンバ関数があるため、再利用したいとします。その場合、気持ちとしては、 List<T> のメンバ変数 Cell<T> *head は無効にして、新たに、 Cell2<T> *head と Cell2<T> *tail をメンバ変数に したいです。 そして、Cell2<T> に対しても使えるメンバ関数はそのまま使い、双方向リストにしたことにより、より効率的に実装できる メンバ関数については、オーバーライドしたいです。 上記のようなことをどうやって実現したらよいのか分からないのですが、可能でしょうか? 可能だとして、こういうやり方は非推奨でしょうか? : デフォルトの名無しさん [sage] 2018/06/03(日) 20:55:43.49:E53R3BDh 一方向・双方向リストの、ソースコードを見た方が速い 繰り返しを表す、C++ iterator みたいな、 抽象クラス・インターフェースでも使っているのだろう : デフォルトの名無しさん [sage] 2018/06/04(月) 08:19:48.74:DAGyu3MW 再利用など考えず 一から好きなように双方向リストを作れ >オブジェクト指向プログラミングでは再利用が重要 は幻想 この場合で言ったらまったく逆で もともと何か双方向リストがあって、継承して機能制限をして一方向リストに仕立て上げるなら分かるが 一方向リストを継承して双方向リストにするなどイカれてる : デフォルトの名無しさん [sage] 2018/06/04(月) 09:50:25.37:3BCLNr2e 一方向リストと双方向リストでどれ程共通的な処理があるのか知らんけどCellBase<T>に共通的な処理を定義してそれからCell<T>とCell2<T>を継承させるのが普通じゃね? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/04(月) 13:04:55.31:zKvF3SpI どうだろう。 総合的な判断が必要という前提はあるけども、 継承が妥当なときの基準のひとつに「is a 関係であるか?」ってのがあるよね。 XはYの一種であると言えるときはXはYを継承していい。 双方向リストは一方向リストの一種であるかというと、まあ Yes って呼んでいいんじゃないの。 ただ、それで楽に使いまわしが出来るかというとそうでもないこともあるので、楽なように作ればいいよ。 練習でやるのなら、使いまわしは置いてそれぞれを作ってみた上で、 共通な部分を探してデザインしなおしてみるというのもいいんじゃないかな。 クラス定義自体は継承関係を持たずにトレイトの方で性質を定義したりとかいったことも今どきはよくやるし、 将来的にコンセプトが入ったらそっちが主流になるかもしれん。 : デフォルトの名無しさん [sage] 2018/06/04(月) 13:18:55.79:K9p9OoRg もともと何か一方向リストがあって、継承して機能追加をして双方向リストに仕立て上げる これはダメなん?継承は機能追加ダメなん? : デフォルトの名無しさん [sage] 2018/06/04(月) 13:19:07.80:e7JLMPXe ありがとうございました。 本を見ると再利用が重要と強調されているので、拘ってしまいました。 ありがとうございました。 ありがとうございました。 : デフォルトの名無しさん [sage] 2018/06/04(月) 13:20:24.25:e7JLMPXe ありがとうございました。 : デフォルトの名無しさん [sage] 2018/06/04(月) 13:43:52.15:3BCLNr2e はだいぶイカれてるから触らないで : デフォルトの名無しさん [sage] 2018/06/04(月) 14:30:56.26:YRbUwbvV 単方向リストから双方向リストを派生させると、内部構造が違うから相違を埋めるのに面倒臭い事になる 派生した双方向リストから単方向リスト内部のノード列にアクセスできたとしても 単方向リストの状態は単方向でノードが繋がっているのだから双方向リストからどうこうはできない 結局の所、双方向用のノードを単方向用ノードにアップキャストしないと格納できないし、取り出すにはダウンキャストしないといけない もし何とかして単方向リストに双方向用のノードを双方向に数珠繋ぎ出来たら、そのリストはもう双方向リストだよ あと、insert()の問題もある、std::forward_listの持つinsert_after()が何故そうなのかは構造的に一目瞭然でしょ 厳密に言えば、std::forward_listはコンテナ要件を満たしていないしな 単方向も双方向もLinked Listとして構造的に似ているが効率的に見ても構造的に見ても別のデータ構造だよ is-aの関係ですら無いし、再利用ってのはhas-aの関係を考えるべきで、継承は再利用するためのものではないよ 例えば、皆、std::stringをhas-aで利用するよね、std::stackはstd::vectorやstd::listなどのアダプタだよね : デフォルトの名無しさん [sage] 2018/06/04(月) 16:46:27.38:OAwYb5Pt 自分の勉強用だったら、継承した双方向リストクラス作ってみて 「やっぱ普通に作った方が簡単にできたな」って経験をするのもいいと思う よく「オブジェクト指向はこうだから」って言葉にこだわって面倒くさいことしてる人いるけど プログラムの基本としては「わかりやすさ」「シンプルさ」こそこだわった方がいいと思うから 将来拡張予定がないプログラムなんかだと無駄な継承しない方がいい : ◆QZaw55cn4c [sage] 2018/06/04(月) 19:05:36.84:gbEnuF2j キーワード「継承」もずいぶんと評価が落ちたものですねえ… : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/05(火) 02:58:20.15:l2agtc6/ C++ からクラスが無くなることは無いだろうが、 構成の仕方の流行はだいぶん変わってて、 コンセプトが入ったら一気に再編されるかもしれない。 クラスの継承ってそんなに万能じゃないよ。 : デフォルトの名無しさん [sage] 2018/06/06(水) 12:11:26.28:ucySJasT ま、そういうことです 単方向リストを継承して双方向リストにするのは悪手 やってみるまでもなくわかるだろJK 結局ほぼすべてのメソッドを上書きしないといけないから意味ない しかも一から双方向リストを書いた方が分かりやすいし速い : デフォルトの名無しさん [sage] 2018/06/06(水) 12:24:14.11:ucySJasT この場合、どうしても手抜きしたかったら 大は小を兼ねるの考えで、双方向リストのみを作って 単方向リストを使う場面でも双方向リストを使えばよい それがベストだろうというアンサーがちらついてるからこそ、余計に 単方向リストを継承して双方向リストってのが悪手に見えるんよなぁ 余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし 単方向リストなどその程度の扱い、必要ない : デフォルトの名無しさん [sage] 2018/06/06(水) 15:11:28.97:5kytDI4t >余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし std::forward_list など無かった : デフォルトの名無しさん [sage] 2018/06/06(水) 18:07:41.59:9YbuVUhL いやあ、単方向リストはそれはそれで使い道はあると思うよ 大体、キャッシュに載り易くメモリ効率も良いstd::vectorで十分だけど 挿入操作を多用するならstd::listやstd::forward_listの方が良いよね std::forward_listは、std::listよりも要素N個 x ポインタサイズ分のメモリ消費量を抑えられるし イテレータを使ってO(1)で連続してpush_back()みたいなことも出来る、pop_back()みたいなことはO(1)で出来ないけどね 必要性を問うよりも、その特徴を理解して適切に効率的に使うことが大事なんじゃないかな まあ、std::mapやstd::setは使うのを躊躇するけどな O(log n)で値を取り出せて、イテレータでソートされた要素に順次アクセス可能を売りとするけど、メモリ効率が悪すぎる 他の言語のそれらが大体ハッシュテーブルで実装されているのを見るに連想コンテナはunordered系で十分な気もする : デフォルトの名無しさん [sage] 2018/06/06(水) 19:32:54.16:ucySJasT 言葉が足りなくて申し訳ない 俺もリンクリストを使うことは有るけど、大概切迫していてカリカリカスタマイズしたいときに使うものだから 汎用のテンプレートのリンクリストを使ったためしがない 一方向リストなら、なおのこと使わない : デフォルトの名無しさん [] 2018/06/06(水) 20:16:30.41:rNkLMN6z 単方向リストを継承して双方向リストを作ることは無いと思うけど、コンポジットすることはあると思う。 ゼロコストの原則の視点に立つと、単方向リストを実装に流用して、双方向リストを作成するのもあり。 : デフォルトの名無しさん [] 2018/06/06(水) 20:30:07.38:sZLPzbQ0 STLのコンテナにstd::unique_ptr突っ込むと、カスタムアロケーター使えないよな? : デフォルトの名無しさん [] 2018/06/06(水) 20:32:29.81:sZLPzbQ0 O(1)で10個挿入したら、O(1)*10なんだから、結局O(N)じゃないの? : デフォルトの名無しさん [] 2018/06/06(水) 20:34:19.38:sZLPzbQ0 もしかして、std::unique_ptrを突っ込むのがすでに間違いで、std::anyを使えってことなんだろうか。 : デフォルトの名無しさん [sage] 2018/06/06(水) 21:03:14.93:9YbuVUhL std::forward_listとそのイテレータだけでFIFOのQueueを実装できたりするよ イテレータを介したinsert_after()になるから要素を入れるコストはイテレータのコピー分、std::queueよりも高くなると思うけど std::queueはstd::dequeかstd::listを利用するから、std::forward_listで実装した方がメモリ使用量は少ない 単方向リストを使用して独自実装した方が低コストに抑えられると思うけどね まあ、再利用も良し悪しって事だね : デフォルトの名無しさん [sage] 2018/06/06(水) 21:09:23.87:9YbuVUhL ごめん書き方が悪かった、1つの要素の挿入にO(1)って意味ね Linked Listは、挿入場所への移動にO(n)かかり、挿入にO(1)かかるから 最後の要素を指し示すイテレータを保持してたらpush_back()みたいなことも出来るよって話ね : デフォルトの名無しさん [sage] 2018/06/09(土) 00:34:24.48:l0w/1aK3 std::array の empty()メソッドって意味があるのか?と最近思ったので質問させてください arrayは通常 array<int, 固定値>のように宣言してから使うと思うのですが、 empty()メソッドの戻り値は <int, 0> 以外は全てfalseでした。 つまり通常<int,(0より大きい整数)>で宣言して使う場合empty()はfalseしか返ってこない 気がするのですが、このメソッドは意味があるのでしょうか? : デフォルトの名無しさん [sage] 2018/06/09(土) 05:56:11.66:nuHHgQUg テンプレートを使って異なる種類のコンテナに共通に使える処理を書くときに、他のコンテナ達と共通の関数を備えていると都合がいいからかなと思う。 : デフォルトの名無しさん [sage] 2018/06/09(土) 12:31:35.52:pc7gEgF8 そのメンバの存在意味の有無に関わらず、コンテナ要件の1つだからね 他のオブジェクト指向言語でのインターフェイスや抽象クラスを用意していないだけで コンテナとして共通の要件(インターフェイス)が設けられている 例えば、size()、empty()、begin()、end()など 本来、動的なポリモーフィズムをするためにインターフェイスや抽象クラスを設けるけど vtableは高コストだから、ゼロオーバーヘッドの原則に則り使用していないのよ まあ、コンテナ自体STLの1つだからオブジェクト指向的な機能は意識していなかったと思うけどね 余談だが、聞いた所によるとテンプレートって最初マクロで実現しようとしてたらしいね : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/09(土) 12:50:19.63:EdmRUNh7 具体的にコンテナに求められる要求はここでまとめられているので参考になれば。 ttp://ja.cppreference.com/w/cpp/concept/Container クラスに求める要求を表現するための機能「コンセプト」は C++ の悲願としてずっと前から温められているのだけれど、 なかなか仕様に入らずに先送りされてるという状況。 : デフォルトの名無しさん [sage] 2018/06/11(月) 16:42:05.03:SE5SjeC/ ファイルから読み込んだバイト列の先頭部分を参照して、 それがJPEGファイルなのか、PNGファイルなのか、などを判定したいのですが、 どの程度の判定をすればよいものなのでしょうか。 例えばJPEGファイルなら、先頭3バイトを{0xFF, 0xD8, 0xFF}とmemcmp()で十分なのでしょうか。 : デフォルトの名無しさん [sage] 2018/06/11(月) 16:50:15.52:9mmiVsnm 十分かどうかは時と場合による : 放置された蟻人間 ◆T6xkBnTXz7B0 [sage] 2018/06/11(月) 16:51:12.74:7op9QnGW 画像ファイルには、過去にいくつか脆弱性が確認されている。使用において、脆弱性の存在が致命的ならば、きちんとチェックすべきだし、 処理スピードを優先するなら、memcmpで十分。 : デフォルトの名無しさん [sage] 2018/06/11(月) 17:03:57.96:SE5SjeC/ すいません、十分というのは、ファイルの破損や脆弱性関連は置いておいて、 他の形式の正常なファイルも拾ってしまわないかということです。 JPEGの場合、先頭の3バイトを判定すれば、他の正常なファイルが引っかかることはないのでしょうか。 : デフォルトの名無しさん [sage] 2018/06/11(月) 17:06:17.81:3AghcpDH 中身見ないなら、拡張子でもできそうだが : デフォルトの名無しさん [sage] 2018/06/11(月) 17:12:32.50:oqoWhxjw 3バイトをランダムなデータと比較する場合、1/16777216の確率で誤認する ファイルを最後までパースして、JPEGデータとして読み込めるかどうかチェックするのが確実だが : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/11(月) 17:40:03.88:CXPnR3I1 POSIX には file コマンドがあってファイルの種類を判定できるけど、その実装はヒューリスティックだよ。 参考になるとは思うから読んでみるのもいいんじゃない? ライセンス的に OK ならそのまま流用してもいいかも。 どの程度の精度で判定すべきかは状況によるので総合的に考えてとしか言えない。 例えば、 jpg ではないファイルが多数ある中から jpg を探すというような状況だったら、 先頭をちょっとだけ読んで jpg っぽかったら全部を読んで詳細に判定するというのでもいい。 ほとんどが jpg なのだったら、いちいち詳細に判定するのは速度的に遅くなるけど、それが許容できるのか、 許容できないのであればどの程度まで緩い判定にしていいのか、バランスの問題。 : デフォルトの名無しさん [sage] 2018/06/12(火) 12:54:07.45:xDeIiE2o なぜ多数から探すかどうかで判定方法が変わるのか : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/12(火) 13:09:55.18:U9ShKAeR 速度とかとのバランスだって書いてあるつもりだけど、わかり難かった? : デフォルトの名無しさん [sage] 2018/06/12(火) 13:15:57.78:BvPEMwcC 明らかに一致しない時は瞬時に判断出来る ヘッダですぐにわかるので jpgではあるんだけど 非対応フォーマットとか一部化けてて表示出来ないとか そういう判断が難しい : デフォルトの名無しさん [sage] 2018/06/12(火) 13:34:24.68:BvPEMwcC はちみつはJPGを扱ったことが無いってのがよく分かる : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/12(火) 14:45:14.29:U9ShKAeR えっ? だからまずは先頭をちょっとだけ読んでみる (この判定だと false positive はあっても false negative はない) という話なんだけど。 : デフォルトの名無しさん [sage] 2018/06/12(火) 16:23:32.57:LTqXdgcV 元の の質問に戻れば「どんなファイル群を扱うのかによる」としか 言いようがないんじゃないか? 極端な話、行儀の良いファイルだけなら拡張子で判定しても大丈夫。 (拡張子が間違ってるけど)一般的なファイルばかりなら先頭の何バイトかで判定。 悪意を持って偽装ヘッダや追加情報エリアまで利用してる可能性を気にすれば JPEGの規格に準拠してるファイルでさえ危険、というレベルまであるかも。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/12(火) 16:44:07.95:U9ShKAeR ある程度は信じて割り切るしかしょうがない。 : デフォルトの名無しさん [sage] 2018/06/12(火) 17:43:08.97:RH6dhGDk JFIF以下のJPEG出す機材って監視カメラ以外見たことないなぁ 実運用上はJFIFとEXIF以外は対象外でも良いのかも : デフォルトの名無しさん [sage] 2018/06/12(火) 17:56:59.93 ポインタでないなら、継承した関数を呼び出すときに、仮想テーブル参照による動的オーバーヘッドはないのですよね? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/12(火) 18:20:08.25:U9ShKAeR Yes それが仮想関数であろうとも、 オブジェクトへのアクセスがポインタ経由でないならば どの関数を呼び出すのかコンパイル時に確定可能なので、 仮想関数テーブルにアクセスする必要はない。 (はずだと思うが言語仕様での保証はないだろうし、 実態がどうなってるか確かめたことはないんで、 誰かやってみてくれんかな。) : デフォルトの名無しさん [sage] 2018/06/12(火) 18:35:01.32:Q/HiJGFf ファイル判別の一般論じゃなくてjpgの判別ですよ jpgの判別方法を語ればいいんです 文字コードと違ってあやしいとかはなくて APPnの中数バイト見れば簡単にわかるんですよ 文字でJFIFとかExifとか書いてあるわけなんで 偽装が無いならこれで十分 あとは 対応フォーマットであるのか 正しいフォーマットであるのか 実際にデコード出来るのかどうか などを判別する必要があるかどうかでその先が決まる : デフォルトの名無しさん [sage] 2018/06/12(火) 18:43:20.13:RH6dhGDk baka? : デフォルトの名無しさん [sage] 2018/06/12(火) 18:57:45.80 ありがとうございます : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/12(火) 20:19:36.50:U9ShKAeR 何言ってんの? その偽装があるかもしれん (ということも想定に入れるかどうは場合による) という話なんだけど。 : デフォルトの名無しさん [sage] 2018/06/13(水) 00:32:03.88:21BMiWPP を読んでの発言? 日本語が読めないの? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/13(水) 01:55:04.01:3eXA0K0W なるほど、偽装に騙されるのは脆弱性の内 (で、それはないという前提が提示された) という解釈? 判定を誤りうる (データを作れる) のとセキュリティ的な欠陥をなんとなく区別してたけど、 質問者の感じからすると、確かに偽装で騙されるのは脆弱性の内かな。 : デフォルトの名無しさん [sage] 2018/06/13(水) 01:56:34.26:l7UBIPff JPEGの規格書を読んだ事が無いだろう : デフォルトの名無しさん [sage] 2018/06/13(水) 07:50:57.05:vaxyQxvX 昔ゲーム機のハックで偽装した画像ファイルを読み込ませるってのがあったような気がする。 : デフォルトの名無しさん [sage] 2018/06/13(水) 08:14:06.81:7lldK1Da を合わせた質問の意図からすると、 JPEG以外で先頭3byteが {0xFF, 0xD8, 0xFF} のファイル形式が存在するか、 普通に出回ってるか? という問題じゃないのかな。 : デフォルトの名無しさん [sage] 2018/06/13(水) 09:42:34.58:V88S+L9t ゲロトラップとして普通に出回ってないかね? : デフォルトの名無しさん [] 2018/06/13(水) 09:46:09.42:Lf/dU7gs テンポラリオブジェクトについて質問です。 ロベールの本ですが、 「 Hoge Two() { Hoge n(2); return n; } int main() { Hoge hoge(1); hoge = Two(); とした場合、基本的には n のコピーがいったん作られて、それが hoge に 代入される形になります。このコピーこそが、テンポラリオブジェクトになる わけです。 」 と書かれていますが、なぜわざわざ n のコピーを作るのでしょうか? n は Two() 関数を抜けたら消えてしまいますが、これを消さずに、 返した方が効率的な気がします。 : デフォルトの名無しさん [] 2018/06/13(水) 10:17:19.41:Lf/dU7gs ・テンポラリオブジェクト = n のコピー ・代入により、 hoge に テンポラリオブジェクトがコピーされる。 これはなんか非常に無駄なことをやっているように思ってしまいます。 hoge に 捨てずにとっておいた n を参照させれば十分のように思います。 : 838 [sage] 2018/06/13(水) 10:17:36.81:818/kKId みなさんありがとうございます。 話が難しい方向に進んでしまってすいません。 勉強させていただきます。 元々の疑問はの言われるとおりで、 他の形式の画像をJPEGだと誤判定してしまわないか、 さらに言うと、先頭が{0xFF, 0xD8, 0xFF}以外のJPEGファイルも存在していて、 JPEGファイルを見逃してしまうことがあるのか、ということでした。 : デフォルトの名無しさん [sage] 2018/06/13(水) 14:58:14.75:54SDWBzN そういう時こそ右辺値参照ですよ hoge = std::move(Two()); でもこんな事をしなくても大抵戻り値最適化(RVOやNRVO)でコピーコンストラクタは呼び出されない 明示的にムーブコンストラクタを無効にするとコンパイルエラーが発生するはず Hoge(Hoge&&) = delete; : デフォルトの名無しさん [sage] 2018/06/13(水) 14:59:33.86:54SDWBzN そしてこの場合代入演算子をオーバーロードしてやるとそちらが使われる Hoge& operator=(const Hoge& hoge) { std::cout << "assign operator called." << std::endl; return *this; } : デフォルトの名無しさん [sage] 2018/06/13(水) 20:08:20.11:VLQaO2hj (最適化をおいとくと)値渡し/値返しってそういうもんじゃん Two()内の変数nは自動変数だからスタックに作られる とっとけないじゃん : デフォルトの名無しさん [sage] 2018/06/13(水) 21:00:21.79:qH/FTczC まあ2回コピーされるのを1回に抑えるための最適化でしょう : デフォルトの名無しさん [sage] 2018/06/13(水) 21:08:53.19:buJbRccy 確実なのは戻り値じゃなくて参照、もしくはポインタにすること : デフォルトの名無しさん [sage] 2018/06/13(水) 21:40:28.10:GheUJm4W それヤバくね?関数を抜けた途端消える存在を参照するとか : デフォルトの名無しさん [sage] 2018/06/13(水) 22:09:20.49:1EWuco5t 呼び出し元から参照を渡してそこに返してもらえってことじゃなくて? : デフォルトの名無しさん [sage] 2018/06/13(水) 22:13:11.63:21BMiWPP もちろんそう 昔ながらの方法 : デフォルトの名無しさん [sage] 2018/06/13(水) 23:23:40.79:MDGDBDRC -Wreturn-local-addr みたいなwarningじゃなくて規格でエラーにすれば873みたいな勘違いは無くなるのにな : デフォルトの名無しさん [sage] 2018/06/14(木) 10:53:47.52:BKSAN5oR 普段c#使っているのですが、c++/cliでデータベース絡みのdllを作ってて、わからないことがあります。 SqlConnectionやDataSetのDispose()がインテリセンスでは候補に上がるのに、コンパイルで「メンバーではありません」とエラーになります。 スコープを抜けると破棄されるので何もしなくてよいという認識でよいのでしょうか? また、この理屈で、c#の勝手に破棄してくれるusing相当の機能はない、と言うか、必要ないのでしょうか? : デフォルトの名無しさん [sage] 2018/06/14(木) 14:30:10.48:Lgo9GPo1 IDisposable使ってる? スコープ抜けてもGCによって回収されるタイミングは保証できない どうしてもすぐにGCしたいなら GC.Collect(); をする。 多分ジェネレーション0だろうから GC.Collect(0); でいいのでは : デフォルトの名無しさん [sage] 2018/06/14(木) 15:24:59.55:BKSAN5oR レスをござます。 作ってるクラスがIDisposableを継承しないとダメってことですか? 作ってるのはインスタンス作らなくてもいいstaticクラスなんですけど。 GCは効果の程を確認できないですが、やってみます。 : デフォルトの名無しさん [sage] 2018/06/14(木) 15:25:54.47:BKSAN5oR レスありがとうございます。です。 : デフォルトの名無しさん [sage] 2018/06/14(木) 16:42:09.02:79UoYXtL ttps://qiita.com/haniwo820/items/ba0ab725c25673c20338 こんなのとか staticクラスだとファイナライザーを書けないから内部で他のクラスをnewした場合が問題 それとメンバ変数もstaticでなければならない となると普通はアプリケーションが破棄されるまで残る IDisposableをstaticクラスが継承するとエラーになる というかstaticクラスはインターフェイスを継承できない むしろusingを使えない理由が分からない ttp://ufcpp.net/study/csharp/oo_dispose.html こういうのだとstaticクラス風にファイナライザーを走らせられる それかStreamみたいのでClose()したいのならClose()メソッドを書けばいい SqlConnectionやDataSetはいちいちClose()する必要があるのかな? : デフォルトの名無しさん [sage] 2018/06/14(木) 22:51:20.07:khTKmU6v ここの記述を信じるなら、全部Yesってことになるのかな。 ttp://mag.autumn.org/Content.modf?id=20050506023118 : デフォルトの名無しさん [sage] 2018/06/15(金) 09:10:59.15:8YDR1CpT です。 VS2013 c++のCLRコンソールアプリを新規作成したやつです。 include "stdafx.h" using namespace System; using namespace System::Data; using namespace System::Data::SqlClient; int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); String ^constr = "xxxxx"; SqlConnection ^connection = gcnew SqlConnection(constr); connection->Open(); connection->Close(); connection->Dispose(); return 0; } この Disposeでエラーになります。 ここには書いてませんがDataSetも Disposeでエラーになります。 上記コードの場合 Dispose抜きで問題ないのでしょうか? まさにこれを読みました。c#のusingがc++にはない認識です。 この理由がこの通りならDisposeなしで心配ないのですが。 : デフォルトの名無しさん [sage] 2018/06/15(金) 10:38:59.49:uIGrLsPa 共同ツール 1 ttps://seleck.cc/685 ttps://trello.com/ ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど Trello Chrome拡張機能 elegant ttp://www.kikakulabo.com/service-eft/ trelloのオープンソースあり 共同ツール 2 ttps://www.google.com/intl/ja_jp/sheets/about/ 共同ツール 3 ttps://slack.com/intl/ja-jp ttps://www.dropbox.com/ja/ ttps://bitbucket.org/ ttps://ja.atlassian.com/software/sourcetree ttps://www.sketchapp.com/ ttp://photoshopvip.net/103903 ttps://goodpatch.com/blog/sketch-plugins/ Trello Chrome拡張機能プラグイン集 ttps://chrome.google.com/webstore/search/trello?_category=extensions Slackプラグイン集 ttps://slack.com/apps Sketchプラグイン集 ttps://sketchapp.com/extensions/plugins/ ttps://supernova.studio/ : デフォルトの名無しさん [sage] 2018/06/15(金) 19:01:40.09:J8URhrRM によると、自動でDisposeさせたい場合は以下のようにする、 と書いてあるように見える。(手元に環境がないので未確認) SqlConnection connection(constr); connection.Open(); connection.Close(); : デフォルトの名無しさん [sage] 2018/06/16(土) 06:42:53.11:PCTFj+qN そのコードでconnection->Dispose();を消すだけだとDisposeは呼ばれない。 C++/CLIでDisposeを呼びたい場合「delete connection;」と書く。 C#のusing相当のことをしたい場合は 詳細は↓を参照。 ttps://loafer.jp/mixi/diary/class.xsp?2007-09-07-23-55 : デフォルトの名無しさん [sage] 2018/06/18(月) 12:02:02.44:P1toAgew Dispose の件で質問してた者です。 自作のIDisposableを継承したクラスを作って確認したところ delete で Disposeが通る事を確認できました。 不慣れで詰まらない質問してしまってすみませんでした。 : 865 [] 2018/06/20(水) 12:43:56.50:XX+H87IB みなさん、いろいろありがとうございました。 参考にさせていただきます。 ところで、 Cとアセンブリ言語で学ぶ計算機プログラミングの基礎概念 - プログラムはプロセッサ上でどのように実行されるのか 角川 裕次 ttps://www.amazon.co.jp/dp/4627848315/ この本を読んだ人はいますか? かなり自分にとって理想的な本のようですので、買ってみようと思います。 こういう本を読めば、少しは言語の設計者の気持ちが分かるようになるのではないかと期待します。 : デフォルトの名無しさん [sage] 2018/06/22(金) 23:22:38.51:pTq2TJuj あちらこちらでC++はひどい言語だって叩かれてるけどその割に広く使われている つまりこれはC++を頑張って覚えればその分見返りも大きいということではなかろうか。なにしろ人の嫌がること高いスキルが必要なことはそれだけ報酬も高いはずで : ◆QZaw55cn4c [sage] 2018/06/23(土) 00:11:02.67:OlLfOCSW C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが 簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを 追っぱらうため *だけ* だったとしても、それ自体、C を使う強力な理由になりうる。 C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、 それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる: - うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が 安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、 もはや笑えるレベルを超えている) - 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに 効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の コードがその素晴らしいオブジェクトモデルに依存していて、直すためには アプリ全体を書き直さなきゃなんない。 言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに 限定するってことは、他の人がそれをめちゃくちゃにしないってことで、 ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい 「オブジェクト・モデル」のたわごとを持ちこまないってことだ。 : デフォルトの名無しさん [sage] 2018/06/23(土) 10:31:52.34:UiVIxiJp 抽象化とコード(バイナリ)の質は相反するものだから : デフォルトの名無しさん [sage] 2018/06/23(土) 11:45:24.39:NcXYPjUn alignas(32)とかalignas(64)とかつけなくても大体アライメント揃ってる気がするんですけどつけた方がいいんですか? : デフォルトの名無しさん [sage] 2018/06/23(土) 12:58:59.14:g5s8p4AT リーナスのそれがいっちばん有名なC++批判よね : ◆QZaw55cn4c [sage] 2018/06/23(土) 13:53:36.35:OlLfOCSW linus は昔から C++ を批判していたが、git 開発に関する 2009 年のこれが、最も効果的な批判になっていますね これを読むと C++er は一瞬自分がわからなくなりゲシュタルト崩壊に陥りますね、もう c++11 over を追いかける気力も失せてしまいました… : デフォルトの名無しさん [sage] 2018/06/23(土) 14:43:13.01:DOoRmJ6H 抽象的な思考ができる人とそうでない人が居るというだけだな もSTLやboostの使い方が理解できない、良い抽象モデルが作れない人が愚痴ってるだけにしか読めんが : デフォルトの名無しさん [sage] 2018/06/23(土) 14:54:08.05:UiVIxiJp 抽象化が目的になって パフォーマンスとか使用リソースとか工数を軽視する人が実務経験の浅い人に多い ってのが問題であって 言語自体には罪はない : ◆QZaw55cn4c [sage] 2018/06/23(土) 15:32:24.63:OlLfOCSW >良い抽象モデル が役に立つとは限らないのでは? 抽象化を目的とするあまりに YAGNI を忘れてしまうのでは、これは重大な思考的欠陥なのでは? あれほどもてはやされていた GoF は、すくなくとも C++界では、もうみるかげもなく凋落の一途をたどっているのは、どうみるのでしょうか? : デフォルトの名無しさん [] 2018/06/23(土) 16:46:26.83:8e5n022B デザインパターンって廃れたんですか? だとすると、なぜ、デザインパターンは流行り、そして廃れたのでしょうか? 一度は流行ったということは確かに役に立つものだったのではないでしょうか? 一度は役に立つと認められたものがなぜ、否定されたのでしょうか? : デフォルトの名無しさん [sage] 2018/06/23(土) 16:51:17.93:7hlQnbj9 日本人は基本すっ飛ばして銀の弾丸欲しがるからな : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/23(土) 17:00:49.94:/E9OfcV+ デザインパターンってのは典型的なパターン (に名前を付けたもの) ってだけだよ。 基礎として押さえておくと便利だし、価値が失われたわけではないけど、 何もかもが既存のパターンに当てはまるわけではないという当たり前の話。 : デフォルトの名無しさん [sage] 2018/06/23(土) 17:15:09.64:DOoRmJ6H 抽象化とYAGNIは関係ありません こういう意見が出てくるあたりが良いモデリングを理解してない証拠ですね : デフォルトの名無しさん [sage] 2018/06/23(土) 17:29:02.45:ul2D0Jgq 別に廃れたわけではなく、使われるものは当たり前に使われてて取り立てて言われなくなっただけ。 : ◆QZaw55cn4c [sage] 2018/06/23(土) 17:30:40.89:OlLfOCSW たとえば、iostream をどう思う?これは良い抽象化の例ですか? : デフォルトの名無しさん [sage] 2018/06/23(土) 17:31:54.13:wjw7dXXk Visual C++6.0です。 Windows7でやってます。 ツールバーを作ると、ボタンを押すとペコってへこんで、また押すとまた戻りますが、見づらいので 押したときと戻ったときとで色を付けたいのですが、どこかにサンプルはないでしょうか また、私は未だに6.0でやっていてこれで十分にプログラムできるので特にこれで不満はないのですが もしバージョンを上げれば出来るのであればバージョンアップも考えたいと思っています 最新のバージョンで出来るのなら、そのサンプルも教えて頂けるとありがたいです : デフォルトの名無しさん [sage] 2018/06/23(土) 17:40:24.88:LiutUffZ OwnerDraw : デフォルトの名無しさん [sage] 2018/06/23(土) 17:59:38.49:wjw7dXXk CToolbarには、DrawItemがないようなのですが ステータスバーにはあります : デフォルトの名無しさん [sage] 2018/06/23(土) 18:04:15.08:LiutUffZ ナンシークラッツ本を探した方が良いかな : デフォルトの名無しさん [sage] 2018/06/23(土) 18:14:04.63:wjw7dXXk ツールバーに色を付けることもできないとか。ちょっと貧弱ですよね 最新のバージョンのVC+でも出来ないのかな。結構そういう要望はあると思うけど : デフォルトの名無しさん [] 2018/06/23(土) 19:24:24.28:8e5n022B 2分探索木を実装したC++プログラムを読んでいますが、分からないところに出くわしました。 ノードは以下のクラスです: template <typename T> class BinNode { private: T data; BinNode<T> *left, *right; BinNode(T d, BinNode<T> *l = NULL, BinNode<T> *r = NULL); friend class BinarySearchTree; }; 2分探索木のクラス BinarySearchTree 内のメンバ関数 insert の引数としてノードを渡すのですが、 なぜ、 BinNode<int>* tree ではなく BinNode<int>*& tree となっているのかが分かりません。本の説明によると、木構造の変形を可能にするためにそうしているとのことです。 bool BinarySearchTree::insert(int data, BinNode<int>*& tree) { … } : デフォルトの名無しさん [] 2018/06/23(土) 19:25:19.09:8e5n022B ありがとうございました。 一時は、もてはやされすぎたということですね。 : デフォルトの名無しさん [sage] 2018/06/23(土) 19:28:47.13:8e5n022B insert 内に、 if (tree == NULL) { : デフォルトの名無しさん [] 2018/06/23(土) 19:29:33.57:8e5n022B insert 内に、 if (tree == NULL) { tree = new BinNode<int>(data); … } というコードがありましたが、これのことでしょうか? : デフォルトの名無しさん [] 2018/06/23(土) 19:30:15.04:8e5n022B あ、そのようですね。 : 放置された蟻人間 ◆T6xkBnTXz7B0 [sage] 2018/06/23(土) 19:30:26.05:QXtVRpnb void f(int *a) { static int s_i = 0; a = &s_i; } int main(void) { int i = 3; int *p = &i; f(p); printf("%d\n", *p); return 0; } : デフォルトの名無しさん [sage] 2018/06/23(土) 19:45:59.33:8e5n022B ありがとうございました。 3のままですね。 : ◆QZaw55cn4c [sage] 2018/06/23(土) 19:54:24.54:OlLfOCSW これは C の課題ですね。 適当な二分木ないし二分探索木に対して、ノード(節)を追加したり削除したりする関数を書く場合、 C ならば add_node(node **root, ...) と書きます。@ これを C++ ならば add_node(node *&root, ...) と書くこともあります。node *&root は「ポインタ変数の参照」です。A @とAとではプログラムの表現もかわります。 これは一度、白紙の状態から自分の手で書くのが、理解するのに一番です。お試しあれ。 : デフォルトの名無しさん [] 2018/06/23(土) 21:09:04.41:nmsTY6vF 0,115200 1,38400 2,19200 3,9600 こういう関係がある時に配列を作れば1から38400はダイレクトに求められるが 検索を使わずに38400からダイレクトに1を求める方法はないだろうか? : デフォルトの名無しさん [sage] 2018/06/23(土) 21:22:36.64:b0QIE6qX 115200個の配列 : デフォルトの名無しさん [sage] 2018/06/23(土) 21:26:12.81:EyvIrgyz A/9600 を添え字にして13個の配列で逆引き作る? : デフォルトの名無しさん [sage] 2018/06/23(土) 21:29:09.89:b0QIE6qX 9600の倍数であることがわかってるなら割ればテーブルは減る でも4個なら素直に検索した方が速い : デフォルトの名無しさん [sage] 2018/06/23(土) 21:41:29.91:EyvIrgyz 検索については同意 元質問は検索使うなって条件なので、まぁ 数値からRS232Cのボーレート設定を想定しちゃうけど、 それなら検索を嫌うようなもんでもないし… な… : デフォルトの名無しさん [sage] 2018/06/23(土) 22:02:58.56:ZZklpiyn a1 : b1 a2 : b2 a から、b への辞書と、 b から、a への辞書の、両方を作る : デフォルトの名無しさん [sage] 2018/06/23(土) 22:07:27.68:V32XRqjB はを見る前に書いた たまたま同じ発想になっただけ 浮動小数数に直すってのもある LSB側から数えて1になるビット位置を返す命令があるのでそれとシフトを使う 115200は(900, 7) 38400は(300, 7) 19200は(300, 6) 9600は(300, 5) RS-232Cだと300x2^nと900x2^nしか普通は使わないから オーディオのサンプリング周波数にも同じような方法が使える : デフォルトの名無しさん [sage] 2018/06/23(土) 22:09:33.77:5Wb6fwhK n = (x/9600 > 4) ? 0 : 3 - log2f(x/9600); 入力を検証する手間を考えたらテーブル逆引きと大差ないけど : デフォルトの名無しさん [sage] 2018/06/23(土) 22:19:10.79:V32XRqjB メモリアクセス速度を考えてもの方が速くて簡単 なんかおかしかった 115200は(225, 9) 38400は(75, 9) 19200は(75, 8) 9600は(75, 7) ビットスキャン命令とシフトとテーブル 変換しなきゃならないデータが多量にあって パフォーマンスが非常に重要ならこれを使うかな : デフォルトの名無しさん [sage] 2018/06/23(土) 22:21:03.20:V32XRqjB 普通はこんなものはリニア検索でいい : デフォルトの名無しさん [sage] 2018/06/23(土) 23:23:08.99:ZZklpiyn 普通、最適化でも、8個までは線形(全)探索・if 文 それ以上で、ジャンプテーブル・switch-case : デフォルトの名無しさん [sage] 2018/06/23(土) 23:47:49.24:UiVIxiJp ただのテーブル逆変換だぞ なんでジャンプテーブル? なんでswitch case? リニア検索で問題なら2分検索 それでも遅ければハッシュその他のテーブル 簡単な演算を併用出来るものはする じゃないか普通 : 927 [sage] 2018/06/24(日) 00:50:44.41:chBT6m1a コンパイラの最適化について書いた if 文を8個以上書くと、ジャンプテーブルに変換されるってこと : デフォルトの名無しさん [] 2018/06/24(日) 08:15:02.59:cbD8du/l ありがとうございました。 : デフォルトの名無しさん [] 2018/06/24(日) 10:44:32.50:8StK2ZXu class clsAにconst member 変数を登録したいのだけどうまくいかない。 クラスコンストラクタでconst char *mes[] を{"abc","def"}のように 初期化するにはどうやるの? : デフォルトの名無しさん [] 2018/06/24(日) 10:57:11.49:8StK2ZXu //そもそもC++は文字列の配列を扱うことができるのか? constexpr auto str1 = {"abc", "def"}; これがエラーするんだがなんでなの? : デフォルトの名無しさん [] 2018/06/24(日) 11:00:18.70:8StK2ZXu constexpr string[] str1 = {"abc", "def"}; コンパイルエラー constexpr string str1[] = {"abc", "def"}; コンパイルエラー クッ、、、どうしてもうごかない。 : デフォルトの名無しさん [] 2018/06/24(日) 11:15:54.16:8StK2ZXu string str1 = "abc"; //OK vector<int> dat(100,3); //ok vector<string> str2("aaa",4); //error こういうのもうごかない。 : デフォルトの名無しさん [] 2018/06/24(日) 11:23:27.77:8StK2ZXu 自分としてはストリングを多用するのでストリング配列が使えないと厳しい。 検索をしても例がなかなか出てこないので、Effectiv Modern C++という本 をamazonで買ってみたんだが、届いたので今見ているところだが、ここでも string配列の記述を巧みに避けている。皆目出てこない。 string配列の扱い方ってどうやるの? : デフォルトの名無しさん [sage] 2018/06/24(日) 11:52:20.14:/GbiIoLW 文字配列って良く分からないけど、Javaみたいに一文字だったりして? {"a","b","c","d","e","f","g"}みたいな? : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/24(日) 12:32:00.67:StWe8jKY 定数式じゃないから。 string は constexpr に非対応のはず。 現時点では。 new が constexpr 的に扱いが難しいので、 内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。 ただ、制限を緩和する提案は出ているので将来的にはなんとかなるかもしれない。 string に一文字づつ入れたいってこと? std::vector<std::string> str2 = {"a", "a", "a"}; でいけるよ。 : デフォルトの名無しさん [sage] 2018/06/24(日) 12:35:35.92:QFRKHUIu ["abc","def"]; : デフォルトの名無しさん [sage] 2018/06/24(日) 12:36:44.62:p8F2e5jx >vector<string> str2("aaa",4); //error 「vector<string> str2(4,"aaa");」の誤りじゃね? : デフォルトの名無しさん [] 2018/06/24(日) 13:13:44.88:8StK2ZXu string str1 = "abc"; //OK vector<int> dat(100,3); //ok //vector<string> str2("aaa",4); //error // string str1[] = {"abc", "def"}; //error // const std::vector<std::string> str3 = {"abc", "def"}; //error // constexpr char *mes1 = "abc"; //error const char *mes1 = "abc"; //ok // vector<char *> ch(10,mes1);//error vector<string> ch(10,str1);//ok ここまで確認できた。ただしコンパイルが通っただけだから、動くかどうかは不明。 : デフォルトの名無しさん [] 2018/06/24(日) 13:37:02.58:8StK2ZXu //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: const char *m_name[]; } //clsA::clsA(char *name[]) : m_name(["mike","tetu"]){};//だめ //clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ //clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ : デフォルトの名無しさん [sage] 2018/06/24(日) 13:38:12.37:zWtoG2OO サイズ不明だし無理だろ : デフォルトの名無しさん [] 2018/06/24(日) 13:41:38.91:8StK2ZXu >内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。 constexpr char *mes1 = "abc"; //error これもだめですね。ヒープは必要ないとおもいますが、、、 : デフォルトの名無しさん [] 2018/06/24(日) 13:42:37.94:8StK2ZXu >>サイズ不明だし無理だろ コンストラクトする時点でサイズは確定していますが、、、 : デフォルトの名無しさん [sage] 2018/06/24(日) 13:45:06.66:p8F2e5jx お前はまずエラーメッセージをちゃんと読め。 : デフォルトの名無しさん [] 2018/06/24(日) 14:12:06.73:8StK2ZXu //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: const char *m_name[]; clsA(char *name[]); }; //clsA::clsA(char *name[]) : m_name(["Bike","tetu"]){}; /*だめだが可能性がありそう。 Invalidはでていない。 --error message-- #29 expected an expression */ //clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ invalid /* Multiple markers at this line - #2125 invalid initializer for array member "clsA::m_name" - #18 expected a ")" */ //clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ /* * Multiple markers at this line 以下省略 */ : デフォルトの名無しさん [sage] 2018/06/24(日) 14:20:47.48:p8F2e5jx すまん、そっちはエラーメッセージじゃ分からん。 string str1[] = {"abc", "def"}; //error とか constexpr char *mes1 = "abc"; //error とかの話。 : デフォルトの名無しさん [sage] 2018/06/24(日) 14:38:12.08:iIKq/Q4Y string関数の第二引数には何の意味がありますか? 試しに文字列を2つ引数に入れても、第一引数しか出力しないみたいですが ↓です string readFile(const char *filename) { ifstream ifs(filename); return string(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>()); } ttps://www.miraclelinux.com/tech-blog/1n4hgx : デフォルトの名無しさん [] 2018/06/24(日) 14:46:22.41:iIKq/Q4Y すみません自己解決しました : デフォルトの名無しさん [] 2018/06/24(日) 14:58:47.68:8StK2ZXu string str2[] = {"abc", "def"}; //okでした。 constexpr 文字列は諦めました。多分相当難しい。 でおもうのだが、結局は普通の人は誰もconst char *配列の初期化について解らない。 というか、ファーム開発にC++を使う場合には文字列の配列はかなり重要でしかも Ramが少ないのでこれをRom配置できないと致命的だ。ということでファーム開発 ではconst char *mes[] = {"zzz","aaa"}; こういう処理が必要になる。 しかしファーム開発をやらない人にとってはconstである理由はないので、この重要さ には無関心なのだろう。 もちろん分かる人もいるが教えるのは恐ろしくめんどくさいか、非常に苦労して マスターしたので簡単には教えたくない。 それほどC++において const char *配列 のクラスでの初期化は難しいのだろうと思う。 いやそもそもできないのかもしれないが、、、(そんなはずはないだろう)。しかし できないとすると、クラス内で初期化するのは諦めてCで初期化してるのだろうか? 多くのファーム開発者は諦めてCで初期化してるのだろうな。 : デフォルトの名無しさん [] 2018/06/24(日) 15:43:14.02:zWtoG2OO 配列の初期化の時には()いらないぞ{}だけ の最後の行の()はずせば通るけどたぶん環境依存じゃないかな 意図してる動作がname使ってm_nameの初期化ならめんどくさそう : デフォルトの名無しさん [] 2018/06/24(日) 16:11:08.57:zWtoG2OO あれコンパイル通るけど未指定だと動的確保してplacement newでもしないとだめかなこれ : デフォルトの名無しさん [] 2018/06/24(日) 16:11:30.09:8StK2ZXu class clsA { private: const char *m_name; clsA(); }; clsA::clsA() : m_name("Bike"){}; これはOK、しかし配列はできない。 : sage [] 2018/06/24(日) 16:24:15.11:zWtoG2OO class a { public: const char* name[]; ここで非標準だなんだの警告でる a():name{ "aaa","bbb" } { } }; vsだとこれでコンパイルは通るしぱっと見正常だけどそのまま使うとたぶんどっかでメモリ壊すんじゃないかな 配列の数指定しといたほうが無難な気がするけど : デフォルトの名無しさん [sage] 2018/06/24(日) 16:39:11.76:Q9QWMZ9P C++にはサイズ不定の配列は無いからサイズ指定しないと無理だよ コンストラクト時にわかってるじゃないか、って話もあったけど 中身の配列数が変わったらそれは違う型になる つまりテンプレートが必要になる 配列の要素数を推定させるのは、C++17で入ったクラステンプレートの引数推定を使えば一応出来るけど : デフォルトの名無しさん [] 2018/06/24(日) 17:24:18.36:8StK2ZXu //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: const char *m_name[2]; clsA():m_name{"aaa","bbbb"}{} }; これでもエラーします。 : デフォルトの名無しさん [sage] 2018/06/24(日) 17:42:22.01:zWtoG2OO なんてエラーでてるの : デフォルトの名無しさん [] 2018/06/24(日) 17:54:03.23:8StK2ZXu //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: char *m_name[10]; clsA(); void init(); }; clsA::clsA() : m_name{"Bike","bbb"}{}; //エラーする。 /* Multiple markers at this line - #66 expected a ";" - #171 expected a declaration - #126 expected a "(" - #176-D expression has no effect */ : デフォルトの名無しさん [] 2018/06/24(日) 18:01:33.16:8StK2ZXu それconst つけるの忘れてたが、つけた場合もエラー表示は同じだね。 : デフォルトの名無しさん [sage] 2018/06/24(日) 18:04:27.08:p8F2e5jx あなたの使っているコンパイラは、おそらくC++11未対応です。 constexprはC++11の機能なので、そのコンバイラでは使えないか、 使えたとしても標準とは異なる動作をする可能性があります。 : デフォルトの名無しさん [] 2018/06/24(日) 18:18:27.13:8StK2ZXu あっ、そうなの? ごめん、それはうっかりしていた。今年の2月にインストール した最近のコンパイラなので当然C++11以上だとおもっていた。 一寸調べてみる。 : はちみつ餃子 ◆8X2XSCHEME [sage] 2018/06/24(日) 18:23:43.69:StWe8jKY 対応していてもデフォルトでは C++11 の挙動にならない (オプション指定すると対応する) ようなものも有りうる。 : デフォルトの名無しさん [] 2018/06/24(日) 18:36:49.63:8StK2ZXu おお、ありがとう。全然気が付かなかった。これは一つ前のバージョンでプロパティを みてもC11++がない。 最新のバージョンはC++14をサポートしてるみたいなのでUPDATEしてみる。 : デフォルトの名無しさん [sage] 2018/06/24(日) 19:43:42.27:G0tizpK6 勘違いしてたらすまないけど↓みたいな事がしたいの? ttps://ideone.com/Zm8LO5 : デフォルトの名無しさん [] 2018/06/24(日) 22:24:29.32:8StK2ZXu 凄い!!。まさにそれです。こちらでもコンパイル通りました。 難しいなー。 もうコンストラクタでの初期化はすっかり諦めて代替案を作っていたところだけ ど、それを丁重に拝借いたします。ありがとう。 : デフォルトの名無しさん [sage] 2018/06/24(日) 22:30:41.96:EmcxYm71 借りるってことは返すんだよね : デフォルトの名無しさん [] 2018/06/24(日) 23:08:30.10:8StK2ZXu もらい受けたいところだけども、意味が理解できるかどうか? あなたは意味が わかりますか? clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {}; (const char* const []){"mike","tetu",nullptr} これは何を意味してるの? : デフォルトの名無しさん [sage] 2018/06/24(日) 23:09:16.86:chBT6m1a 「c++ constexpr 文字列」で検索すれば? : デフォルトの名無しさん [sage] 2018/06/25(月) 00:15:08.68:RQXh1ivn void func1(int a) { printf("%d\n", a); } void func2(int a, int b) { printf("%d,%d\n", a, b);} template<?????> class Test { public: void method(void) { (templateの引数で func1(int a) か func2(int a, in b)を呼ぶ) } private: int a; in b; }; のような事をしたいのですが、引数が1つか2つの関数をそれぞれ名前でtemplate引数にして 記述したいのですが、うまくいきません。どうすれば良いでしょうか? 例えば template < void F(int)> とすると Test<func1>() でいけるのですが、func2の場合が 表現出来ません。 : デフォルトの名無しさん [] 2018/06/25(月) 01:49:02.18:Gwlgg6/B class class1 { private: int m_a; public: class1(int a) : m_a(a) {} class1(class1 const& rhs) { m_a = rhs.m_a; } void method(void) { printf("%d\n", m_a); } }; class class2 { private: int m_a; int m_b; public: class2(int a, int b) : m_a(a), m_b(b) {} class2(class2 const& rhs) { m_a = rhs.m_a; m_b = rhs.m_b; } void method(void) { printf("%d,%d\n", m_a, m_b); } }; template<class _Myclass> class Test { private: _Myclass m_myClass; public: Test(_Myclass myClass) : m_myClass(myClass) {} void method(void) { m_myClass.method(); } }; int main() { Test<class1> x(class1(1)); Test<class2> y(class2(2, 3)); x.method(); y.method(); } 意味があるのか分からないがとりあえずコレで もしくはTest::methodを可変引数にしてprintfにその可変引数を渡すしかない まずなにがやりたいのか分からないからテキトーに書いてやったぞ : デフォルトの名無しさん [] 2018/06/25(月) 03:37:15.06:3f3crQyZ const char *[]の初期化だけれども clsA(const char* const name[]) : m_name(name) {}; これはまあ何となく意味が解る。m_name <−−nameってことだよね。 clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {}; しかしこれはどういう意味だろうか? clsA <−− (const char* const []){"mike","tetu",nullptr} ラムダ関数?かとおもったが、前半はcastだろうか? m_name <−−name clsA <−− {"mike","tetu",nullptr} この二つがセットで意味を持つんだろうな。 const char *[] の初期化が3つくらいあったらどうするんだろうね。 まるでクイズを解いてるみたいだよ。 いくらなんでも言語仕様としてやはり不味いよね。 : デフォルトの名無しさん [] 2018/06/25(月) 04:00:03.54:3f3crQyZ わかった。コンストラクタに引数がないディフォールトでは clsA <−− {"mike","tetu",nullptr} そしてm_nameは一つしかないから、m_name= {"mike","tetu",nullptr}となる。 引数を持つ場合は clsA(const char* const name[]) : m_name(name) {}; m_name <-- name; になる。 じゃあconstのメンバ変数が二つある場合はどうするんだろうか? clsA:clsA( {"xxx"}),clsA({"yyy"}) {} とは書けない。変数を明示しないといけないから、、、 clsA:m_name1( {"xxx","abc"}), m_name2({"yyy","def"}){} 必然的にとなる。 じゃあ最初から clsA:m_name1( {"xxx","abc"}){} こう書いていた方が分かりやすいし、これが成り立たないと論理破綻する。 : デフォルトの名無しさん [] 2018/06/25(月) 04:04:26.64:3f3crQyZ class clsA{ private: const char* const* m_name1; const char* const* m_name2; public: clsA() : m_name1((const char* const []){"mike","tetu",nullptr}), m_name2((const char* const []){"mike2","tetu2",nullptr}) {}; clsA(const char* const name[]) : m_name1(name) {}; void put(){ for(const char* const * p=m_name1; *p!=nullptr ;++p ) { printf(*p); } }; virtual ~clsA() {}; }; 実験したみたが、コンパイルは通った。 : デフォルトの名無しさん [sage] 2018/06/25(月) 05:56:57.36:MAmRCfEQ のソースをclangでビルドしたら最初の結果が文字化けする。 環境依存で動作が変わるようなソースコードを参考にしてはいけない。
凡例:
レス番
100 (赤) → 2つ以上レスが付いている
100 (紫) → 1つ以上レスが付いている
名前
名無しさん (青) → sage のレス
名無しさん (緑) → age のレス
ID
ID:xxxxxxx (赤) → 発言が3つ以上のID
ID:xxxxxxx (青) → 発言が2つ以上のID
このページは2ch勢いランキング が作成したアーカイブです。削除についてはこちら 。