◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:【初心者歓迎】C/C++室 Ver.102【環境依存OK】 	->画像>1枚  
動画、画像抽出    || 
この掲示板へ   
類似スレ   
掲示板一覧  人気スレ  動画人気順 
 このスレへの固定リンク: http://5chb.net/r/tech/1509780815/ ヒント: http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
 エスケープシーケンスやWin32APIなどの環境依存なものもOK 
 そのような質問は必ず環境を書きましょう 
 半角空白やタブでのインデントはスレに貼ると無くなります   
 コードを貼れる所  
http://codepad.org/   https://ideone.com/     前スレ 
 【初心者歓迎】C/C++室 Ver.101【環境依存OK】  
http://2chb.net/r/tech/1500329247/   unsigned long strtoulxn( char const* psz, size_t n )  
 実行速度 
 >>5   まあそう言うごたくを言うのは一つぐらいは満たしたコードを書いてからでないとね 
  >>3  の関数は前のスレッドの終わりに出た 
 "12 34 56"(NUL終端なし8byte) を数値の 123456 に変換、 
 てお題の答案かな。   
 …と思ったけど、NUL終端文字列が仮定されてるね。 
 どういう流れで投稿されたんだろう? 
  size_t n で文字数を受けとるからNUL終端である必要は無いのでは 
 if (strncmp(psz, "12 34 56", 8) == 0) return 123456; 
 相変わらず片山はクソコードしか書かないな 
 >>9  は質問者に対する皮肉のつもりだったんだけど 
  意図的に糞コードを書いた事もわからないクソがいるとは 
 初心者歓迎をうたうスレッドで「意図的に『糞コード』を書いた」などと 
 しかも後付けで言われてもあんまり支持できないなぁ。 
 せめて最初から「お前らこれ改善してみろよ」とかで出してくれ。 
 「糞コード」とけなすだけで、具体的な問題点の指摘がないってのも寂しいわ。    
>>3  のソース、引数のpszが""でも、nが0でも妥当な返り値 0 が返るけど、 
 実は最初に見たとき n==0 で呼ばれた場合に即時終了しないと騙されたわ。 
 後置デクリメント評価値、ね。 
 出だしから勢いのいいうんこだな 
 psz = "", n = 0 はいいけど 
 >>3     ●パフォーマンス 
 *pszが3回も出てくる 
 代入して持っておいた方が 
 チープなコンパイラでは速度が変わる   
 isdigit 
 どうせ数字が連続してる前提のコードなんだから 
 関数を呼ばずに'0' '9'と比較しちゃおう 
 そうのが速い 
 関数コールは一般的に遅い   
 ●見やすさ 
 forループにいくつも入れない 
 while (n--) か for (size_t i= 0; i < n ; i++) 
 null文字はbreakで   
 ●仕様 
 null文字とサイズ、両方で停止は仕様としては問題ない 
 パフォーマンス最優先であればそれぞれの特別版を作ればいい 
 文字数もスペースの位置も固定で 
 パフォーマンス最優先なら 
 ループアンロールするのが一番 
  >>18   > null文字とサイズ、両方で停止は仕様としては問題ない 
 だからダメだっつーの 
 知ったかは黙ってろよ 
 最低限サイズチェックを先にやらないとダメ 
  仕様として「両方で停止は問題ない」よな? 
 先に大きさでチェックしてから 内容の nul チェックする 
 int str2i( const char *s, size_t n )  
 片山以外に文字化けするブラウザ使ってる奴いるのか 
 PC(プロセスコントローラー)のプログラマーですが何か? 
 isdigitが関数コールな処理系ってあるのか? 
 isdigitは、ロケールの関係で遅くなる可能性があるはず。256バイトの配列を使うのが最速だ。 
 ちょっとした演算よりメモリアクセスの方が遅いこともあるよ。 
 int str2i( const char *s, size_t n )  
 >>34   ああ、素人はgoto嫌うよな    
>>35   もちろん必要は無い 
 テーブルよりは色々な面でマシってだけ 
 普通に if ( '0' <= c && c <= '9' ) で良い 
 一目で意味がわかるし高速 
  >>37   とおもってアセンブリ吐かせてみたら、すごかった。 
 48引いた上で、符号なしで10未満か判定してるので、 
 余分な条件分岐してなかった。 
  >>37   && では分岐しなかった。 
 '0' <= c && c <= '9'  を clang で -O3 付きでコンパイルしてみたらこうなった。   
 addl $-48, %eax 
 cmpl $10, %eax 
 setb %al   
 賢いな! 
 直後に分岐するなら結果をレジスタに書き込む必要はないから実質的に二命令だ。 
  俺の知識も時代遅れになったな。シンプル伊豆ベスト。 
 もっと 
>>40  を高速化できないかと思って考えてみたが、 
 '0' を引くんじゃなくて 0x30 と xor を取ってから 10 より小さいか比較するっていうのでもいける。   
 ただ、最近はビット演算が算術命令より速いとも限らないみたいなんだよね〜 
 >>42-43   Z80 ですら足し算と XOR は 1 クロックだったわ。 スマソ 
  >>21   > 仕様として「両方で停止は問題ない」よな? 
 相談者でないとわからん 
 途中に'\0'があるケースについては書いてないから   
 > そもそも相談者の仕様がおかしい 
 それはお前が決める話じゃない 
  >>22   > ショートサーキット前提の記述をよしとするかどうかはわからん 
 if(p != 0 && *p != '\0') 
 みたいなのは普通に書かない? 
  >>47   俺は書くけど それを"普通"とまで言い切ってしまって良いという自信はない 
  >>46   わからないならだまってれば 
 正確な要求仕様がわからない事くらい誰でもわかる   
 両方でとまる関数は片方で止まる関数の機能を含むので 
 問題になる場面は普通は考えられない 
 質問に書いてない、文字列の途中にNULL文字とか 
 いうアホな事を心配しない限り 
  >>49   こういう思い込みの激しい奴が要らんバグを作り込むんだよな... 
  isdigit関連で性能測ってみた。 
 あ、ごめん、rand() 呼ぶ分、数字 < 英字 < 英数字の順で遅くなるの、当然だった。 
 最速なら前スレの
>>995 や
>>997     >>997 は演算の依存性が高いので  
>>995 の方が少し速いかな? 
 まあコンパイラや環境依存でしょう   
 x64前提なら、 
 64bit一気に持ってきて偶数奇数桁に分けて、 
 LEAで5倍してシフトして足すとか 
 AVXで乗算してから水平演算とか 
 色々と考えられるけど 
 まあ一応このスレのC言語の範囲で 
 このスレの結論はこれか。 
 前スレの
>>997 が質問者だから 
 フォーマットは固定と思われる 
 さすがに '0' * 111111 をコンパイル時に計算しないコンパイラは無いと思うので 
 ( ) を色々とかえて時間を測ってみたけどほとんど同じ 
 VPMOVZXBD xmm0, a 
 微妙に間違った 
 >>29 でメモリアクセスに言及されてる話の流れの中で 
 10億回ループがいちいちキャッシュクリアされてるのかが気になる 
  普通はキャッシュに入ったままだが、 
 std::vector<std::string>からchar*const[]を作成するいい方法ってないですか。 
 >>65   vector<char*> に各要素 s の &s[0] を入れて済むなら new は要らなさそう。 
  >>66   まあどうみても内部でnewしてるんだろうけど 
  >>68   クラスは構造体に関数を追加したようなもの。 
 クラス内部の関数はメソッドと呼ばれる。 
 メソッドからは、クラスのデータとメソッドを参照できる。 
 データとメソッドのそれぞれの項目をクラスのメンバーと呼ぶ。 
 クラスの実体はインスタンスと呼ばれる。メソッドからは、thisポインターにより、クラスのインスタンスを参照できる。 
 メンバーは、public:、protected:、private:によってアクセスを制御できる。アクセスできないメンバーを参照するとコンパイルエラーになる。 
  class A 
 クラスはコンストラクタと呼ばれる特殊なメソッドがあり、インスタンスの構築に使われる。 
 コンストラクタの例。 
 別のコンストラクタの例。 
 そんなの説明してやらなくてもネット上に無数の解説があるだろ。 
 >>75   情報が多過ぎて迷子になってるんじゃないか。マニュアル読め、規格票読め、で終わればいいのだが。 
  そう思うならなぜ現在地を聞く前に世界地図を渡すのか 
 >クラスは構造体に関数を追加したようなもの 
 >>78   その理解で8割がたOKだと思うのだが、何が問題なの? 
  >>76   チュートリアルだってたくさんあるじゃん。 
  >>79   クラスがわからんやつにこんな説明しても通じないだろ 
  山田さんってどんな人?と聞かれて 
 純粋にC++のクラスそれ自体の概念というなら 
 実のところはOOPを知らないからクラスをどう使えばいいのかわからない/ 
 下手にクラスを説明するやつが多いせいで、コーディング経験なくても理解できる概念的なものだと思われちゃう 
 アニマルクラスがわんにゃー鳴くのがオブジェクト指向です 
 メンバ関数を呼び出す際の 
 >>88   そういうのをベタで実現しているOO言語はないかな… 
  >>90   あれも結局、関数(メソッド)の動的なコールをそう呼ばせてるだけ 
 同じSmalltalkでもSmalltalk-72までさかのぼるとメッセージ送信と呼べなくもない仕組みにはなっているけど 
 それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと   
 まあ、ともあれC++の「オブジェクト指向」を説明するときには「メッセージを送る」とかはすっかり忘れていいよ 
 そもそもC++の設計者の提唱するオブジェクト指向は「抽象データ型(端的にはユーザー定義の型)」を 
 Simulaという言語から拝借した「クラス」という言語機能で実現することが主軸のアイデアなので  
http://www.stroustrup.com/whatis.pdf    言語の意味論とそれを実現するメカニズムは別物だから、 
 メソッド呼び出しってメッセージパッシング感すげー出てない? 
 >それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと 
 >>95   C++のポリモーフィックなメソッドは動的ディスパッチだろう 
  >>91   >抽象データ型 
 これがすべてなのに、どうしてメッセージ駆動の話が今でももちきりなのだろうか? 
  >>96   C++に「動的なものは何もない」という主張ではなく 
 「静的に決まる何かが一つでもある」時点でそれをメッセージングに例えるのは興醒めという意味   
 少なくともケイは彼のOOPにおけるメッセージングを「遅延結合の徹底」の目的で提案している  
http://d.hatena.ne.jp/katzchang/touch/20080807/p2   「私が考えるOOPはメッセージング、状態処理のローカルでの保有・保護・隠蔽、 
 そして全ての物に対する強力な遅延束縛、これだけだ。 
 これはSmalltalkとLISPだけが実現できている。他のシステムでも可能かもしれないが、私は知らない。」   
 つまるところ、これはすなわち、SmalltalkやLispみたいな変態言語でもなければ、 
 (あるいはアクター機構のように、並列化を意識して本当にメッセージを送るのでもなければ) 
 無理して「メッセージパッシング」なんてたとえる必要は無いんやで、という話でしかない 
  Cのキャストについて教えてください 
 >a*100、b*100のどちらもlong型になる 
 ありがとうございます。 
 よろしかったら教えてください  
 スーパー初心者か? 
 片山先生、ありがとうございました! 
 わかってる人にとってはクソみたいな質問だけど、 
 なんかすみません 
 数学のイコールには比較(の結果等しい)の意味しかないだろう 
 プログラムを記述する際、等しいかを比較するより、代入のほうが頻度が高いから 
 Fortranだって代入は=だから、Cで採用されたのも仕方ない 
 力添えを頂きたい。 
 >>113   YES。 
 別プロセスからテキストを取りたい。 
 他の例えばIEやハンドルが取れる様なソフト内の文字ならgettextやcom操作で取ったりできるがSun系のソフトは同じ様にはいかず、メモリを読むのかどうすればいいのか、知識が足りなくて検索も上手に出来ず...頭打ち状態。 
 何か足掛かりになる物を教えて頂きたい。 
  #include<stio.h> 
 boost::qiでマルチバイト文字を扱うにはどうすればいいんですかね 
 5人の生徒に3教科のテストをし、その点数を入力する  
 >>120   char_に替わるパーサー書けばいいんじゃないかね 
 マルチバイトの最初の文字を認識する自作パーサーをmb1、マルチバイト文字のパーサーをmbcharとして 
 mbchar = (mb1 >> char_) || char_; 
 とか? 
  >>121   宿題は自分で考えるのが原則。どこまで考えた? 
  >>123   ありがとうございます。 
 入力された点数を3次元配列に格納するところまでです。 
 今は、繰り返し分を使い、配列に格納された数字が0でなかったら 
 その数字をカウントして人数を集計しようとしてるのですが、できていません 
  >>124   なぜ3次元?生徒と教科がインデックスだから2次元では? 
 あと、表示さえすればいいだけなら、 
 効率度外視である教科のある得点範囲の人数をカウントするくらいできるでしょ。 
 効率考えるなら表示用に0で初期化した2次元配列を別に用意する。 
  >>125   ありがとうございます。2次元です。 
 ten[5][3]で得点を格納したあとが進まないのです 
 得点範囲の人数のカウントについてもう少し考えてみます 
  中古本でプログラミング言語c++の3版が4000円で4版が6000円なんだが 
 >>128   そうなのか・・・聞いておいてよかった 
 ありがとう 
  >>125   昨日はありがとうございました 
 90行程度と長いプログラムになりましたが 
 人数をカウントし表示させることができました   
 カウントは、教科毎にfor文で呼び出し 
 20以下、20〜39、・・・80〜99、100とif文で条件指定し 
 各範囲で人数をカウントし、最後に表示させました   
 また分からないことがありましたらご指導お願いいたします。 
  ファイルを開いた回数を記録するというプログラムを作っています 
 >>132   さっそくありがとうございます。fscanf(fp,"%d",&count)と訂正しました。 
 初歩的なミスで申し訳ありませんでした、そしてありがとうございました。 
  >>131   >     fscanf(fp,"log.txt",&count); 
 二番目の引数を再確認してみ 
  >>134   ありがとうございました。 
 おかげさまで正常にカウントされるよになりました。 
 確認不足でご迷惑おかけしました。ありがとうございます。 
  超初心者です 
 >>136   >if float GetPixel(float 変数x, float 変数y == RGBCOLOR( 0, 0,255)) ; //指定座標のピクセルが青色ならコード実行   
 if (GetPixel(x, y) == RGBCOLOR( 0, 0,255)) { 
 条件が真のとき実行するコード 
 } 
 ではどうですか? 
  boost::qiって読み方ブースト・チーでいいの? 
 組み込みの場合例えばRs232Cのチャンネルが三つあるようなばあいにクラスに 
 よろしくお願いします。 
 >>142   fscanf() を二箇所に書いているけれども、それでいいのですか? 
  >>142   whileでのfscanfのあとでiを変更してないから次のfscanfで同じda2[i]に上書きしてる 
  >>144 、
>>145   そういう事だったのですね 
 ありがとうございました! 
  再びよろしくお願いいたします。 
 再びよろしくお願いいたします。 
 >>148   ありがとうございます 
 標準入力によって処理し、scanfを使わないということなのですね 
 文法を覚えて活用できるようにします 
 何度もありがとうございます 
  >>150   ありがとうございます 
 しっかり理解できるには時間がかかりますが 
 とりあえず、お礼申し上げます 
 改行文字を処理しないと次のscanfが改行文字を読んでしまうのですね 
 とても勉強になりますし、皆様のおかげで前進できます 
 ありがとうございます 
  皆すげーな 
 毎日すみません。ご教授お願いします。 
 >>153   c は大きさの十分ある char への配列と想定した前提で 
 fscanf の引数がおかしい   
 1文字毎に配列へ順繰りに読み込ますのなら 
  fscanf(fp,"%c", &c[i]); 
 こうなってないと 
  >>154   &が抜けていたのは恥ずかしいです 
 申し訳ありませんでした 
 しっかり覚えさせていただきます   
 プログラムもちゃんと動きました 
 いつも簡単なことばかりなのに理解が浅くてすみません 
 とても勉強になりました。ありがとうございました 
  書いてあることが違うけど(&が抜けていたのではなく [i] がない) 
 >>156   はい、ありがとうございます。 
 配列にして直してあります。 
 fscanf(fp,"%s",c)として読み込んだ後に 
 c[i]で一文字一文字表示させられると思い込んでいました   
 先ほどの156のおかげでfscanf(**** &c[i])を覚えられました 
 ありがとうございます!感謝してます 
  こんにちは。どうか本日もよろしくお願いいたします。 
 >>158     #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; 
 } 
  すみません、ここは質問するところじゃなかったのですね 
 #pragma pack(1) 
 ありがとうございます。やっぱりないですか。 
 #include <pshpack1.h> 
 C/C++は言語自体は好きなんですが、GUIとかがプラットフォームに依存するみたいですが、そういった場合黙ってqt使うのが最善ですか? 
 >>164   そのような構造体で直接読み書きしないのがベスト 
  ここが適切かわかりませんが、 
 makeにはないが、似たようなものにCMakeというものがあって、CMakeならプロジェクトファイルを生成できる。 
 >>169  そこまでは分ったのですが、 
 Makefile を CMakeLists.txt に変換するのはありますか?   
 見つけられたのは、nmake.exe 用の Makefile.mak を *.vsproj に変換する、 
 Python のスクリプトだけでした。。 
  >>171  ありがとうございました。 
 CMake 勉強します。 
  とりあえず 
 定数以外の名前に「 _ 」を使うのって良くないって聞いたけどどうなの? 
 趣味とか宗教とかの話であって、別に使って問題ない 
 その辺有名ライブラリのルール付けとか調べてみるのもいいかもね 
 GoogleがC++のスタイルガイド公開してる 
 C++で何つくんの? 
 個人的にC/C++は高級なアセンブラだと思っている 
 ゲームとか速度が必要な場面でまだまだ使われてるでしょ 
 CPUパワーを必要とするようなまとまった処理は 
 Pythonのライブラリも結局はCで作ってたりするしな。 
 GUIはC#でWPFだけど、そこから使用するdllとか連携するサービスとかはc++。OSのAPIをいろいろ使う場合はC#だと面倒くさいからc++を選ぶ。 
 Unityでも速度が必要な場所はC++で書いて呼び出し 
 >>198   <cstdio>は正しくC++だからprintf使っても構わん 味噌 よ 
 後々になって「iostreamはでかいし あんまりうみゃくいかないエビフリャー」いうことになった きしめん だしね 
 endlは、改行の無い出力と在る出力を統一的に(フォーマット使わずストリームで)扱うには必要でしょ ひつまぶし?   
 愛知語は詳しくないけど察し手羽先 
  どうやったらこんなつまんないレスを返せるんだよ... 
 言うな 自分でも検索履歴に「愛知 名物」って残ってるの見て 
 C++でしかできないもの作りたいだけど何かいいアイデアない? 
 >>206   エクセルのような操作性の、画像レイアウト印刷アプリなんてどう? 
  windowsとLinuxで動くクライアントアプリ開発してて、Linuxコンパイラは化石みたいなバージョンからgcc4.4をようやく使えるようになった 
 バイナリで配布するんだったらとりあえずシンボルをnmで取得して見比べてみるとか。 
 ユーザからクロスコンパイラ提供してもらってバイナリ配布っす 
 以下のコードをgccでコンパイルすると 
 >>213   戻り値がintになってる 
 戻り値の型を後置で書いてやればいいかな 
  function<int& (int&)> lambda = [] (int& i) -> int& { return ++i; }; 
  >>214   ありがとうございます。 
 戻り値の型を明示してあげないと値渡しになってしまうということですね。 
 勉強になりました。 
  typedef int myTypeA; 
 structを使う? 
 なるほど、、、確かにtypedefだと別名になるだけですね 
 オブジェクト指向では、型による分岐処理は無くなる。 
 などと訳のわからないこと(でもないが)を供述しており 
 C++じvtable参照することになるから遅いだろ 
 >>216   セットする値の名称にする 
 例えば三角形を表すオブジェクトで底辺と高さをセットするのであれば、base()とheight()になる 
 プロパティとして使うのだから、setXXX()みたいに書かなくてもいい   
 setter単独で存在することはありえないからgetterも設けること 
 setterって余り必要ない 
 コンストラクタからの初期化で十分の場合が多い 
  2の累乗でないときのmod演算の高速化の方法、何かありませんか? 
 >>225   法を2進数にしたときほとんど1かほとんど0なら手間の少ない方法はある。 
 法が固定で何度も剰余を取るならモンゴメリリダクションがある。 
 どちらも乗算はそれなりに必要。 
  ユニークポインターにキャラの可変配列をヒープからとってリセットしたはいいけど、デリーターって簡単に実装/定義できる?例が欲しい。 
 mutex g_Mtx;  
 mutex g_Mtx;   
 事情があって下記の型の関数を、 
 スタックに積むサイズは通常int 
 >>233   C11の6.3.2.3の8によると、the behavior is undefinedだ。 
 たとえばcharが4バイトに自動昇格して、ポインタが8バイトだったりすると、 
 どうなるかわかったもんじゃない。鼻からなんちゃらだ。 
 C++は知らん。 
  sizeof(int) != sizeof(int*)の場合(例えばx64)、どうなるかな? 
 そうそう、undefinedのあとはほんとに何が起きるかわからんよ。 
 「事情があって」の事情を解消する方が安全だと思うけど…。 
 >>233   関数ポインタ同士は互換で、お互いにキャストすることは許される。 
 が、呼ぶときは元の型にキャストしなおしてからじゃないとあかん。 
  C++で窓出してプログラム組みたい時ってどういう風にするもんなんでしょうか 
 >>240   基本的には win32api を使うことになり、私は C++ からwin32api( ::DefWindowProc() とか)を個別呼び出している 
 気の利いたライブラリのことはよく知らない 
  やっぱりそういう感じになるんですね 
 >>240   Windowsに特化するなら Win32APIのほかにMFCやWTLや.NET framework(C++/CLIで良ければ)などのライブラリを使う 
 サードパーティならC++ BuilderのVCLとかあとはクロスプラットホームのQtとかGtk+とかwxWidgetsとか他にもあると思うけど 
 最近はデスクトップアプリが落ち目なのでこれという定番はなくて目的に応じて分散しているのでは? 
 自力で情報が集められない程度ならC++でGUIなんて止めとけという気がしないでもない 
  vs2010以降ならWIN32SDKベースでも雛型吐いてくれるだろうに 
 >>240   ボタンの配置などは、リソースエディタでダイアログテンプレートを作ってDialogBox関数を呼べば、細かい調整ができる。 
 イベント駆動やメッセージ送信などについては、<windowsx.h>で提供されるメッセージクラッカーやマクロを使えば便利になる。 
 私が複雑なことをする場合は、MZC4という自作のクラスライブラリを使ってる。 
  HANDLE_MSGマクロによるメッセージクラッカーという仕組みを使えば、ウィンドウプロシージャやダイアログプロシージャの記述が楽になる。 
 WinRT が綺麗にまとまってると思う。 
 https://github.com/Microsoft/cppwinrt   Windows API を現代的な C++ に合わせて整理したものなので、 
 C++ 的にある程度まともな感じがする。   
 昔は仕方がなかったんだろうけど、 
 今にしてみればメッセージクラッカーっていかにもクソダサい方法だよな〜。 
 Win32APIスレは限定的だからGUI一般スレみたいなのの方を紹介しようと思ったが面倒なので 
 何度も呼ばれる関数内ではローカル変数をstaticにした方が速いのですか? 
 >>254   誤差だ、 
 プログラミングスタイルを曲げてまですることではない 
  皆様はプログラムを遅くし過ぎない為に気をつけている事などありますか? 
 staticの方が速い理由なんて一つも無いような 
 >>258   多分、メモリを毎回確保し直す事や、コンストラクタを何度も呼ぶ事により処理が遅くなると考えたのではないでしょうか 
  >>257   実行速度は推測ではなく測定することが鉄則だから 
 出来ることは気になったときに正しく測定出来るようにすることくらいだ 
  >>257   ファイルアクセスのような重い処理とか深いループの中の計算処理とかは必要に応じて適切なデータ構造やアルゴリズムをあらかじめ検討しておくけど、頻度が少なく問題にならない箇所は分かりやすさ実装しやすさ優先で無理に速度は追求しないかな。 
 あとは将来的に性能改善が必要になることもあり得るから基本的には柔軟性のある変更に強い設計を普段から意識しておくとか。 
  計算量とかメモリ使用量のオーダーは気にするけど、オーダーが変わらないレベルの差はそんなに気にしてもしょうがない。 
 待て待て、
>>257 は速度追求の話ではないだろう 
 無駄なループを通らせないとかそういう話でしょ? 
 エッジケースで極端なことになってしまうって話かな? 
 >>257   とりあえず注意すべきは線形探索かな 
 何も考えずに使われると素敵なことになる 
  クラスAのメンバ関数へのアクセスをクラスBのみに許すにはどうすればいいですか? 
 自己解決 
 できる人にとってはくだらないことなんだと思うのですが、 
 char * c; 
 >>270   >>271   ありがとうございます 
 どちらが正しいのか、機能が違うのか、よくわかっていなかったのがスッキリしました 
  >>270   前者だと 
 char* a, b; 
 って書いたとaとbの型が変わっちゃうから常に後者方式で 
 char *a, *b; 
 みたく書くことをオススメする 
  ワイはアスタリスクを型名の方に寄せて、複数の変数の宣言をまとめないスタイルを推しておるやぞ。 
 C++ なら std::add_pointer を使うのも手やぞ。 
 ワイも後ろに寄せるスタイルの方が好きやな 
 この話始まるとスレが荒れるわけだが。 
 C++ だとスッポスッポ先生が (というより D&E の文中にあるコードが) アスタリスクを型名にくっつけるスタイルで書いてあるから、 
 そもそもCならまだわかるがC++になってもこの謎仕様が改善されてないのがおかしいわな 
 char *a;派だがキャストは(char*)だな 
 >>274   それな 
 前者は誰が流行らしたんだハゲか 
  変数との間に空白を入れるか入れないか選択の余地がある 
 あと数字の後ろにも置けるよな確か 
 >>293   宣言の中の型としての*の位置を問題にしてるのだから、式の中での*が使える位置については別の話でしょ。 
  インデントってタブ文字使うよりもスペース使った方がいいんですか? 
 >>297   見た目とコンパイル速度のどちらを優先するかによる。 
  タブコードはエディタの設定に見た目が左右されるので使わない方がいい 
 エディタの機能向上による要素が大きいな。 
 >>294   他にも変な仕組みは色々とあるけど、これはひとつとして使いどころが思いつかんよな。 
  int a[10]; で a[5] でも 5[a] でも同じようにアクセスできるのは、 
 i++ と ++iって最適化すればほとんど変わらないか、あるいは++iの方がちょっと速いくらいですよね? 
 >>307   インクリメントの対象が整数しかなかった C からの習慣がなんとなく引き継がれてるだけ。 
 後インクリメントは気持ち悪いと考える人は少なくはないし、 
 値を使わないなら前インクリメントにするのは C++ では良い習慣だよ。 
  >>308   なるほど、最初はちゃんと意味があったんですね 
 納得できました 
 ありがとうございます 
  Cでインクリメントやデクリメントに後置が使われがちな理由は 
 GCC 6.4.0 最適化なしで計測してみたけど、平均的な差は無いな 
 単純な整数型のインクリメントなら前置も後置もさが無いだろうけど、C++ではユーザー定義のクラスでインクリメントを実装できるから、 
 結果が使われないことが明らかな場合には後インクリメントのかわりに前インクリメントを呼び出すとかいったことをしても 
 まぁ、出来るなら既にやってるでしょ 
 そもそも速度を気にして 
 機能に対して糞重いソフトが多いのも 
 >>318   速度を気にするというのもあるけど、意味的にも無意味な処理をするってのがダサいだろ? 
  >>321   お前のコードは無駄ばかり 
 コンパイラも無駄命令を吐く 
 そもそもCPUの動作自体が無駄ばかり 
 そのプログラムを作るのも無駄だったり   
 お前の存在は? 
  手間が変わらず、かつデメリットもないのにその選択肢を取らない理由がなくない? 
 効率を言い出すと値を返さないインクリメント、デクリメントが標準で欲しくなる 
 ホントは最適化でだいぶん上手いことやってくれるんやけどな。 
 イテレータの++や―に戻り値があること自体設計ミス 
 アセンブラの inc やdec 命令実行時のフラグ反映は不要? 
 >>329   逆じゃないかなぁ。 
 ポインタをイテレータとしても使えるように一貫性を持たせたら結果的にそうなったって感じじゃないの。 
 どちらにしても、そこで無理に一貫性を持たせようとしてしまったことが良くなかったとは思うけど。 
 ちなみに operator++ の返却値を void にすることは出来ます。 
  >>330   inc/dec でフラグが変化しないアーキがあった、というか、それが普通だと思っていたんだが 
  なぜポストインクリメントがよく使われるかは、 
 Linuxさあ、Ubuntuとか使ってるんだけど、俺はプログラムやネット以外にあまり 
 >>336   ググればすぐにわかることだけど、有るよ。 
  unordered_setやunordered_mapは 
 void DumpCode(const char* str) { 
 char型の値は 0 から 127 までであると本に書いてあるのですが。。。 
 >>343   その本は窓から投げ捨てろ。 
 ー128〜127が正解だ 
  >>344     本にはそうは書かれていませんでした。申し訳ありません。間違っていました。   
 アスキー文字コードは、0から127までの値しか取らないからOKかなと思ってしまったのですが。 
  >>344     何か不具合が起こる例を教えていただけると助かります。 
  >>346   char ch = 255; 
 printf("%d\n", ch);   
 C/C++では、オーバーフローは警告なく普通に起こる。 
  signedな整数型は、最上位ビットが符号フラグになるんだ。charは8ビットの整数型で、printfに渡す過程で、符号付きのint型になる。まあ、やってみたらわかるけど、 
 printf("%d\n", (char)255); 
 charのビット数、CHAR_BITが8ではない環境はほとんどない。 
 4ビットCPUで動作するトースターのコンピューターの話でもするつもりかね。 
 ほとんど無いから何? 
 charが符号付きとも決まってない 
 char と signed char を混同するクソコテ 
 今後char関連の質問をするときは、charのビット数や符号などの環境を明示しましょうということで。 
 unsigned char がデフォなんてMS-C 3.x or 4.xの /J オプション付き 
 >>359   >>341 の質問に対してcharの符号有無が環境によって異なるというのは本質的な回答であり、ビット数の話は不適切だったというだけで、重箱の隅がどうこうという話では無いだろう。 
 そもそも初心者歓迎のスレで初心者を除外する要件を設けるのは本末転倒では? 
  ??? 
 環境を明示しろって言うのは
>>1 にも書いてあるんだが... 
 >>361   初心者だろうと質問に付随する前提知識は必要 
 変数知らんデータ型知らん制御文も分からないじゃ説明しようがない事なんていくらでもある   
 まずそこら辺の知識を理解してもらわん事には説明できないですってのは初心者を除外とは言わんだろう 
  4ビットCPUだとcharは4ビットと思ってんのか? 
 >>341  >>346   不都合と言う程の不都合か分からないけど、 
 単なる 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) のキャストをしない方が好ましい、て考え方もある。      
>>360   ARM で GCC だと、単なる char は unsigined が普通みたい。 
 元のCPU設計で符号付8bitが拡張機能だったことと関係あるとかないとか。 
  4bitのcharか、アルファベットが表現できないな 
 int *p = new int[100]; 
 >>366   つ -fsigned-char/-funsigned-char 
  スタックオーバーフローが起こった時に、すぐにエラーが起こらない可能性がある 
 >>368   良くある実装としては 
 newが返すアドレスの前にヘッダ情報がある 
  素人考えだと並のOS環境ではスタックオーバーフローは自動伸長に失敗してアドレスを割り当てられない時に起こると思うから直ぐにエラー終了しそう 
 配列への添え字アクセスの計算量はO(1)の定数時間とのことですが、これは通常の変数へのアクセスと同じということでしょうか? 
 添字の値にかかわらず一定 
 >>375   ありがとうございます 
 だとすると、同じ添え字に何度もアクセス(読み取りのみ)する場合、一旦変数に待避させてその変数を参照した方がいいですかね? 
  レッツ実測&吐き出したコードを確認 
 >>377     吐き出したコードってどうやって確認するんですか? 
  >>371-372     ありがとうございました。 
 そのあたりのことを詳しく書いてある本はありますか? 
  >>377   確かにそうですね 
 ありがとうございます、やってみます 
  >>378   使っている環境による 
 機械語一歩前のアセンブラも出力するオプションで出てきたアセンブラとデータシートから推定する   
 もっと前のアルゴリズムの検討は済んでて、 
 もはや、枝葉を削ってでも速度を出さなきゃいけないという最終段階の話だよね? 
  >>343-344     char 型が符号付きであってもなくても格納可能な範囲という意味では 0 〜 127 であると思って使ってれば間違いないのは確か。 
 あと、厳密にはマイナスの表現に 1 の補数を使ってる環境は有りうるので 
 char が符号付きだとしても -127 〜 127 しか表現できないかもしれない。    
>>345     言語仕様では文字がアスキーコードとは保証してないんだ。 
 ほとんどの環境ではアスキーコードかそれと互換な文字コードだろうけど、 
 EBCDIC とかでも言語仕様には違反しない。 
  >>373   並のOS環境って何だよwww   
 一般的なMCUのほとんどは 
 アドレス変換テーブルの仕組みがなく 
 スタックオーバーフローを検出するハード的仕組みも無い 
  二つスレッドがある 
 >>379   stackoverflow で、たまたまアクセスしたメモリに、 
 どんな値が入っているかは、誰にも分からない。 
 単に前に入っていた値が、入っているだけだから   
 その値が、たまたまCPU 命令にあれば、CPU を実行するから、 
 エラーになるのは次の命令以降になる   
 一方、CPU命令に無ければ、不正な命令となり、即座にエラーとなる 
  スタックのメモリ領域がこの範囲からこの範囲というように管理はしていないのですか? 
 >>387   昔汎用メッセージポンプを検討したときのサーベイにstd::condition_variableと書いてある。 
 注意としてspurious wakeupというのも書いてある。 
 もうすっかり忘れてしまって何のことだか自分でも思い出せないのだが、「条件変数」というのがキーワードになるようだ。 
  >>389   ページ単位ではしていることがある。 
 OS がメモリの割付を管理していて、 
 足りなければ追加で割り当てたりもする。 
 割り付けてないメモリ空間に変に触ったら検出できる。 
  >>389   スタックエリアの管理は当然してる 
 オーバーランの監視は環境次第   
 ハード的に仕組みがあるものもあし 
 ソフトで(コストをかけて)やる場合もあるし 
 全くしない環境もある 
  今のWindowsとかLinuxとかならもちろん瞬時にわかる 
 最近のC++ってかなり進化していてTaskとかLinqなんかもできるんだろ? PCだとC#があるから 
 組み込みなら自分で書いたものだけ使うというか 
 new/delete 
 組み込みってピンキリだからなんとも言えんわ 
 STLってC#のLinq並みに表現力があるんだろうか? Linqは最初嫌いだったが使い始めて 
 内部で new / delete 使用している stl は使わないリストに入れず 
 STLコンテナとSTLアルゴリズム 
 コンテナ使わない有用なアルゴリズムってあるか 
 >>403   内部でnew/deleteしてるものは当然含まれる 
 当たり前   
 そもそもヒープエリア自体無かったりするし 
 あってもアロケートのみで解放機能が無かったりする   
 小規模組み込みでメモリを確保出来ないなんてことは想定しないし 
 確保解放のコストもバカにならない 
 アドレス変換が無いから隙間だらけで連続領域が取れなくなるなんてことも心配したくない 
  ヘッダファイルを作るときに、2重インクルードを防止するための対策を書けと本に書いてあります。 
 >>410   人間の注意力なんてクソザコだからだよ。 
  >>410   複数のヘッダで共通のヘッダの定義が必要な場合を考えてみようか 
  header_1 👀  
 あなたはstdlib.hとstdio.hの作者です 
 >>416   入門書にこう書きます 
 「studio.h や stdlib.h をインクルードする際には、事前に errno.h をインクルードすること」   
 どうかなとは思うが実際こういう流儀でヘッダーファイル書く人も見かける 
  関数名にしろヘッダーにしろ6文字の縛りって何か歴史的理由があったのだろうか? 
 vfprintfは八文字。文字数削るメリットがあった時代だったからな。 
 >>423   FORTRAN77は識別子の長さが6文字以下とかの制限があったからそれに倣ったんじゃないかな 
  >>416-417   プリコンパイルヘッダが汚れたり無駄にでかくなったりするからな 
  以下のboost::factoryを使う練習用コードにおいて 
 https://wandbox.org/permlink/K1TIhC61VQztTbOd     map<string, boost::function<base* (int)>> factories; 
 とするとコンパイルエラーになり、ググって見つけた方法で 
 map<string, boost::function<base* (int const&)>> factories; 
 とすると何故かコンパイルが通り、問題なく動作します。 
 コンストラクタの引数が実際の int ではなぜ駄目なんでしょうか? 
 >>417   実装依存のヘッダファイルの場合とか、ユーザに事前にincludeしろとは言えないケースもあるよ 
  stackoverflow では boost::factory が引数の参照渡しを前提にしてるから、とあるな。 
 dxd9みたいにincludeすると可笑しくなるヘッダもあるしなーω 
 >>423-424   先頭6文字だけ見て一意に決まることが条件で、名前の長さ自体に制限はない、 
 じゃなかったかな。大文字小文字は同一視で。 
  _st とか _s とかごちゃごちゃ付き始めたころからつまらなくなった 
 >>433   公式ドキュメントにはさらりと「技術的理由によりfunction objectに渡す引数はlvalueでないと駄目」と書いてあるのみなので、さっぱり理解できませんでした。 
 そもそもコンストラクタbase (int const&)は定義していないのにコンパイルが通るのが不思議・・・   
 結局 boost::bind(boost::factory<derived*>(), _1); が何しているのか理解しないと先に進めなそうですね。 
  >>439   引数のある関数の場合はboost::bindを使うのではないでしょうか? 
 いちおう公式にもその例が書いてあります。   
 ちなみにどんぴしゃな質問がstackoverflowにあり、Answerには親切にDemoまで付けてくれてて、 
 速攻で解決したと糠喜びしたんですが見事にコンパイルエラーでした。  
https://stackoverflow.com/questions/37137117/passing-arguments-in-constructor-with-boost-factory    >>440   引数を部分的に何かにbindしたfunctionを作るのがbindなわけで、 
 (add(a,b) の a だけ1にbindしてadd1を作るとか) 
 何もbindせず引数の順序も同じなら   
  factories["derived"] = boost::factory<derived*>();    
 で良い 
  >>441   確かにbindのそもそもの目的はそれですよね>(add(a,b) の a だけ1にbindしてadd1を作るとか) 
 仰る通りの書き方でコンパイルも実行も通りました。 
 ただ、ググった限り引数のある場合はbindをかます例しか見つからなかったです。 
 「bindが必要」と明言してる人すらいて、結局よくわからないです・・・   
 その後、いくらコンパイルも実行も問題ないとはいえ実際のコンストラクタとは違うのを 
 boost::function<〜> に指定するのはなんとも気持ち悪く思い、試行錯誤したところ 
 boost::forward_adapter を使う方法を見つけました。  
https://wandbox.org/permlink/D3Q75cgRNR43Nulc     ヒントとなったのは以下のサイトでした。  
https://lists.boost.org/Archives/boost/2017/02/232695.php     正直なぜこれで通るのか完全には理解していませんが、とりあえずの解決とします。 
 ご助言どうもありがとうございました。 
  >>442   公式にドキュメントがあるだろう。 
 なんでググりまくるんだ? 
  >>443   公式ドキュメントはこれです。  
https://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の公式ドキュメントはこんなものというか、隅から隅まで説明しないわからない素人はお断りってやつですよね。 
  質問です. 
 std::string知ってるなら 
 可変の n, m が読み込む前に確定するのか 
 >>447   今回はstringを見て,nとmを決めます. 
 str="a"ならn=2,m=3のような感じです.  
>>448   読み込み方が分かりません.すいません. 
 Google先生に聞いてこんな感じのプログラムを書いてます. 
 std::string line; 
 std::ifstream infile("hoge.dat"); 
 std::getline(infile,line); 
 sscanf(line.data(),...//どう書くの? 
  void Show(const IntArray& array){ 
 const メンバ関数の中でメンバ変数の内容を変更しているとコンパイルエラーになります。 
 void Show(IntArray& const array) 
 >>449   コンパイル単位を越えたらチェックするのは難しいし言語の壁を越えたら不可能に近いから 
 中途半端な事をするくらいならconst明示されてるかという線引きの方が分かり易い 
  >>449   難しいというか不可能だからですよ 
 呼び出す関数はまだコンパイルされてないかもしれないしまだソースコードもないかもしれない 
  >>449   メンバ変数を変更しないなら素直にメンバ関数にconst付けれや 
  >>449-450  の質問者は、分割コンパイルにまだ慣れてないと思えるなぁ。 
 ソースファイルを分けてみればピンと来るかと。   
 片方をソースなしのオブジェクトやライブラリにしないとダメかな。 
  C#のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに 
 >>457   COM使えばできるけど、スレタイも読めないお前にできるかどうかはわからん 
  そんなことは当たり前ですね。その方法が説明できますか? 
 C#のことはC#のスレッドで尋ねればいいでしょ、てお話。 
 あ、ごめん。++が#に見えた。でも普通は++を#に書き間違ったんだろうと判断すると 
 ところでC++のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに  
 >>463   CreateProcess() win32API スレへgo 
  >>464   it is conditional on your ability, although its mean applying in the case of a usual Japanese. 
  main関数の中でstaticを使う意味は何でしょうか? 
 ロベールの本を持ってないんで、適切な回答じゃないかもしれんが。 
 >>472   ローカル変数に static 変数が付いていた場合は最初に通過したときに初期化されるルール。 
 (コンストラクタもそのときに走る。) 
 これは C のときから変わってないよ。 
  普通に考えると、 
 >>473   横からだけど訂正乙 
 初心者が読んで間違えて覚えるので、初心者スレでは嘘を書かないように特に気をつける必要ある 
  >>474   mainの中だから意味無い   
 っつーかstaticは二つの意味があって全然別物 
 スコープと性的と混ぜるな危険 
  >>474 は 
 関数内でstatic変数を使うのは静的変数のスコープを関数ローカルにしたいからでは、 
 というごく当たり前の文意だろ普通に読むと。   
 どう読むと 
 関数内だからファイルローカルの話とか関係ない!勘違いするな!となるんだよ 
 自分以外は文法もセマンティックもろくに知らないという前提はやめるべき 
  >>470   スコープはmaim( )内にしたいけどスタックは使いたくないってケースかな 
  >>470   ウェブ版をざっと探してみたら main 内で satatic 変数を使ってるのはこれだけだったんだけど、 
 これのことか?  
http://www7b.biglobe.ne.jp/ ~robe/cpphtml/html02/cpp02037.html 
  関数スコープのstaticなクラス・インスタンスのコンストラクタは 
 初期化が固定データのメモリコピーで済むものはロード時に初期化するコンパイラが普通 
 >>480     ありがとうございます。本とは内容が違うようです。   
 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};   
 … 
 }   
 というコードが該当箇所です。 
  staticを付けなければスタックに確保されるかもしれない。その場合、どうしても遅くなる。 
 >>485     でも、速さがどうとかいうことについては何も書いていないんです。 
 staticを付けていることについては何の説明もありません。 
  >>486   >>485 はきちんとした回答だと思うよ。 
 配列が大きくなれば顕著になる。 
 「その本に書かれていないから」と拒絶するのは憲法に基づいて自由だけど 
  定数だからstatic constにした 
 その変数をコンパイル時点で確定しようとしている。 
 >>487   だぶんだけど、 
>>486  が言おうとしているのは「
>>485  だとしたら入門書としては不親切だよね!」って話じゃねーの。 
  >>484   ROMとRAMに別れてる環境、 
 つまりほとんどの小規模な組み込み環境だと 
 static const は通常ROMに配置される 
 要するにRAMの節約   
 速度は逆にRAMの方が速いのが普通 
  クラスの定義をヘッダファイルに書くときに、 
 >>484     みなさん、ありがとうございました。 
 速度について気にしているのなら、ロベールにはそう書いてほしかったです。 
 例では、非常に小さな配列ですから速度について気にしていることは読み取りにくい 
 ように思います。    
>>488   定数だから const にしたというのなら分かるのですが、なぜstaticをつけるのでしょうか? 
  >>492     private なメンバはむしろ、クラスのメンバ関数を実装する .cpp ファイルに書いた方がいいように思います。 
  >>494   pimplイディオムで、クラス詳細を隠蔽できるよ。 
  >>493   あの部分では特別に速度を意識した記述ではなく普通に意識する程度の事だから一々説明されないということではないかな 
 速度や使用メモリを気にするのはCやC++プログラマの癖または習慣みたいなもので特にロベールみたいな昔の人は体に染み付いているだろうからね 
  >>493   今回はたまたまmainであり、 
 たまたま小さなデータだったというだけで、 
 より汎用性の高いコードにするのはプログラミングの基本   
 staticを付けるメリットは 
 ・データ構造の初期化が1回(ROMだと0回)で済む 
 ・スタックを浪費しない 
 ・関数を抜けてもデータが保持される 
 ・番地が固定   
 デメリットは 
 ・関数を通らなくても初期化される 
 ・関数外でもメモリを使う 
  一番重要なのは
>>491   PCプログラムしかやらない人は知らないだろうけど 
 test2の形だと上手く動作しないのですが何故でしょうか 
 引数を std::string &str, ... にすればなおる 
 引数を参照とポインタでも試してみましたが結果は変わらなかったです 
 va_start(args, cstr); 
 ああなんとなく意味が分かってきました 
 こういうコードにすると期待した動作をするようになりました 
 ついでに言うと va_start の第二引数については仕様上結構な制限、 
 va_listとC++は、相性が合わないんだよな。呼び出し側でc_str()するとか。 
 特に強い理由がなければ variadic template を使った方が安全だし簡単に書ける。 
 えー、可変長引数の例にしただけなので、そんなどうでもいいとこを言われても困るよ。 
 そう言うところにしか突っ込めない雑魚の相手するなよ... 
 >>511   なんでbufに一旦書いてるの? 
 直接printfじゃだめなん? 
  普通はね 
 va_start の第2引数の型の制限を知らなくてもor気にしなくても良いように 
 そもそも何でbufにって質問は 
 コメント元の
>>507 にすべきだろ 
 こんな辺境ですらイキリ散らすなんて呆れる他ありませんわ 
 危険てんこ盛りなコードの危険性が低い部分をなおしてどうすんの?アホなの? 
 c++ スレで variadic template 紹介されてこの反応 
 >>526   危険性が高いかどうかは重要じゃなくて、話題のテーマに近いかどうかだろ。 
 本題に関係ないところなんてどうでもいいじゃないの。 
  >>501 とvariadic templateは関係ないわけだが 
  const double const ARRAY[] = { 3, -1 }; 
 ポインタ変数なら 
 >>531   > const double const ARRAY[] = { 3, -1 }; 
 コンパイルエラーにならないんだっけ? 
  >>532     ありがとうございました。    
>>533     Visual Studioではコンパイルエラーになりません。 
  const double const a[]; 
 Win32のBOOL型を返す関数を複数回呼んで、  
 result &= !!api(...); 
 >>539   成功した回数をカウントして呼び出す関数が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; 
 } 
  結果を std::vector にでもまとめておいて、 std::all_of で全てがFALSEでないことを確認するとか。 
 >>539   > bResult = Api(...) && bResult; 
 > bResult = Api(...) && bResult; 
 > bResult = Api(...) && bResult; 
 これでいいと思う    
>>541   3個位ならいいけどたくさんになると数え間違いとかやらかしそう 
  普通に&で繋げてしまえば。 
 みなさんご意見ありがとうございます。 
 >>547   こういう手段もあるぞ。   
 bResult *= Api(...);   
 一度 0 になったら何をかけても 0 だ。 
  &&= と書けないことをこの質問で知ったわ。 
   >>548   「返り値が0でなければ成功」の関数で変テコな返り値が来ると 
 組み合わせでダメになるかも。 
 256 * 256 == 65536 で オーヴァーフローして0、みたいな感じ。 
 明確なメリットが無いのに、 
 数が少なく重要な箇所であれば、 
 デバッグ用コードを追加しやすい以下で良い   
 if (!Api(...)){ 
  bResult = FALSE; 
 } 
 ...   
 数が少なく重要じゃなければ 
>>547  で良い   
 数が多ければ色々と工夫しようか 
 >>548   適当なニ数をかけたら 0 になってしまった、とかはあり得るのでしょうか?   
 …んー、ないな、何故ないのだろう? 
  基底クラスのメンバ関数に virtual をつけないことってあるんですか? 
 逆に言うと、今のC++でvirtualをつけた場合の機能をvirtualをつけなかった場合の 
 >>553   仮想メソッドは、最適化がなければ関数ポインタのように確保されるので、不必要なものはメモリーの無駄になる。 
  >>555     virtualはつけなくてもかまわない場合には付けない方がいいということなんですね。   
 ありがとうございました。 
  >>557   せやな。 普通はないと思うが、無いと言い切ることもできない。   
 ここまでいろんな案が出てるけど、なんだかんだで 
>>539  が自分で結論出してるのがベストだと思う。 
 書き方の話なら、マクロでもクラスでも適当なものでラップすれば見栄えはどうとでも出来ることだし。 
  浮動小数点ならダーティー0とかあるけど 
 今回は「非ゼロ」が様々な数値である場合について考えているわけだから 
 int64_t 使えばいいだろwww 
 >>547   汚い書き方とまでは言わないけど、個人的にはあまりいいやり方だとも思わないかな。   
 俺もC, C++を覚えた当初はなるべく冗長な記述を省くことが正義であると考えていたけど、 
 そのうち高々数文字削ることなんかより、素直に可読性や保守性が高い記述をする方が美しいと感じるようになったよ。 
  !か!!使えば1か0にしかならんからそれかけるとか 
 それをシフトと組み合わせると、エラー箇所までわかって便利だね 
 >>556   補足すると、仮想関数は呼び出しのコストも同じ理由で非仮想のメンバ関数より高い(わずかだけど 
 あと、仮想関数が一つでもあるクラスは、そのクラスのオブジェクトの先頭に仮想関数テーブルへのポインタが入る 
 つまり純粋にメンバ変数のデータ通りのメモリイメージになるクラスが作れなくなる   
 virtualかどうかを選ぶ余地があるってことは選ぶ必要があるということだよ 
  >>565   ネタだろうけど、ほんとにそれが必要としてもよほどメモリーに困ってるのでないなら
>>542 とかでいいだろ 
  a=1に対して、 
 >>571   確かに以下は  
https://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 
 と表示された 
  >>572   http://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    
http://techtipshoge.blogspot.jp/2012/01/c.html   http://www.kouno.jp/home/c_faq/c3.html   http://www.st.rim.or.jp/ ~phinloda/cqa/cqa7.html   
 こんな書き方をするなってことだね 
  >>571   いくつかの例外を除いて式中の各項が評価される順序は決まっていないので、 
 評価される順を知りたいのなら実際にコンパイルされた結果のコードや挙動を見て調べるしかない。 
  未定義動作になるから、今回のコンパイル時と次回のコンパイル時とで 
 >>573   おお、「未定義動作となること」を検出してコンパイルエラーにする環境もあるんだな 
  class Base { 
 b = d; 
 void Base::A() {  
 >>578-579      よく分かりません。   
 ポリモーフィズムというのがありますが、その考え方だと   
 b = d; 
 b.A() ⇒ 「Derived」が表示される。   
 のではないかと思ってしまいます。 
  Base::B() の virtual を削除する: 
 ポインタじゃなくて実体をBase bに代入(コピー)したらDerivedじゃなくなるのは当然。「スライシング」でググれ。 
 まずこの本で、オブジェクト指向を学ぶ。 
 >>577   > b = d; 
 > b.A() ⇒ 「Base」が表示される。   
 Base bp; 
 bp = &d; 
 b->A();   
 こうやね 
  >>582   間違えた   
 Base *bp; 
 bp = &d; 
 b->A(); 
  >>583-585     ありがとうございました。     
 C++が難しいというのは、設計が悪いからですか? 
 C++と同等の機能を持った言語で、C++よりも分かりやすい言語を新たに 
 設計することは無理ですか? 
  >>587-588     ありがとうございました。 
 試してみようと思います。 
  理由があってC++を習得するのが難しいのならOKですが、設計が悪いから 
 C++ は、何でも出来るようにしているから、ルール数が100以上ある 
 ロベールでC++ を勉強するのも良いけど、 
 某洋氏翻訳の第4版がロベール本より先に出てくる理由について3行で述べよ。 
 = が代入じゃなく単に Base クラスのオブジェクトのoperator = を呼んでるだけ、 
 ロベールの方が、独習・柴田望洋・林 晴比古などよりも、簡単 
 >>588     試してみました。 
 確かにポインタを使うと期待通りの結果でしたが、参照を使うと期待通りにはいきませんでした。 
 これはなぜでしょうか?   
 #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 
  参照は書き換えられないからな。 
 >>599   当たり前 
 br は b の別名なだけだから 
 b = d; 
 ってやってるのと同じ 
 b は Base の領域しかないんだから b.A() で Delived::A() を呼び出した時に Delived にしかないメンバ変数とか参照してたら困るし 
  参照のポインタっぽい振る舞いを確認したいならこう 
 >>602   ありがとうございました。 
 下の結果は、   
 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(); 
 } 
  Base 
 >>604   参照は初期化時に参照先が設定され、以降の操作は参照先に対してなされる。 
 初期化と代入を区別すること。   
 Base& br1 = b; // 初期化 br1 は b の参照 
 br1 = d; // 代入 b = d と同じ動作   
 Base& br2 = d; // 初期化 br2 は d の参照 
  >>605     ありがとうございました。   
 >Base& br1 = b; // 初期化 br1 は b の参照 
 >br1 = d; // 代入 b = d と同じ動作   
 br1 = d としても参照先は変わらないんですね。   
 ありがとうございました。 
  Java,C#などのプログラマです。 
 C++にC#などのインターフェースはない代わりに多重継承?できるのでそれを使うとのことで、  
https://ideone.com/k7g2nn   ITestAとITestBはインターフェース的なものです。 
 で、ITestAを実装したCBaseAを作り、CBaseAを継承しITestBを実装したCTestBを 
 作ったのですが、 
 CBaseBをnewなど実体化するとITestA::methodAがオーバーライドされておらずCBaseBは 
 抽象クラスになってて実体化できません。 
 ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか?? 
 というかこういう場合C++ではどうすればいいのでしょうか? 
 Base Pointer : 100〜119 
 >>607   単なる文法エラーだからエラーメッセージみてコードを直してください 
  >>609   文法エラー??  
https://ideone.com/k7g2nn の今回の部分と関係ないエラーは無視してください。 
 あくまでイメージ目的でそこらへん適当にやりました。 
 すみません。    
https://ideone.com/QxErKY   こっちですね。 
  CBaseAのmethodAをCBaseBを実体化して呼びたいんだよな? 
 ならCBaseAとITestBどっちのmethodA呼ぶのかあいまいって怒られる   
 これならok  
https://ideone.com/FGHyda   もちろん、エラーなくしてコンパイルを通す方法は 
 >>607 の 
 >ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか?? 
 で書いたようにすればとりあえず、コンパイルは通ります。 
 聞きたいのは、 
 C#の場合はBaseAの方で一度MethodAを宣言・定義すればいいのですが、 
 C++の場合は毎回CBaseAの派生クラスでmethodAを宣言して定義しなおさなければいけないのでしょうか?? 
 それともC++では他の方法があるのでしょうか? 
 >>612   あ、すみません。ちょっと被ってしましましたね。
>>613 は忘れて下さい。  
>>612 のコードを見てみます。 
  >>612   そっか。純粋仮想関数じゃなくて仮想関数にするって手もありましたか。 
 まぁ、インターフェース的なクラスの方をいじくるのが気になりますが。 
 ありがとうございます。 
  実装とインタフェースの両方を継承するならこういう書き方もある 
 ATL なんかがこれ式かな    
https://ideone.com/B7JWER   >>616   >>617   色々ありがとうございます。
>>617 がよさそうなのでこれで行こうかなと思います。 
  巨大なファァイルの読み込みに関してです。 
 行という概念が 
 >>619   テキストのフォーマットによっては高速化は可能 
 例えば1行が固定サイズとか行番号が書いてあるとか   
 全く自由なフォーマットだと頭から解析するしかない   
 読み込みスレッドと解析スレッドを分けると速くなることもあるかも   
 同じファイルが複数回指定されることが多ければ 
 ファイル名と更新日時と1000行目の位置 
 のデータベースを持つとか 
  >>619   「1000行目」の定義が先頭から数えて999番目の改行の次、である以上ありません。 
 1行のバイト数を全て同一にすることができれば(この場合しばしば行ではなくレコードと呼ばれる) 
 1000番目のバイト位置を計算してそこから読むことができます。   
 FILE * を用いてシーケンシャルにたくさん読む場合は 
 setvbuf でバッファサイズを拡大しておくと高速になることも多いので試す価値はあるでしょう   
 いろんな行に何度もアクセスするなら、 
 全てメモリに読み込んだ上で各行の先頭位置を配列に記録しておくと良いでしょう。 
  末尾にseekして、適当に戻って読んでみて、 
 巨大なファイルの中途の行じゃなく、ファイルの最終行だけを抜き出したい のか? 
 対象のテキストファイルとは独立に、 
 「そのテキストファイルの各行がファイルの何バイト目から始まるか」 
 という情報を覚えておく手はあると思うけど、整合を保つのが面倒よね。    
>>622  の後半部分だな。 
 皆様いろいろご指導ありがとうございました。 
 末尾にseek して1文字抜出し(末尾が\n の場合はそれを無視して) 
 配列の要素数が分からないときscanfで読み込んだ値を要素数にするにはどのようにしたらよいですか? 
 >>628   scanf("%d",&n);  
 int array[n]; //読み込んだ値を要素数にするってこういう事? 
  基本的な事なんだろうけど、vectorを範囲ベースのforループしたいのですができません。 
 すみませんでした。普通に逆参照すればいいのか。 
 MFCのアプリで排他制御のルーチンを作っていて疑問に思ったことなのですが、  
 >>633   C++11 でローカルなスタティック変数の初期化はスレッドセーフであると定められた。 
 (C++03 にはこの規定はなく、実際その頃はmsvcもgccもスレッドセーフではなかった) 
 msvc では 2015 から。   
 c言語バージョンの指定のほか、専用のオプションによっても有効化、無効化できる 
 以下を参照    
https://docs.microsoft.com/ja-jp/cpp/build/reference/zc-threadsafeinit-thread-safe-local-static-initialization     gcc / clang では -fno-threadsafe-statics オプション 
  他の言語ではコンパイルエラーで悩むことはないのですが、コンパイルが通らなくてかれこれ2日。 
 >>636   コードすら貼らないオツムの足りなさじゃ諦めろ 
  >>634-635   ありがとうございます。 
 VSは2015よりも前なので、このやり方はダメってことですね。 
 関数の外に置くようにします。   
 MFCの内部ではやっちゃってますが。 
  なんだよ。このクソ言語。やっとわかったわ。 
 エラーも貼れないなら、助けるのはムリ。 
 そりゃ、ソースコード全部張れば分かるとは思うけど、 
 May the source be with you. 
 そうでしたか。まだ、C++やりだして1週間未満なものでして、そういうノウハウというか関連知識が 
 プリプロセッサによる不便さだから c++ の文法とは全く関係ないけどな 
 >>642   今後のためにそのエラーになる最少構成でやってみ 
  ヘッダファイルがこんなふうにconst用と非const用の関数があるとして 
 >>653   型の別名を定義することについての是非は置くとして、 typedef はオワコン。 
 using を使うのがモダンな C++ やで。 
  typedefやusingはなるべく使いたくないんですよね 
 こうだな。動くかどうか知らんけど。 
 柴田望洋訳のC++の本とロベールのC++の本以外にまともな日本語のC++の本ってありますか? 
 ロベール、独習(Herbert Schildt)、柴田望洋、林 晴比古 
 >>660-661     ありがとうございます。   
 Herbert Schildtの本は、ロベールに比べると細かい話がないように思います。 
 柴田さんの中級という本も細かい話がないように思います。 
  vector について質問です。 
 実際にヘッダ読んで見るしかないと思うが 
 Visual Studioなどでデバッグするとヘッダーが見れるよ。vectorはテンプレートのクラスだから、 
 >>664     ありがとうございました。   
 ディープコピーでしたら、使う上では、何も考えずに関数の引数として渡したり、 
 関数から返したりしてもかまわないですね。    
>>665     ありがとうございました。 
  >>666   それはディープコピーのコストがかさむのでおすすめしない 
  >>666   >何も考えず引数で渡しても良いですね   
 何をもってして「良い」と評価するのかはわかりませんが、 
 そういうのは拙い知識で独断せずそこら中にある 
 経験豊富な先人の書いたコードを読んで真似するのがいいですよ 
 引数は大抵 const 参照で渡しているでしょう 
  class TestA 
 >>669   どこのメモリにどう作られているのかという質問だと思うけど、 
 C や C++ では式の値として構造体やオブジェクトが認められていて、 
 コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。   
 式や式の一部の値としてだけ現れて変数に格納されないオブジェクトはテンポラリーオブジェクトとか言うので、 
 詳細はテンポラリーオブジェクトでぐぐって。    
>>669   のmain はテンポラリーオブジェクトを使って b を用意せず TestB().getA(); ともかける     
 ところで今回の質問の、関数の戻り値に関するコンパイラの動作は 
 「戻り値最適化」なる最適化によって色々複雑なことになっているので 
 これは自分で戻り値最適化でググって調べて欲しい。 
  >>669   質問が文法的なことについてだとすると、式中の項ととして 
 TestA() 
 std::string("foo") 
 などのように型名にコンストラタの引数を加えて関数呼び出しのように書くと 
 テンポラリーオブジェクトを生成してそれを値とする頃ということになる。   
 例 
 size_t l = std::string("abc").length();   
 std::string 型のテンポラリーオブジェクト(中身は"abc") が作られ、 
 それのメンバ関数 length が呼ばれ、l はその値(3)で初期化される。 
  >>670-671   詳細をありがとうございました。 
 大変良く解りました。より深くは自分でググってみます。 
  for (int i = 0; i < n + 1; ++i) {;} 
 >>674   ただの整数の足し算程度なら最適化されることが期待できるのであまり気にしなくていい。 
  【マイトLーヤとPS4】 FFとDQの最新作、VR開発は危険、プレーヤーの日常感覚を損なうおそれ 
 http://2chb.net/r/liveplus/1524621704/l50   https://ideone.com/TVzVzF     上記のコードで、read関数を持ったIReadableクラス(基底クラス)があって、そのクラスから派生したCFileReaderクラス、 
 直接は派生していないけどread関数を持ったCMemoryReaderクラスがあって、その両方を受け取れるvector<IReadable*>を作りたいのですがコンパイルが通りません。 
 どうしたらいいでしょうか? どなたか教えてください。。。 
  >>674   いまだに最適化されないコンパイラもあることはある 
 8bitマイコンとかの話   
 あと、nがvolatileだと当然毎回計算する 
 nがSFRだったり複数スレッド共有変数だったりするなら気を付けよう   
 普通は気にしなくて大丈夫 
 コンパイラの最適化の基本の基本なので   
 このループの比較がパフォーマンスに大きく影響するなら 
 高速化テクニックは色々とある 
  >>677   なんとなく互換性のある read を持つものをエンベロープして IReadable になるエンベロープクラスを用いるのはどう?   
 ifstream も IReadable じゃないからエンベロープする。    
https://ideone.com/27yhhu    >>674   > for (int i = 0; i <= n; ++i) {;} 
  for ループといえばつい手癖で 
 >>681   それcountが1でも全くループしないというヘンテコ仕様だけど 
 そんなもの手癖で書くの? 
  >>683   隣り合った2項、例えばv[i] と v[i+1] を用いた処理をするとか 
 後続のものがある項だけ処理するとか良くある 
  int **a を利用して2次元の動的配列を作ります。 
 >>675   >>678   >>680     ありがとうございました。 
  >>683   そんなにヘンテコでもないと思う   
 for (size_t count = 0 ; count < 10 ; count++){ 
  for (size_t i = 0 ; i < count - 1 ; i++){ 
 .... 
  } 
 }   
 こんなのはありがちかと 
  >>687   レアケースっていうか 
 nが小数の場合だな 
  ふむ、なくはないか。 
 >>689   だからそう言うのをレアケースって言ってるんだが... 
 よく書くと言うなら多分住む世界が違う 
  >>685     具体的なコードは以下です:   
 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; 
 } 
  >>692   さくらの続編を放送してる今日この頃、レイアースの第三章もワンチャン有るかもな! 
  >>687   そんな事言ったら 
 countが0でループだってレアケースだぞ 
  >>693   const付きに変換出来るのは 
 ポインタの先がconstに変わる場合   
 int finc(int * const * a) なら大丈夫 
  ありがとうございます。 
 >>679   ありがとうございます。その方法で取りあえずの目的は果たせそうなのですが、ほかの方法はないでしょうか? 
 というのも、他のクラスでラッピングしたりキャストしたりせずにifstreamを食わせたいのです。 
 たとえば、STLの各種関数はポインタでもvector等のコンテナでも大体OKですよね? 
 あれと同様に関数ポインタでもクラスのインスタンスへのポインタでもread()を持つものなら何でも突っ込めるようにしてforでぶん回したいのです。 
 標準のコンテナや自作クラス等の違いを吸収できるような構造にしたいのです。条件が後出しになってしまって申し訳ありません。 
  キャスト 
 >>699     ありがとうございます。   
 ちょっと回答が理解できないため、質問を代えさせてください   
 以下のプログラムの func はNGなのに func2 はOKなのはなぜでしょうか? 
  int func(const int **a) { 
 >>701   それは c / c++ の欠点の1つで、 
 T * は const T * に文句も言わず変換してくれるが 
 T ** は const T ** に変換してくれないという問題 
 T は const T と定数性以外 compatible だよね、という判断を 1 段階しかしてくれない。   
 キャストが必要   
 const_cast<const int**>(a) など 
  >>702   皆が言っているのは質問の内容とはちょっと違うけど、 
 func の中で a[0] = 0; などを禁止するために内側のポインタ自体も const にして   
 const int * const * にした方がいいよということ 
  いやごめん 
 >>703   欠点なの? 
 T ** を const T ** に勝手に変換されると困るんだが。 
  T * を const T * には勝手に変換するけどな 
 >>706   ちょっと興味があるので困るコードを教えて 
  >>705   慌ててたのかこのレス書き間違ってた   
 func(const int * const * )にすればコンパイル通る、 
 T **  ==> const T * const * という変換は暗黙でok、 
 と書きたかった(全然違うな) 
  >>709   int** ipp; 
 const int ci=0; 
 const int ** cipp; 
 cipp = ipp; 
 *cipp= &ci; 
 **ipp = 3; 
  おっと ipp の初期化忘れた 
 ロベールの本に、 
 truncate は、ファイルサイズを切り詰め・縮小する。 
 >>712   なるほどね。 
 T ** => cont T ** は許すとcont T を操作できてしまうから禁止されていて、   
 T * => const T * 
 T ** => const T * const  * 
 ...(以下略) 
 にはその問題が無いから許可されているわけか 
  file.read((char*)buf, sizeof buf); 👀  
 >>717     ありがとうございました。   
 あともう一つ質問させてください:   
 ロベールの本なのですが、   
 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());   
 としていないのでしょうか? 
  【マイトLーヤとUFO】 『月面にはウサギやウルフが棲息』   『宇宙人グレイは溶けてゼリーに』 http://2chb.net/r/liveplus/1525483483/l50    >>718   char *はconst char *に互換だから。constは書き換えないという意味で、constなしはconstありに対して互換性がある。 
  すみません。もう一つ質問です。 
 fstream src; 
 >>720     ありがとうございます。   
 つまりどちらもエラーにはならないということですね。   
 ですが、記述が統一していない理由というのは何か考えられるでしょうか?   
 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*) とキャストすることも 
 ないかなという感じですかね? 
  ロベールさんの本は色々細かいことが書いてあって有用なのですが、なぜこういうコードなんだろう?という 
 Cスタイルのキャストは強力すぎて、効果が分かりにくいので、モダンでは、そのキャストは、reinterpret_cast<const char *>(&n)って書いた方がいい。 
 winsowsにはC#コンパイラが標準付属してますが、C++コンパイラは標準付属してないんですか? 
 つまり、その本は古い。温故知新とは言うが、Cスタイルのキャストの使用はモダンではない。 
 >>726   訂正。 
 × reinterpret_cast<const char *>(&n) 
 ○ reinterpret_cast<char *>(&n)   
 そのCスタイルのキャストは 
 const_cast<const char *>(reinterpret_cast<char *>(&n))と同じ。 
 下手なキャストはバグのもと。キャストは最小限に。 
  コンパイラによっては、reinterpret_castとconst_castをCスタイルのキャストで一度にしようとすると、警告やエラーになるものもある。 
 file.write((const char*)&n, sizeof n); 
 元の趣旨がキャストについての質問だけどそれは置くとして、 
 そんなもんがいいと思ってる人に何言っても無駄だし 
 >>732   初心者が入門書で学習している段階で、途中の過程をすっ飛ばしてこっちの方がいいからこれ使えなんて進めるのはかえって理解を妨げるんでないの? 
  繰返すが趣旨と外れてることはわかってるので、元質問は忘れて。 
 >>736   競技プログラミングが流行る前には、宿題請負スレが隆盛を誇り、私もそれに便乗していろいろやっていましたが、 
 競プロをやりたいとは思わないなあ… 
  ロベールの本に以下のコードがあります。 
 スタックポインタをずらす量が変わるだけ 
 >>739     そういうのを分かるようんなるにはどうすればいいのでしょうか? 
 C++の本だけ読んでいても分からないような気がします。 
  もしパフォーマンスが問題になるなら 
 >>740   コードを書いたときに具体的にどんな処理が行われるか 
 を地道に学んで行くしかない   
 アセンブラを見てもいいし本で学んでも良いし 
 時間を測っても良い   
 C言語の方が簡単なのでC言語にある機能から 
  >>738   毎ループその buf が作られるかという質問について言えば 
 関数に入るときに確保された領域が毎ループ使い回されるだけ 
  >>744   ありがとうございます。 
 newした場合にはもちろん毎回別の領域が確保されるわけですよね。 
 文法だけからでは分からないことだと思うので、そのような部分を解説した本が 
 あればよいのですが。。。 
  コンストラクターを起こすようなクラスならアレだけど 
 >>745   C++ スタック ヒープで検索すると解説しているページは山ほどヒットするけどいい本ってあるのかな。 
 CPUとメモリの動作とか簡単に学んでおくといい気がする。   
 スタックに収まらないような大きな領域をスタックに取ってはいけないとか 
 実践的に必要な知識でもあるんだよね。 
  >>748   個人的には、はじめて読むシリーズがコンパクトで良かった。 
 はじめて読む8086 
 はじめて読むPentium 
 はじめて読むMASM 
 はじめて読む486 
 486は結構ボリュームがある 
  クラスの練習に文字列クラスっぽいものを作ったんですが 
 Mystr Mystr::operator=(Mystr &obj){ 
   //左辺に右辺を代入 
   return *this 
 } 
 こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが 
 関数の戻り値をvoidにする以外でなくす方法はありませんか? 
 一応コード全文 
https://ideone.com/A1iQ3Y   >>750   >Mystr Mystr::operator=(Mystr &obj){   
 一般的にはこうする 
 Mystr & Mystr::operator=(Mystr &obj){ 
  Mystr & Mystr::operator=(const Mystr &obj); 
 ありがとうございました 
 >>753   おそらくわかっていると思うけど、ローカル変数や 
 テンポラリーオブジェクトの参照は返しちゃダメなので注意   
 ダメな例 
 T& f() { T a; .....; return a;} 
 string& g() { string a, b; .....; return a+b;} 
  >>749   はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね… 
  アセンブラって「低水準言語」なはずだけども、今となっては機械語すらもかなり高水準だもんな……。 
 機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、 
 機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。    
>>755   動かすための情報を集約しようとしてはしてるよ。 
 ある程度は動く。  
https://github.com/tkmc/486   アドレスでアクセスできるメモリってものがあってデータやコードが書かれてるのかー 
 >>758   >>749   これの上の3冊は薄くてすぐ読めるから、もやもやとした状態でいるよりはいい気がする。 
 ただ、486以外は古本でしか手に入らなそうだけど。 
  アセンブラの前に 
 >>761   そう。 
 でもスタックを理解するにはメモリという概念モデルの理解が必要 
 だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う   
 セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる 
  実用レベルのCで関数ローカル変数がどう実現されてるか、となると 
 C の言語としての理屈が現代のコンピュータの仕組みと乖離しててもはや低級言語とは言えないということを 
 Cに引きずられて仕様のできたMIPSはCの理解にとてもいいよ 
 マシン語をやるのなら、実際に石を触れる感じのする環境がいいなあ、あくまで「感じ」だけれども 
 PCはPCで面白いし、 
 AKI-80 の時代の人なのでラズパイで電子工作とかやってるのを見ると隔世の感がある。 
 Donald Knuth の MMIX っていう言語は勉強するとためになりますか? 
 >>761   理解すると言っても何を勉強して理解するのか? 
 という話だと思ったんだけど。 
 アセンブリやCPU関連の本以外で具体的に分かるものがあるというのがよく分からないな。 
  wikipedia の「コールスタック」の項に意外にしっかりした説明あるな 
 メモリとかスタックとかヒープとかって、C/C++ 言語仕様とは直接の関係がないけど、使う上では結構重要な情報だよねー。 
 >>772   ならないと思う。 
 クヌース先生の本を読む上での決まり事を、先生が定義しただけに過ぎない、と理解してる。 
  僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 
 >>775   たしかに、そこをつく本を書けば売れるかもしれない 
 そんな本に書くべきことは、他に何があるだろうか? 
 ・qsort() の説明 
 ・アセンブリ言語とのリンク 
 ・PEフォーマット 
 …etc 
  >>775 ,780 
 江添氏が C++ の入門書で、言語以外の周辺事情もある程度カバーしたものを書こうとしてるみたいだぞ。 
 今は二の補数を説明すべきかどうかとか TWITTER でグダグダ言ってるから、 
 当たり前みたいで、しかし説明を省略されがちなことも含まれると思う。 
  シフトを使って多倍長計算とか、ZDDとか(クヌースの4巻だけど日本発) 
 浮動小数点の誤差がらみとか、バッファオーバーフローでなんで脆弱になるのかとか、キリがなくなるぞ 
 コンパイルとリンクとロードの話とか。 
 ちょっとCと関係ないですが、コンピュータサイエンティストの人がよくMacを使っているのはなぜですか? 
 >>781   二の補数はあたりまえに書いてもいいとおもうけれども、二の補数以外のものがあることを陽に記述する必要はないんじゃないかな… 
  >>785   17"でお手頃価格なWindowsなNoteが他に無くてね 
 HPとかDELLだと2.5kgとか 
  >>788-789     ありがとうございます。    
>>789     使い勝手がいいとかそういうことはないですか? 
  当時は無かったな。 
 ヘッダーファイルについて質問なのです。 
 ヘッダファイルの中じゃなくostreamを使っている翻訳単位(cppファイル)の中で最低1回include iostreamされてればOK 
 >>792   他のヘッダファイルで include してて間接的に読み込んでいることになってるってのが、一番ありそうかなぁ。 
  >>793     ありがとうございました。   
 ↓のファイルをビルドするとエラーが出るのですが、何が原因かよく分かりません。 
 フレンド関数関連だと思います。フレンド関数については全く知らないので、真似して 
 作っただけです。   
 Vec.h  
http://codepad.org/3ROYH1yq     Vec.cpp  
http://codepad.org/f3eSheBS    >>794     ありがとうございました。   
 もしかしてヘッダーファイルのみをビルドしてもオブジェクトファイルはできないんですか? 
  >>795     ある本に書いてあるコードでは、 Vec.h と Vec.cpp のようには分かれていないため、 
 自分で分けたのですが、エラーになってしまいました。 
  定義があればヘッダだけでもオブジェクトファイルに実装はできますよ。 
 >>798     Vec.h  
http://codepad.org/3ROYH1yq     上のVec.hの最初の方の   
 #include <iostream> 
 #include <cassert>   
 削除してもビルドエラーが出ません。 
 プロジェクトにはVec.hしかない状態でビルドしました。 
  >>799   テンプレートのエラーはテンプレートが実体化するときに出ると思うよ。 
 だから、テンプレートを使ってないなら、エラーがあってもコンパイル自体は出来たりする。 
  >>800   ありがとうございました。   
 あともう一つ質問なのですが、ロベールの本に、   
 「関数を実体化するには呼び出したところからその実装が見える必要があります。」   
 「つまり、関数テンプレートは宣言と実装をヘッダファイルとソースファイルに分離して 
 書くことはできず、すべてヘッダファイルで実装する必要があるのです。」   
 と書いてあります。   
 クラステンプレートについては同様の記述がないのですが、   
 クラステンプレートについても宣言と実装をヘッダファイルとソースファイルに分離して 
 書くことはできず、すべてヘッダファイルで実装する必要がありますか? 
  >>801   Yes。 テンプレートはヘッダファイルに書く必要がある。 
 同じ実体 (テンプレート引数も同じなテンプレート) はリンク時に統合されるので、 
 最終的な実行ファイルに複数の実体があったりはしない。 
  >>802     ありがとうございました。   
 ちょっと理解できないと思うので、あきらめて    
http://codepad.org/ABfo8I3a     としたところビルドできました。   
 ありがとうございました。 
  ヘッダファイルについて質問です。 
 >>806   すでにインクルードされているかどうかは書いているときにはわからない、から書いとく   
 ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから 
 ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った   
 しかしテンプレート関数に assert() が入る場合があるのだから、こういったこともあり得るのかもしれないが、まだ私は体験していない… 
  >>807     ありがとうございます。   
 >ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから 
 >ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った   
 ここのところがよく理解できないのですが、   
 List.h にテンプレートクラス List<T> が書いてあって、 
 List2.h には List<T> を継承したクラス List2<T> が書いてあります。   
 そして、List.h, List2.h の両方で assert() を使っています。 
  >>808   うんうん、なるほど 
 テンプレートに assert() が含まれているのならば、ヘッダに #include <cassert> が入るのも止むを得ないです 
  >>809     ありがとうございました。   
 また質問で申し訳ないのですが、今度は、全く違う質問になります。   
 一方向リスト用のセルである 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> に対しても使えるメンバ関数はそのまま使い、双方向リストにしたことにより、より効率的に実装できる 
 メンバ関数については、オーバーライドしたいです。   
 上記のようなことをどうやって実現したらよいのか分からないのですが、可能でしょうか? 
 可能だとして、こういうやり方は非推奨でしょうか? 
  一方向・双方向リストの、ソースコードを見た方が速い 
 再利用など考えず 
 >>810   一方向リストと双方向リストでどれ程共通的な処理があるのか知らんけどCellBase<T>に共通的な処理を定義してそれからCell<T>とCell2<T>を継承させるのが普通じゃね? 
  どうだろう。 
 >>812   もともと何か一方向リストがあって、継承して機能追加をして双方向リストに仕立て上げる 
 これはダメなん?継承は機能追加ダメなん? 
  >>811     ありがとうございました。    
>>812     本を見ると再利用が重要と強調されているので、拘ってしまいました。 
 ありがとうございました。    
>>813     ありがとうございました。 
  >>815   >>812 はだいぶイカれてるから触らないで 
  >>810   単方向リストから双方向リストを派生させると、内部構造が違うから相違を埋めるのに面倒臭い事になる 
 派生した双方向リストから単方向リスト内部のノード列にアクセスできたとしても 
 単方向リストの状態は単方向でノードが繋がっているのだから双方向リストからどうこうはできない 
 結局の所、双方向用のノードを単方向用ノードにアップキャストしないと格納できないし、取り出すにはダウンキャストしないといけない 
 もし何とかして単方向リストに双方向用のノードを双方向に数珠繋ぎ出来たら、そのリストはもう双方向リストだよ 
 あと、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などのアダプタだよね 
  自分の勉強用だったら、継承した双方向リストクラス作ってみて 
 キーワード「継承」もずいぶんと評価が落ちたものですねえ… 
 C++ からクラスが無くなることは無いだろうが、 
 ま、そういうことです 
 この場合、どうしても手抜きしたかったら 
 >>824   >余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし 
 std::forward_list など無かった 
  >>824   いやあ、単方向リストはそれはそれで使い道はあると思うよ 
 大体、キャッシュに載り易くメモリ効率も良い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系で十分な気もする 
  言葉が足りなくて申し訳ない 
 単方向リストを継承して双方向リストを作ることは無いと思うけど、コンポジットすることはあると思う。 
 STLのコンテナにstd::unique_ptr突っ込むと、カスタムアロケーター使えないよな? 
 >>826   O(1)で10個挿入したら、O(1)*10なんだから、結局O(N)じゃないの? 
  もしかして、std::unique_ptrを突っ込むのがすでに間違いで、std::anyを使えってことなんだろうか。 
 >>827   std::forward_listとそのイテレータだけでFIFOのQueueを実装できたりするよ 
 イテレータを介したinsert_after()になるから要素を入れるコストはイテレータのコピー分、std::queueよりも高くなると思うけど 
 std::queueはstd::dequeかstd::listを利用するから、std::forward_listで実装した方がメモリ使用量は少ない 
 単方向リストを使用して独自実装した方が低コストに抑えられると思うけどね   
 まあ、再利用も良し悪しって事だね 
  >>830   ごめん書き方が悪かった、1つの要素の挿入にO(1)って意味ね 
 Linked Listは、挿入場所への移動にO(n)かかり、挿入にO(1)かかるから 
 最後の要素を指し示すイテレータを保持してたらpush_back()みたいなことも出来るよって話ね 
  std::array の empty()メソッドって意味があるのか?と最近思ったので質問させてください 
 >>834   テンプレートを使って異なる種類のコンテナに共通に使える処理を書くときに、他のコンテナ達と共通の関数を備えていると都合がいいからかなと思う。 
  >>834   そのメンバの存在意味の有無に関わらず、コンテナ要件の1つだからね 
 他のオブジェクト指向言語でのインターフェイスや抽象クラスを用意していないだけで 
 コンテナとして共通の要件(インターフェイス)が設けられている 
 例えば、size()、empty()、begin()、end()など   
 本来、動的なポリモーフィズムをするためにインターフェイスや抽象クラスを設けるけど 
 vtableは高コストだから、ゼロオーバーヘッドの原則に則り使用していないのよ 
 まあ、コンテナ自体STLの1つだからオブジェクト指向的な機能は意識していなかったと思うけどね 
 余談だが、聞いた所によるとテンプレートって最初マクロで実現しようとしてたらしいね 
  具体的にコンテナに求められる要求はここでまとめられているので参考になれば。 
 http://ja.cppreference.com/w/cpp/concept/Container     クラスに求める要求を表現するための機能「コンセプト」は C++ の悲願としてずっと前から温められているのだけれど、 
 なかなか仕様に入らずに先送りされてるという状況。 
 ファイルから読み込んだバイト列の先頭部分を参照して、 
 画像ファイルには、過去にいくつか脆弱性が確認されている。使用において、脆弱性の存在が致命的ならば、きちんとチェックすべきだし、 
 すいません、十分というのは、ファイルの破損や脆弱性関連は置いておいて、 
 3バイトをランダムなデータと比較する場合、1/16777216の確率で誤認する 
 >>841   POSIX には file コマンドがあってファイルの種類を判定できるけど、その実装はヒューリスティックだよ。 
 参考になるとは思うから読んでみるのもいいんじゃない? 
 ライセンス的に OK ならそのまま流用してもいいかも。   
 どの程度の精度で判定すべきかは状況によるので総合的に考えてとしか言えない。 
 例えば、 jpg ではないファイルが多数ある中から jpg を探すというような状況だったら、 
 先頭をちょっとだけ読んで jpg っぽかったら全部を読んで詳細に判定するというのでもいい。   
 ほとんどが jpg なのだったら、いちいち詳細に判定するのは速度的に遅くなるけど、それが許容できるのか、 
 許容できないのであればどの程度まで緩い判定にしていいのか、バランスの問題。 
  >>845   速度とかとのバランスだって書いてあるつもりだけど、わかり難かった? 
  明らかに一致しない時は瞬時に判断出来る 
 はちみつはJPGを扱ったことが無いってのがよく分かる 
 >>847   えっ? だからまずは先頭をちょっとだけ読んでみる (この判定だと false positive はあっても false negative はない) という話なんだけど。 
  元の 
>>838  の質問に戻れば「どんなファイル群を扱うのかによる」としか 
 言いようがないんじゃないか?   
 極端な話、行儀の良いファイルだけなら拡張子で判定しても大丈夫。 
 (拡張子が間違ってるけど)一般的なファイルばかりなら先頭の何バイトかで判定。   
 悪意を持って偽装ヘッダや追加情報エリアまで利用してる可能性を気にすれば 
 JPEGの規格に準拠してるファイルでさえ危険、というレベルまであるかも。 
 JFIF以下のJPEG出す機材って監視カメラ以外見たことないなぁ 
 ポインタでないなら、継承した関数を呼び出すときに、仮想テーブル参照による動的オーバーヘッドはないのですよね? 
 >>853   Yes   
 それが仮想関数であろうとも、 
 オブジェクトへのアクセスがポインタ経由でないならば 
 どの関数を呼び出すのかコンパイル時に確定可能なので、 
 仮想関数テーブルにアクセスする必要はない。   
 (はずだと思うが言語仕様での保証はないだろうし、 
 実態がどうなってるか確かめたことはないんで、 
 誰かやってみてくれんかな。) 
  >>849   ファイル判別の一般論じゃなくてjpgの判別ですよ 
 jpgの判別方法を語ればいいんです   
 文字コードと違ってあやしいとかはなくて 
 APPnの中数バイト見れば簡単にわかるんですよ 
 文字でJFIFとかExifとか書いてあるわけなんで   
 偽装が無いならこれで十分   
 あとは 
 対応フォーマットであるのか 
 正しいフォーマットであるのか 
 実際にデコード出来るのかどうか 
 などを判別する必要があるかどうかでその先が決まる 
  >>855   何言ってんの? 
 その偽装があるかもしれん (ということも想定に入れるかどうは場合による) という話なんだけど。 
  >>859   なるほど、偽装に騙されるのは脆弱性の内 (で、それはないという前提が提示された) という解釈?   
 判定を誤りうる (データを作れる) のとセキュリティ的な欠陥をなんとなく区別してたけど、 
 質問者の感じからすると、確かに偽装で騙されるのは脆弱性の内かな。 
  >>855   JPEGの規格書を読んだ事が無いだろう 
  昔ゲーム機のハックで偽装した画像ファイルを読み込ませるってのがあったような気がする。 
 >>838  >>841  を合わせた質問の意図からすると、 
 JPEG以外で先頭3byteが {0xFF, 0xD8, 0xFF} のファイル形式が存在するか、 
 普通に出回ってるか? という問題じゃないのかな。 
  テンポラリオブジェクトについて質問です。 
 ・テンポラリオブジェクト = n のコピー 
 みなさんありがとうございます。 
 話が難しい方向に進んでしまってすいません。 
 勉強させていただきます。   
 元々の疑問は
>>863 の言われるとおりで、 
 他の形式の画像をJPEGだと誤判定してしまわないか、 
 さらに言うと、先頭が{0xFF, 0xD8, 0xFF}以外のJPEGファイルも存在していて、 
 JPEGファイルを見逃してしまうことがあるのか、ということでした。 
 >>865-866   そういう時こそ右辺値参照ですよ   
 hoge = std::move(Two());   
 でもこんな事をしなくても大抵戻り値最適化(RVOやNRVO)でコピーコンストラクタは呼び出されない 
 明示的にムーブコンストラクタを無効にするとコンパイルエラーが発生するはず   
 Hoge(Hoge&&) = delete; 
  そしてこの場合代入演算子をオーバーロードしてやるとそちらが使われる 
 (最適化をおいとくと)値渡し/値返しってそういうもんじゃん 
 まあ2回コピーされるのを1回に抑えるための最適化でしょう 
 確実なのは戻り値じゃなくて参照、もしくはポインタにすること 
 >>872   それヤバくね?関数を抜けた途端消える存在を参照するとか 
  呼び出し元から参照を渡してそこに返してもらえってことじゃなくて? 
 -Wreturn-local-addr みたいなwarningじゃなくて規格でエラーにすれば873みたいな勘違いは無くなるのにな 
 普段c#使っているのですが、c++/cliでデータベース絡みのdllを作ってて、わからないことがあります。 
 >>877   IDisposable使ってる? 
 スコープ抜けてもGCによって回収されるタイミングは保証できない 
 どうしてもすぐにGCしたいなら   
 GC.Collect();   
 をする。   
 多分ジェネレーション0だろうから   
 GC.Collect(0);   
 でいいのでは 
  >>878   レスをござます。 
 作ってるクラスがIDisposableを継承しないとダメってことですか? 
 作ってるのはインスタンス作らなくてもいいstaticクラスなんですけど。   
 GCは効果の程を確認できないですが、やってみます。 
  >>879   https://qiita.com/haniwo820/items/ba0ab725c25673c20338   こんなのとか   
 staticクラスだとファイナライザーを書けないから内部で他のクラスをnewした場合が問題 
 それとメンバ変数もstaticでなければならない 
 となると普通はアプリケーションが破棄されるまで残る   
 IDisposableをstaticクラスが継承するとエラーになる 
 というかstaticクラスはインターフェイスを継承できない 
 むしろusingを使えない理由が分からない    
http://ufcpp.net/study/csharp/oo_dispose.html     こういうのだとstaticクラス風にファイナライザーを走らせられる   
 それかStreamみたいのでClose()したいのならClose()メソッドを書けばいい 
 SqlConnectionやDataSetはいちいちClose()する必要があるのかな? 
  >>879  です。 
 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抜きで問題ないのでしょうか?    
>>882   まさにこれを読みました。c#のusingがc++にはない認識です。 
 この理由がこの通りならDisposeなしで心配ないのですが。 
  >>882 によると、自動でDisposeさせたい場合は以下のようにする、 
 と書いてあるように見える。(手元に環境がないので未確認)   
 SqlConnection connection(constr); 
 connection.Open(); 
 connection.Close(); 
  >>883   そのコードでconnection->Dispose();を消すだけだとDisposeは呼ばれない。 
 C++/CLIでDisposeを呼びたい場合「delete connection;」と書く。 
 C#のusing相当のことをしたい場合は
>>885   詳細は↓を参照。  
https://loafer.jp/mixi/diary/class.xsp?2007-09-07-23-55    Dispose の件で質問してた者です。 
 みなさん、いろいろありがとうございました。 
 参考にさせていただきます。   
 ところで、   
 Cとアセンブリ言語で学ぶ計算機プログラミングの基礎概念 - プログラムはプロセッサ上でどのように実行されるのか  
 角川 裕次   
https://www.amazon.co.jp/dp/4627848315/     この本を読んだ人はいますか?   
 かなり自分にとって理想的な本のようですので、買ってみようと思います。 
 こういう本を読めば、少しは言語の設計者の気持ちが分かるようになるのではないかと期待します。 
 あちらこちらでC++はひどい言語だって叩かれてるけどその割に広く使われている 
 C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために 
 抽象化とコード(バイナリ)の質は相反するものだから 
 alignas(32)とかalignas(64)とかつけなくても大体アライメント揃ってる気がするんですけどつけた方がいいんですか? 
 >>893   linus は昔から C++ を批判していたが、git 開発に関する 2009 年のこれが、最も効果的な批判になっていますね 
 これを読むと C++er は一瞬自分がわからなくなりゲシュタルト崩壊に陥りますね、もう c++11 over を追いかける気力も失せてしまいました… 
  抽象的な思考ができる人とそうでない人が居るというだけだな 
 >>890 もSTLやboostの使い方が理解できない、良い抽象モデルが作れない人が愚痴ってるだけにしか読めんが 
 抽象化が目的になって 
 >>895   >良い抽象モデル 
 が役に立つとは限らないのでは? 
 抽象化を目的とするあまりに YAGNI を忘れてしまうのでは、これは重大な思考的欠陥なのでは? 
 あれほどもてはやされていた GoF は、すくなくとも C++界では、もうみるかげもなく凋落の一途をたどっているのは、どうみるのでしょうか? 
  デザインパターンって廃れたんですか? 
 >>898   デザインパターンってのは典型的なパターン (に名前を付けたもの) ってだけだよ。 
 基礎として押さえておくと便利だし、価値が失われたわけではないけど、 
 何もかもが既存のパターンに当てはまるわけではないという当たり前の話。 
  >>897   抽象化とYAGNIは関係ありません 
 こういう意見が出てくるあたりが良いモデリングを理解してない証拠ですね 
  >>898   別に廃れたわけではなく、使われるものは当たり前に使われてて取り立てて言われなくなっただけ。 
  >>901   たとえば、iostream をどう思う?これは良い抽象化の例ですか? 
  Visual C++6.0です。 Windows7でやってます。 
 >>905   CToolbarには、DrawItemがないようなのですが 
 ステータスバーにはあります 
  ツールバーに色を付けることもできないとか。ちょっと貧弱ですよね 
 2分探索木を実装したC++プログラムを読んでいますが、分からないところに出くわしました。 
 >>899   >>900   >>902     ありがとうございました。   
 一時は、もてはやされすぎたということですね。 
  insert 内に、 
 insert 内に、 
 >>909   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; 
 } 
  >>914     ありがとうございました。   
 3のままですね。 
  >>909   これは C の課題ですね。 
 適当な二分木ないし二分探索木に対して、ノード(節)を追加したり削除したりする関数を書く場合、 
 C ならば add_node(node **root, ...) と書きます。@ 
 これを C++ ならば add_node(node *&root, ...) と書くこともあります。node *&root は「ポインタ変数の参照」です。A 
 @とAとではプログラムの表現もかわります。   
 これは一度、白紙の状態から自分の手で書くのが、理解するのに一番です。お試しあれ。 
  0,115200 
 A/9600 を添え字にして13個の配列で逆引き作る? 
 9600の倍数であることがわかってるなら割ればテーブルは減る 
 検索については同意 
 a1 : b1 
 >>920 は
>>919 を見る前に書いた 
 たまたま同じ発想になっただけ   
 浮動小数数に直すってのもある 
 LSB側から数えて1になるビット位置を返す命令があるのでそれとシフトを使う 
 115200は(900, 7) 
 38400は(300, 7) 
 19200は(300, 6) 
 9600は(300, 5)   
 RS-232Cだと300x2^nと900x2^nしか普通は使わないから   
 オーディオのサンプリング周波数にも同じような方法が使える 
  n = (x/9600 > 4) ? 0 : 3 - log2f(x/9600); 
 >>924   メモリアクセス速度を考えても
>>918 の方が速くて簡単    
>>923   なんかおかしかった   
 115200は(225, 9) 
 38400は(75, 9) 
 19200は(75, 8) 
 9600は(75, 7)   
 ビットスキャン命令とシフトとテーブル 
 変換しなきゃならないデータが多量にあって 
 パフォーマンスが非常に重要ならこれを使うかな 
  普通、最適化でも、8個までは線形(全)探索・if 文 
 >>927   ただのテーブル逆変換だぞ 
 なんでジャンプテーブル? 
 なんでswitch case?   
 リニア検索で問題なら2分検索 
 それでも遅ければハッシュその他のテーブル 
 簡単な演算を併用出来るものはする 
 じゃないか普通 
  コンパイラの最適化について書いた 
 class clsAにconst member 変数を登録したいのだけどうまくいかない。 
 //そもそもC++は文字列の配列を扱うことができるのか? 
 constexpr string[] str1 = {"abc", "def"}; コンパイルエラー 
 string str1 = "abc"; //OK 
 自分としてはストリングを多用するのでストリング配列が使えないと厳しい。 
 文字配列って良く分からないけど、Javaみたいに一文字だったりして? 
 >>932   定数式じゃないから。    
>>933   string は constexpr に非対応のはず。 現時点では。 
 new が constexpr 的に扱いが難しいので、 
 内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。 
 ただ、制限を緩和する提案は出ているので将来的にはなんとかなるかもしれない。    
>>934   string に一文字づつ入れたいってこと? 
 std::vector<std::string> str2 = {"a", "a", "a"}; 
 でいけるよ。 
  >>934   >vector<string> str2("aaa",4); //error 
 「vector<string> str2(4,"aaa");」の誤りじゃね? 
  string str1 = "abc"; //OK 
 //C++はchar *[]のコンストラクタでの初期化はできるのか? 
 >内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。  
 >>サイズ不明だし無理だろ 
 //C++はchar *[]のコンストラクタでの初期化はできるのか? 
 すまん、そっちはエラーメッセージじゃ分からん。 
 string関数の第二引数には何の意味がありますか? 
 試しに文字列を2つ引数に入れても、第一引数しか出力しないみたいですが 
 ↓です   
 string readFile(const char *filename) 
 { 
         ifstream ifs(filename); 
         return string(istreambuf_iterator<char>(ifs), 
                       istreambuf_iterator<char>()); 
 }    
https://www.miraclelinux.com/tech-blog/1n4hgx   >>947     string str2[] = {"abc", "def"}; //okでした。   
 constexpr 文字列は諦めました。多分相当難しい。 
 でおもうのだが、結局は普通の人は誰もconst char *配列の初期化について解らない。 
 というか、ファーム開発にC++を使う場合には文字列の配列はかなり重要でしかも 
 Ramが少ないのでこれをRom配置できないと致命的だ。ということでファーム開発 
 ではconst char *mes[] = {"zzz","aaa"}; こういう処理が必要になる。 
 しかしファーム開発をやらない人にとってはconstである理由はないので、この重要さ 
 には無関心なのだろう。   
 もちろん分かる人もいるが教えるのは恐ろしくめんどくさいか、非常に苦労して 
 マスターしたので簡単には教えたくない。 
 それほどC++において const char *配列 のクラスでの初期化は難しいのだろうと思う。   
 いやそもそもできないのかもしれないが、、、(そんなはずはないだろう)。しかし 
 できないとすると、クラス内で初期化するのは諦めてCで初期化してるのだろうか? 
 多くのファーム開発者は諦めてCで初期化してるのだろうな。 
  配列の初期化の時には()いらないぞ{}だけ 
 >>941 の最後の行の()はずせば通るけどたぶん環境依存じゃないかな 
 意図してる動作がname使ってm_nameの初期化ならめんどくさそう 
 あれコンパイル通るけど未指定だと動的確保してplacement newでもしないとだめかなこれ 
 class clsA 
 class a 
 C++にはサイズ不定の配列は無いからサイズ指定しないと無理だよ 
 //C++はchar *[]のコンストラクタでの初期化はできるのか? 
 //C++はchar *[]のコンストラクタでの初期化はできるのか? 
 それconst つけるの忘れてたが、つけた場合もエラー表示は同じだね。 
 あなたの使っているコンパイラは、おそらくC++11未対応です。 
 >>960   あっ、そうなの? ごめん、それはうっかりしていた。今年の2月にインストール 
 した最近のコンパイラなので当然C++11以上だとおもっていた。 
 一寸調べてみる。 
  >>961   対応していてもデフォルトでは C++11 の挙動にならない (オプション指定すると対応する) ようなものも有りうる。 
  >>962   おお、ありがとう。全然気が付かなかった。これは一つ前のバージョンでプロパティを 
 みてもC11++がない。 
 最新のバージョンはC++14をサポートしてるみたいなのでUPDATEしてみる。 
  勘違いしてたらすまないけど↓みたいな事がしたいの? 
 https://ideone.com/Zm8LO5   >>964   凄い!!。まさにそれです。こちらでもコンパイル通りました。 
 難しいなー。 
 もうコンストラクタでの初期化はすっかり諦めて代替案を作っていたところだけ 
 ど、それを丁重に拝借いたします。ありがとう。 
  >>966   もらい受けたいところだけども、意味が理解できるかどうか? あなたは意味が 
 わかりますか? 
  clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {};   
 (const char* const []){"mike","tetu",nullptr} 
 これは何を意味してるの? 
  「c++ constexpr 文字列」で検索すれば? 
 void func1(int a) { printf("%d\n", a); } 
 class class1 { 
 const char *[]の初期化だけれども 
 わかった。コンストラクタに引数がないディフォールトでは 
 class clsA{ 
 >>964 のソースをclangでビルドしたら最初の結果が文字化けする。 
 環境依存で動作が変わるようなソースコードを参考にしてはいけない。 
  >>969   template<class ... args> 
 class clsTest { 
 public: 
  void func1(int dt) {} 
  void func1(int dt1, int dt2) {} 
  void func2(args...) {    
  } 
 }; 
 int main() 
 { 
  clsTest<int, int, int> a; 
  clsTest<int, int, char *> b;   
  a.func2(2, 3, 4); 
  b.func2(5, 6, (char *)"test");   
  a.func1(2); 
  a.func1(2, 3);   
     return 0; 
 } 
  c++です 
 自動でリンクしてるライブラリと明示的にリンカに渡してるパス違いの同じライブラリで衝突してんんじゃないの? 
 検索してみたのですが 
 もしかしたら関係あるのかもしれないので参考までに記述します 
 >>981   そういう場合は、経緯を説明するのが、考えようとしてくれた人への礼儀。 
  ロベールのC++の本の typedef の説明ですが、よく分かりません。 
 const IntPtr = const int* 
 const IntPtr p = &n; 
 >>985   の論法を↓に適用すれば、   
 const の右にあるのは p や q なので、 p や q が const になるのです。   
 となってしまいますが、 p は const ではないですよね。 
 q は const ですが。   
 const int* p; 
 int* const q; 
  >>983   マクロで IntPtr を int * と定義した場合は 
>>984  のように展開されるけど 
 typedef はマクロじゃないので int * 型のシノニムとして IntPtr 型を作る 
 const int と int const もどちらも const の int であるのと同じように 
 int を IntPtr 型に置き換えて考えれば どちらも int * const と同じ意味になると思うよ 
  i.csvには1行に名前と整数値で点数3つ書かれているのが10行あり、読み込んで点数の和を加えて表示しようとしましたが和が出てきません。また¥nを打っているのに改行されないです。理由を教えてください。配列にしたのはこの後にも操作をするためです。 
 Windows10で、デスクトップのアイコンと壁紙の間のレイヤーに描画したいです。 
 何がしたいかというと、カレンダーを表示させたいです。 
 小出しですみません。カレンダー機能はMFCで作成済みです。 
   ∧,,,∧   
ID:OwhHF7Zmのレス一覧:  単純な整数型のインクリメントなら前置も後置もさが無いだろうけど、C++ではユーザー定義のクラスでインクリメントを実装できるから、 
 結果が使われないことが明らかな場合には後インクリメントのかわりに前インクリメントを呼び出すとかいったことをしても 
 まぁ、出来るなら既にやってるでしょ 
 そもそも速度を気にして 
 機能に対して糞重いソフトが多いのも 
 >>318   速度を気にするというのもあるけど、意味的にも無意味な処理をするってのがダサいだろ? 
  >>321   お前のコードは無駄ばかり 
 コンパイラも無駄命令を吐く 
 そもそもCPUの動作自体が無駄ばかり 
 そのプログラムを作るのも無駄だったり   
 お前の存在は? 
  手間が変わらず、かつデメリットもないのにその選択肢を取らない理由がなくない? 
 効率を言い出すと値を返さないインクリメント、デクリメントが標準で欲しくなる 
 ホントは最適化でだいぶん上手いことやってくれるんやけどな。 
 イテレータの++や―に戻り値があること自体設計ミス 
 アセンブラの inc やdec 命令実行時のフラグ反映は不要? 
 >>329   逆じゃないかなぁ。 
 ポインタをイテレータとしても使えるように一貫性を持たせたら結果的にそうなったって感じじゃないの。 
 どちらにしても、そこで無理に一貫性を持たせようとしてしまったことが良くなかったとは思うけど。 
 ちなみに operator++ の返却値を void にすることは出来ます。 
  >>330   inc/dec でフラグが変化しないアーキがあった、というか、それが普通だと思っていたんだが 
  なぜポストインクリメントがよく使われるかは、 
 Linuxさあ、Ubuntuとか使ってるんだけど、俺はプログラムやネット以外にあまり 
 >>336   ググればすぐにわかることだけど、有るよ。 
  unordered_setやunordered_mapは 
 void DumpCode(const char* str) { 
 char型の値は 0 から 127 までであると本に書いてあるのですが。。。 
 >>343   その本は窓から投げ捨てろ。 
 ー128〜127が正解だ 
  >>344     本にはそうは書かれていませんでした。申し訳ありません。間違っていました。   
 アスキー文字コードは、0から127までの値しか取らないからOKかなと思ってしまったのですが。 
  >>344     何か不具合が起こる例を教えていただけると助かります。 
  >>346   char ch = 255; 
 printf("%d\n", ch);   
 C/C++では、オーバーフローは警告なく普通に起こる。 
  signedな整数型は、最上位ビットが符号フラグになるんだ。charは8ビットの整数型で、printfに渡す過程で、符号付きのint型になる。まあ、やってみたらわかるけど、 
 printf("%d\n", (char)255); 
 charのビット数、CHAR_BITが8ではない環境はほとんどない。 
 4ビットCPUで動作するトースターのコンピューターの話でもするつもりかね。 
 ほとんど無いから何? 
 charが符号付きとも決まってない 
 char と signed char を混同するクソコテ 
 今後char関連の質問をするときは、charのビット数や符号などの環境を明示しましょうということで。 
 unsigned char がデフォなんてMS-C 3.x or 4.xの /J オプション付き 
 >>359   >>341 の質問に対してcharの符号有無が環境によって異なるというのは本質的な回答であり、ビット数の話は不適切だったというだけで、重箱の隅がどうこうという話では無いだろう。 
 そもそも初心者歓迎のスレで初心者を除外する要件を設けるのは本末転倒では? 
  ??? 
 環境を明示しろって言うのは
>>1 にも書いてあるんだが... 
 >>361   初心者だろうと質問に付随する前提知識は必要 
 変数知らんデータ型知らん制御文も分からないじゃ説明しようがない事なんていくらでもある   
 まずそこら辺の知識を理解してもらわん事には説明できないですってのは初心者を除外とは言わんだろう 
  4ビットCPUだとcharは4ビットと思ってんのか? 
 >>341  >>346   不都合と言う程の不都合か分からないけど、 
 単なる 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) のキャストをしない方が好ましい、て考え方もある。      
>>360   ARM で GCC だと、単なる char は unsigined が普通みたい。 
 元のCPU設計で符号付8bitが拡張機能だったことと関係あるとかないとか。 
  4bitのcharか、アルファベットが表現できないな 
 int *p = new int[100]; 
 >>366   つ -fsigned-char/-funsigned-char 
  スタックオーバーフローが起こった時に、すぐにエラーが起こらない可能性がある 
 >>368   良くある実装としては 
 newが返すアドレスの前にヘッダ情報がある 
  素人考えだと並のOS環境ではスタックオーバーフローは自動伸長に失敗してアドレスを割り当てられない時に起こると思うから直ぐにエラー終了しそう 
 配列への添え字アクセスの計算量はO(1)の定数時間とのことですが、これは通常の変数へのアクセスと同じということでしょうか? 
 添字の値にかかわらず一定 
 >>375   ありがとうございます 
 だとすると、同じ添え字に何度もアクセス(読み取りのみ)する場合、一旦変数に待避させてその変数を参照した方がいいですかね? 
  レッツ実測&吐き出したコードを確認 
 >>377     吐き出したコードってどうやって確認するんですか? 
  >>371-372     ありがとうございました。 
 そのあたりのことを詳しく書いてある本はありますか? 
  >>377   確かにそうですね 
 ありがとうございます、やってみます 
  >>378   使っている環境による 
 機械語一歩前のアセンブラも出力するオプションで出てきたアセンブラとデータシートから推定する   
 もっと前のアルゴリズムの検討は済んでて、 
 もはや、枝葉を削ってでも速度を出さなきゃいけないという最終段階の話だよね? 
  >>343-344     char 型が符号付きであってもなくても格納可能な範囲という意味では 0 〜 127 であると思って使ってれば間違いないのは確か。 
 あと、厳密にはマイナスの表現に 1 の補数を使ってる環境は有りうるので 
 char が符号付きだとしても -127 〜 127 しか表現できないかもしれない。    
>>345     言語仕様では文字がアスキーコードとは保証してないんだ。 
 ほとんどの環境ではアスキーコードかそれと互換な文字コードだろうけど、 
 EBCDIC とかでも言語仕様には違反しない。 
  >>373   並のOS環境って何だよwww   
 一般的なMCUのほとんどは 
 アドレス変換テーブルの仕組みがなく 
 スタックオーバーフローを検出するハード的仕組みも無い 
  二つスレッドがある 
 >>379   stackoverflow で、たまたまアクセスしたメモリに、 
 どんな値が入っているかは、誰にも分からない。 
 単に前に入っていた値が、入っているだけだから   
 その値が、たまたまCPU 命令にあれば、CPU を実行するから、 
 エラーになるのは次の命令以降になる   
 一方、CPU命令に無ければ、不正な命令となり、即座にエラーとなる 
  スタックのメモリ領域がこの範囲からこの範囲というように管理はしていないのですか? 
 >>387   昔汎用メッセージポンプを検討したときのサーベイにstd::condition_variableと書いてある。 
 注意としてspurious wakeupというのも書いてある。 
 もうすっかり忘れてしまって何のことだか自分でも思い出せないのだが、「条件変数」というのがキーワードになるようだ。 
  >>389   ページ単位ではしていることがある。 
 OS がメモリの割付を管理していて、 
 足りなければ追加で割り当てたりもする。 
 割り付けてないメモリ空間に変に触ったら検出できる。 
  >>389   スタックエリアの管理は当然してる 
 オーバーランの監視は環境次第   
 ハード的に仕組みがあるものもあし 
 ソフトで(コストをかけて)やる場合もあるし 
 全くしない環境もある 
  今のWindowsとかLinuxとかならもちろん瞬時にわかる 
 最近のC++ってかなり進化していてTaskとかLinqなんかもできるんだろ? PCだとC#があるから 
 組み込みなら自分で書いたものだけ使うというか 
 new/delete 
 組み込みってピンキリだからなんとも言えんわ 
 STLってC#のLinq並みに表現力があるんだろうか? Linqは最初嫌いだったが使い始めて 
 内部で new / delete 使用している stl は使わないリストに入れず 
 STLコンテナとSTLアルゴリズム 
 コンテナ使わない有用なアルゴリズムってあるか 
 >>403   内部でnew/deleteしてるものは当然含まれる 
 当たり前   
 そもそもヒープエリア自体無かったりするし 
 あってもアロケートのみで解放機能が無かったりする   
 小規模組み込みでメモリを確保出来ないなんてことは想定しないし 
 確保解放のコストもバカにならない 
 アドレス変換が無いから隙間だらけで連続領域が取れなくなるなんてことも心配したくない 
  ヘッダファイルを作るときに、2重インクルードを防止するための対策を書けと本に書いてあります。 
 >>410   人間の注意力なんてクソザコだからだよ。 
  >>410   複数のヘッダで共通のヘッダの定義が必要な場合を考えてみようか 
  header_1 👀  
 あなたはstdlib.hとstdio.hの作者です 
 >>416   入門書にこう書きます 
 「studio.h や stdlib.h をインクルードする際には、事前に errno.h をインクルードすること」   
 どうかなとは思うが実際こういう流儀でヘッダーファイル書く人も見かける 
  関数名にしろヘッダーにしろ6文字の縛りって何か歴史的理由があったのだろうか? 
 vfprintfは八文字。文字数削るメリットがあった時代だったからな。 
 >>423   FORTRAN77は識別子の長さが6文字以下とかの制限があったからそれに倣ったんじゃないかな 
  >>416-417   プリコンパイルヘッダが汚れたり無駄にでかくなったりするからな 
  以下のboost::factoryを使う練習用コードにおいて 
 https://wandbox.org/permlink/K1TIhC61VQztTbOd     map<string, boost::function<base* (int)>> factories; 
 とするとコンパイルエラーになり、ググって見つけた方法で 
 map<string, boost::function<base* (int const&)>> factories; 
 とすると何故かコンパイルが通り、問題なく動作します。 
 コンストラクタの引数が実際の int ではなぜ駄目なんでしょうか? 
 >>417   実装依存のヘッダファイルの場合とか、ユーザに事前にincludeしろとは言えないケースもあるよ 
  stackoverflow では boost::factory が引数の参照渡しを前提にしてるから、とあるな。 
 dxd9みたいにincludeすると可笑しくなるヘッダもあるしなーω 
 >>423-424   先頭6文字だけ見て一意に決まることが条件で、名前の長さ自体に制限はない、 
 じゃなかったかな。大文字小文字は同一視で。 
  _st とか _s とかごちゃごちゃ付き始めたころからつまらなくなった 
 >>433   公式ドキュメントにはさらりと「技術的理由によりfunction objectに渡す引数はlvalueでないと駄目」と書いてあるのみなので、さっぱり理解できませんでした。 
 そもそもコンストラクタbase (int const&)は定義していないのにコンパイルが通るのが不思議・・・   
 結局 boost::bind(boost::factory<derived*>(), _1); が何しているのか理解しないと先に進めなそうですね。 
  >>439   引数のある関数の場合はboost::bindを使うのではないでしょうか? 
 いちおう公式にもその例が書いてあります。   
 ちなみにどんぴしゃな質問がstackoverflowにあり、Answerには親切にDemoまで付けてくれてて、 
 速攻で解決したと糠喜びしたんですが見事にコンパイルエラーでした。  
https://stackoverflow.com/questions/37137117/passing-arguments-in-constructor-with-boost-factory    >>440   引数を部分的に何かにbindしたfunctionを作るのがbindなわけで、 
 (add(a,b) の a だけ1にbindしてadd1を作るとか) 
 何もbindせず引数の順序も同じなら   
  factories["derived"] = boost::factory<derived*>();    
 で良い 
  >>441   確かにbindのそもそもの目的はそれですよね>(add(a,b) の a だけ1にbindしてadd1を作るとか) 
 仰る通りの書き方でコンパイルも実行も通りました。 
 ただ、ググった限り引数のある場合はbindをかます例しか見つからなかったです。 
 「bindが必要」と明言してる人すらいて、結局よくわからないです・・・   
 その後、いくらコンパイルも実行も問題ないとはいえ実際のコンストラクタとは違うのを 
 boost::function<〜> に指定するのはなんとも気持ち悪く思い、試行錯誤したところ 
 boost::forward_adapter を使う方法を見つけました。  
https://wandbox.org/permlink/D3Q75cgRNR43Nulc     ヒントとなったのは以下のサイトでした。  
https://lists.boost.org/Archives/boost/2017/02/232695.php     正直なぜこれで通るのか完全には理解していませんが、とりあえずの解決とします。 
 ご助言どうもありがとうございました。 
  >>442   公式にドキュメントがあるだろう。 
 なんでググりまくるんだ? 
  >>443   公式ドキュメントはこれです。  
https://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の公式ドキュメントはこんなものというか、隅から隅まで説明しないわからない素人はお断りってやつですよね。 
  質問です. 
 std::string知ってるなら 
 可変の n, m が読み込む前に確定するのか 
 >>447   今回はstringを見て,nとmを決めます. 
 str="a"ならn=2,m=3のような感じです.  
>>448   読み込み方が分かりません.すいません. 
 Google先生に聞いてこんな感じのプログラムを書いてます. 
 std::string line; 
 std::ifstream infile("hoge.dat"); 
 std::getline(infile,line); 
 sscanf(line.data(),...//どう書くの? 
  void Show(const IntArray& array){ 
 const メンバ関数の中でメンバ変数の内容を変更しているとコンパイルエラーになります。 
 void Show(IntArray& const array) 
 >>449   コンパイル単位を越えたらチェックするのは難しいし言語の壁を越えたら不可能に近いから 
 中途半端な事をするくらいならconst明示されてるかという線引きの方が分かり易い 
  >>449   難しいというか不可能だからですよ 
 呼び出す関数はまだコンパイルされてないかもしれないしまだソースコードもないかもしれない 
  >>449   メンバ変数を変更しないなら素直にメンバ関数にconst付けれや 
  >>449-450  の質問者は、分割コンパイルにまだ慣れてないと思えるなぁ。 
 ソースファイルを分けてみればピンと来るかと。   
 片方をソースなしのオブジェクトやライブラリにしないとダメかな。 
  C#のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに 
 >>457   COM使えばできるけど、スレタイも読めないお前にできるかどうかはわからん 
  そんなことは当たり前ですね。その方法が説明できますか? 
 C#のことはC#のスレッドで尋ねればいいでしょ、てお話。 
 あ、ごめん。++が#に見えた。でも普通は++を#に書き間違ったんだろうと判断すると 
 ところでC++のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに  
 >>463   CreateProcess() win32API スレへgo 
  >>464   it is conditional on your ability, although its mean applying in the case of a usual Japanese. 
  main関数の中でstaticを使う意味は何でしょうか? 
 ロベールの本を持ってないんで、適切な回答じゃないかもしれんが。 
 >>472   ローカル変数に static 変数が付いていた場合は最初に通過したときに初期化されるルール。 
 (コンストラクタもそのときに走る。) 
 これは C のときから変わってないよ。 
  普通に考えると、 
 >>473   横からだけど訂正乙 
 初心者が読んで間違えて覚えるので、初心者スレでは嘘を書かないように特に気をつける必要ある 
  >>474   mainの中だから意味無い   
 っつーかstaticは二つの意味があって全然別物 
 スコープと性的と混ぜるな危険 
  >>474 は 
 関数内でstatic変数を使うのは静的変数のスコープを関数ローカルにしたいからでは、 
 というごく当たり前の文意だろ普通に読むと。   
 どう読むと 
 関数内だからファイルローカルの話とか関係ない!勘違いするな!となるんだよ 
 自分以外は文法もセマンティックもろくに知らないという前提はやめるべき 
  >>470   スコープはmaim( )内にしたいけどスタックは使いたくないってケースかな 
  >>470   ウェブ版をざっと探してみたら main 内で satatic 変数を使ってるのはこれだけだったんだけど、 
 これのことか?  
http://www7b.biglobe.ne.jp/ ~robe/cpphtml/html02/cpp02037.html 
  関数スコープのstaticなクラス・インスタンスのコンストラクタは 
 初期化が固定データのメモリコピーで済むものはロード時に初期化するコンパイラが普通 
 >>480     ありがとうございます。本とは内容が違うようです。   
 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};   
 … 
 }   
 というコードが該当箇所です。 
  staticを付けなければスタックに確保されるかもしれない。その場合、どうしても遅くなる。 
 >>485     でも、速さがどうとかいうことについては何も書いていないんです。 
 staticを付けていることについては何の説明もありません。 
  >>486   >>485 はきちんとした回答だと思うよ。 
 配列が大きくなれば顕著になる。 
 「その本に書かれていないから」と拒絶するのは憲法に基づいて自由だけど 
  定数だからstatic constにした 
 その変数をコンパイル時点で確定しようとしている。 
 >>487   だぶんだけど、 
>>486  が言おうとしているのは「
>>485  だとしたら入門書としては不親切だよね!」って話じゃねーの。 
  >>484   ROMとRAMに別れてる環境、 
 つまりほとんどの小規模な組み込み環境だと 
 static const は通常ROMに配置される 
 要するにRAMの節約   
 速度は逆にRAMの方が速いのが普通 
  クラスの定義をヘッダファイルに書くときに、 
 >>484     みなさん、ありがとうございました。 
 速度について気にしているのなら、ロベールにはそう書いてほしかったです。 
 例では、非常に小さな配列ですから速度について気にしていることは読み取りにくい 
 ように思います。    
>>488   定数だから const にしたというのなら分かるのですが、なぜstaticをつけるのでしょうか? 
  >>492     private なメンバはむしろ、クラスのメンバ関数を実装する .cpp ファイルに書いた方がいいように思います。 
  >>494   pimplイディオムで、クラス詳細を隠蔽できるよ。 
  >>493   あの部分では特別に速度を意識した記述ではなく普通に意識する程度の事だから一々説明されないということではないかな 
 速度や使用メモリを気にするのはCやC++プログラマの癖または習慣みたいなもので特にロベールみたいな昔の人は体に染み付いているだろうからね 
  >>493   今回はたまたまmainであり、 
 たまたま小さなデータだったというだけで、 
 より汎用性の高いコードにするのはプログラミングの基本   
 staticを付けるメリットは 
 ・データ構造の初期化が1回(ROMだと0回)で済む 
 ・スタックを浪費しない 
 ・関数を抜けてもデータが保持される 
 ・番地が固定   
 デメリットは 
 ・関数を通らなくても初期化される 
 ・関数外でもメモリを使う 
  一番重要なのは
>>491   PCプログラムしかやらない人は知らないだろうけど 
 test2の形だと上手く動作しないのですが何故でしょうか 
 引数を std::string &str, ... にすればなおる 
 引数を参照とポインタでも試してみましたが結果は変わらなかったです 
 va_start(args, cstr); 
 ああなんとなく意味が分かってきました 
 こういうコードにすると期待した動作をするようになりました 
 ついでに言うと va_start の第二引数については仕様上結構な制限、 
 va_listとC++は、相性が合わないんだよな。呼び出し側でc_str()するとか。 
 特に強い理由がなければ variadic template を使った方が安全だし簡単に書ける。 
 えー、可変長引数の例にしただけなので、そんなどうでもいいとこを言われても困るよ。 
 そう言うところにしか突っ込めない雑魚の相手するなよ... 
 >>511   なんでbufに一旦書いてるの? 
 直接printfじゃだめなん? 
  普通はね 
 va_start の第2引数の型の制限を知らなくてもor気にしなくても良いように 
 そもそも何でbufにって質問は 
 コメント元の
>>507 にすべきだろ 
 こんな辺境ですらイキリ散らすなんて呆れる他ありませんわ 
 危険てんこ盛りなコードの危険性が低い部分をなおしてどうすんの?アホなの? 
 c++ スレで variadic template 紹介されてこの反応 
 >>526   危険性が高いかどうかは重要じゃなくて、話題のテーマに近いかどうかだろ。 
 本題に関係ないところなんてどうでもいいじゃないの。 
  >>501 とvariadic templateは関係ないわけだが 
  const double const ARRAY[] = { 3, -1 }; 
 ポインタ変数なら 
 >>531   > const double const ARRAY[] = { 3, -1 }; 
 コンパイルエラーにならないんだっけ? 
  >>532     ありがとうございました。    
>>533     Visual Studioではコンパイルエラーになりません。 
  const double const a[]; 
 Win32のBOOL型を返す関数を複数回呼んで、  
レス:1-200  201-400  401-600  601-800  801-1000  ALL  
このスレへの固定リンク: http://5chb.net/r/tech/1509780815/ ヒント: http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ  TOPへ   
 
	  
全掲示板一覧  この掲示板へ  人気スレ  | 
	Youtube  動画  
	>50  
	>100  
	>200  
	>300  
	>500  
	>1000枚  
	新着画像 ↓「【初心者歓迎】C/C++室 Ver.102【環境依存OK】 	->画像>1枚 」 を見た人も見ています:・【悲報】PS4版ドラクエ11、カメラワークがポンコツ過ぎて酔う人が続出。3DS版に調整した為か、街中の視点移動がメチャクチャに。   PS4版ドラクエ11、カメラワークがバグレベルで視点移動もメチャクチャでプレイが苦痛なポンコツなゴミと判明。 	 【悲報】PS4版ドラクエ11、3DS版と比べてアイテムを拾うのが非常に遅い 	 【悲報】PS4版DQ11カメラワークが糞過ぎてメチャクチャ酔う【ゲロクエ】 	 【大失速】PS4版ドラクエ11、わずか2.2万本でイカ以下wwwwwwwwww 	 原神総合スレ Part544  【悲報】PS4版ドラクエ11、とうとうアマゾンランキング3位に落ちる 	 【悲報】PS4版ドラクエ11、30fpsで確定 	 PS4版ドラクエ11の戦闘はオートカメラアングルを初期設定してほしい 	 駄目だ…PS4版ドラクエ11のカメラがすごい酔う… 	 【悲報】ドラクエ11、3DS版とPS4版の差がとんでもないことになる 	 【悲報】PS4版ドラクエ11、フレームレートガックガクwwwwwwwww 	 【悲報】PS4版ドラクエ11、新しいエリアに進むだけで数十分間待たされる!  【悲報】PS4版ドラクエ11、後から予約開始したスプラトゥーン2に予約数であっさり抜かれる……   【朗報】PS4版ドラクエ11は8の正統進化!一方3DS版は・・・ 	 【悲報】PS4版ドラクエ11欲しかった男の子、親に無理やり3DS版で妥協され落ち込む  ドラクエ11、PS4版と3DS版の評価が逆転してしまう 	 【悲報】ドラクエ11、3DS版145万、PS4版115万 [無断転載禁止] ドラクエ11、ソフトの購入比率は 「PS4版が4割、3DS版が6割」  ソニー大好きですが、まさかPS4版ドラクエ11が3DS版の売上を上回るとは思いませんでした  マイクロビキニが似合う有名人は? 【ネットワークカメラ その9】 	 USB4の名前、さっそくメチャクチャになる   【悲報】ドラクエ11、PS4版と3DS版の新たな比較画像が公開される! 	 【悲報】ドラクエ11、PS4版と3DS版の差がとんでもないことになってしまう  【悲報】ドラクエ11、PS4版と3DS版の差がとんでもないことになってしまう 	 【悲報】 switch版ドラクエ11、3DS版のHDリマスターになる可能性が出てきた 	 【悲報】ドラクエ11、PS4版と3DS版の差が更にとんでもないことになってしまう  【悲報】ドラクエ11、3DS版の世界樹がブロッコリーのようなものにしか見えない 	 【PS死】ドラクエ11、3DS版の売上もスプラトゥーン2に抜かれ完全敗北してしまう ★2 	 各場のカメラワーク  ナザレンコ🏺「ロシアはウクライナがモンゴルにレイプされて出来た国。見た目は白人っぽくても精神はアジア」   ドラクエワークについて語るスレ☆4  【ネットワークカメラ IPCAM その10】 	 【ネットワークカメラ その10】	 【◎】 ネットワークカメラ その12 【◎】  【◎】 ネットワークカメラ その13 【◎】  【◎】 ネットワークカメラ その2 【◎】 【TCG】WAR OF BRAINS(ウォー・オブ・ブレインズ/ウォーブレ) Re:Boot120 	 【◎】 ネットワークカメラ その15 【◎】  欧米がメチャクチャにした中東を中国が正常化   【◎】 ネットワークカメラ その14 【◎】  安倍「河野太郎政権が誕生したら国がメチャクチャになる!!!!!」 ★2  [potato★] 【芸能】浜崎あゆみ『口パク』疑惑に総ツッコミ! 不自然なカメラワークも… 	 分裂して新しい掲示板作った途端、5ch全体がさらにメチャクチャに荒らされるって  ドラえもん「過去は変えちゃいけない!歴史がメチャクチャになっちゃう!」←これ  「コロナはただの風邪」って言ってた連中は日本をメチャクチャにしたかったんだな  【惨敗土挫】OneDriveが“勝手に同期”仕様変更に相次ぐ懸念「メチャクチャに」【奴隷】  パワハラって捏造したら他人の人生メチャクチャにできるよな グヒヒ という事件   安倍「河野太郎政権が誕生したら国がメチャクチャになる!!!!!」 ★4  [potato★] なんでお前らは「アメリカ」を憎まないの? 日本を安倍使ってメチャクチャにしてるはこいつらだぞ 	  【超音波】地上波で披露したモーニング娘。'22のHappyBirthDayToMe!のカメラワークが面白い  【速報】サッカー界に激震、メッシクリロナを超える22歳が出てきてもうメチャクチャにwww  官邸関係者「こんなくだらない疑惑の追及ばかりやってたら、日本の政治はメチャクチャになる」と嘆く 	 【動画】これどうやって撮ってるの?って思っちゃうくらいカメラワークが良すぎる動画がこちら 	  Lieila!運営「ツアーを経て磨きのかかったカメラワーク&メンバーの表情にも注目です✨」  「会津」とかいう日本のウクライナ。俺の人生は会津と自民とトンキンにメチャクチャにされた   俺福岡っちゃけどさ、台風ぐらいで東北とか北海道とかなんであんなにメチャクチャになると?   【セキュリティ】IoTマルウェア「ペルシライ」出現、脆弱なネットワークカメラが約12万台も 	 【ガチ悲報】ゲーム業界さん、NURO光の手によってメチャクチャにされてしまう  ドラクエ11Sの体験版遊んだけどメチャクチャつまらないんだけど  【緊急】ネットワーク防犯カメラでワイヤレス接続先ができない【助けて】   俳優 望月龍平(望月衣塑子記者の弟) 原爆は落とされたのではなく打ち上げた 爆発させたのは日本です★4  [ベクトル空間★] 熊沢英一郎「ドラクエ10で俺の人生はメチャクチャだ!」 	 集団ストーカーのせいで、人生メチャクチャにされた人達1 	  
  
    
  
 
 19:58:59 up 8 days, 10:21,  0 users,  load average: 119.72, 129.58, 135.39
in 2.5660560131073 sec
@[email protected]  on 103108