1 :
デフォルトの名無しさん :
2013/10/29(火) 09:04:35.38
【重要】 hogeは禁止します、使用しないでください。 万が一hogeが書き込まれても、スルーしてください。 相手にするとあなたも荒らしと同じ扱いになります。 なお、hogeはNGワードに追加しておくことが強く推奨されています。
ちょいと質問。 gccで次のコードをコンパイルすると初期化子が足りないと警告が出るのだけれど、規格としてはどうなんだっけ? -- #include <iostream> using namespace std; int main() { struct foo { int foo; std::string bar; } fooz = {0}; std::cout << fooz.bar.size(); return 0; } --
規格としてはOKだから、警告出るけどコンパイルできる gccの警告レベルはオプションで細かく指定できる
8.5.1/7 If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member not explicitly initialized shall be initialized from an empty initializer list (8.5.4). [Example: struct S { int a; const char* b; int c; }; S ss = { 1, "asdf" }; initializes ss.a with 1, ss.b with "asdf", and ss.c with the value of an expression of the form int(), that is, 0. ?end example ]
>>3 規格的には問題ないけど、そういう場合は括弧の中空で初期化すべきじゃない?
8 :
3 :2013/10/29(火) 18:51:06.35
>>4-7 THX!
某社のコードを管理しているクライアントのコードがこんな感じだったの。
長らくC++に移行するのを嫌がっていたけど、
某社から要請されてやっとC++に移行したと思ったらこれだよw
警告の回避手段を検討してくれって言われたけど、さてどうしたもんか。
hoge
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
>>8 うるせーバカと引数で警告を切る
-Wno-missing-field-initializers
うっせーアホとソースコードで警告を切る
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
#pragma GCC diagnostic pop
あきらめる
= {0, std::string()};
C++極めた
奇遇だな 俺もだ
C++の学習曲線はサインカーブらしいからな・・・
D言語とF#極めるわ
Dってどうなのよ あれどうなるんだ 未だに先行き不透明
ファイスブックが採用したとか
デジャヴ
>>8 >>11 デフォルトはその警告オフだよね?
-Wallでもしてるんかしら。
コンパイラの規格が2003年版以降なら
}fooz=foo();でもokだと思うけど…古いコンパイラに持って行ったとき死ぬのでオススメはしない。
>>14 つまりマイナス=初心の頃のほうがマシ、とかヘンテコになるときもあるのか?!
>>21 テンプレートとかに凝りだすとそう言う状態になる。
まあ、C でもマクロとかあるから似たようなもんだが
>>21 『ぼくのかんがえたすごいてくにっく』でやろうとしたけどうまくできません、と言って
なんでそういうやり方をしてるの?とかそもそも何がやりたいの?と突っ込まれてる質問をよく見るだろ
25 :
デフォルトの名無しさん :2013/10/30(水) 16:19:51.02
>>21 長考してるときは手が止まっていて
外から見て C++ を使っていない状態になったりはする
雑記帳のメモは俺語だし
26 :
デフォルトの名無しさん :2013/10/31(木) 01:08:41.39
g++の最適なオプション教えろ 昔どこかのサイトでこれだけはつけておけ!みたいな記事があったがどこにあったか忘れた 付けると最適化がさらによくなったり、厳密なデバッグをするようになって警告が出まくる感じだった
>>26 お前がEffective C++信者なら、
-Weffc++ -Werror を付けておけ
-Weffic++ってどういのか調べたら至極まっとうな警告出してくれるのな 信者の素質あるかな
>>29 過去の自分が書いたソースを全部警告が出ないようにできるか?
C++を使う上で当たり前のことをまとめた本だから信者も何もないと思うよ
-Weffc++の痛々しいところ 中身空っぽでもいいから、とにかくコンストラクタには全てのメンバー変数に対して初期化子を書けと言うところ
-Weffc++の痛々しいところ 継承する場合は常にvirtualデストラクタを書けと言うところ
>>33-34 いやそれは今でもやってんよ俺
デバッグとリリースで挙動の違うバグ起こしかねないから
あと継承するときはvirtualデストラクタにするっしょ
>>34 それはどこが痛々しいの?
ポリモーフィックなクラスは仮想デストラクタにするのが当たり前だと思ってたが
そうしない方がいい場合というのがあるの?
仮想関数テーブルを使わなくて済む!
>>36 ツリー構造になってるtraits系クラスに全部デストラクタを書いてるのか
>>35 お前本当にWeffc++使ってんの?
class c {
int i;
c() {}
...
これは許されない。
class c {
int i;
c() :i() {}
...
これは許される。
デバッグとリリースで挙動が違うバグとやらの理論で、この意味不明な押し付けを正当化できるのか?
多態性使うときは書くな それ以外は書かない
>>36 > ポリモーフィックなクラスは仮想デストラクタにするのが当たり前だと思ってたが
勝手にポリモーフィックの話に変えないようにwww
結局effc++信者は馬鹿ばっかり。
標準ライブラリーもboostも含めメジャーなライブラリーで -Weffc++ -Werror をつけてコンパイルが通るライブラリーは一つもない。 警告を出しているg++でさえ、自分のコンパイルすらできない。
>>36 継承するとき全部仮想デストラクタにするのは
やっぱEffective C++の影響で?
>>39 いやWeffc++は使ってないけどそれはイミフじゃないだろ
上のiはデバッグのときはパターン初期化されてリリースのときはゴミが入る場合が多い
(つまりデバッグとリリースで初期状態が変わる)けど
下はゼロ初期化になるじゃん
>>38 そういや書かないね。
typedef連ねてるだけで実装持ってないことが多いから気にしたこともなかった。
それと、インターフェイスなクラス書く時、何気なく仮想デストラクタ書いてるけど
これってなんで必要なんだっけ?
前に何かの本かblogで書くべきって書いてあるの見たのは確かなんだけど
なんで?の部分が思い出せない。
そりゃ書かなきゃ継承先のデストラクタがよばれないからだろう
>>44 画素を表現するためにメンバーにr,g,bを持つクラスを配列化させて画像を表現する場合も、
たとえ速度が犠牲になろうとも
画素のコンストラクタには全て初期化子を書くタイプ?
>>45 > そういや書かないね。
> typedef連ねてるだけで実装持ってないことが多いから気にしたこともなかった。
effc++的には許して貰えないな
多くのライブラリが警告だらけになる理由の一番がこれだ
>>47 POD型の構造体を書く
structももちclassの一種なのは承知
これがEffcで許されるかはよくしらん
>>49 effc++はそんなものでも初期化子書けと怒るという話なのだが。
とりあえず使えよ。
Effective C++信仰 ゲッタセッタ病 クラス肥大病 クラス数減少病 クラス依存循環病 どこかのスレで、これら全部影響しあってるって話があったよ。 だからどれも治すの難しいんだとか。
>>50 出ない。少なくとも下のコードでは出ない
Imageに int i; メンバ変数追加したらもちろん出る
$ g++ -Weffc++ -Wall -c test.cpp
struct Pixel
{
char a, r, g, b;
};
class Image
{
public:
Image() {}
private:
Pixel icon_[16 * 16];
};
int main(int argc, char *argv[])
{
Image image;
return 0;
}
>>45 インターフェイスのクラスポインタに具象クラスをnewしてdeleteしてみればわかる
>>52 Pixelの例は極端な話だから理解しにくいかもしれないが、Pixelで追求するのなら
struct Pixel
{
char a, r, g, b;
Pixel(char A,char R,char G,char B) : a(A),r(R),g(G),b(B) {}
};
このあたりを起点に試すとか
>>55 いや、それじゃコンパイル通らないし。
POD型の構造体作るような単純なデータ構造に
普通ユーザ定義のコンストラクタは書かないし
逆に複雑なデータ構造ならclassにして初期化子も全部かくだろ
PODほど単機能ではないけど 何億件もオブジェクトを並べる必要があってPODに近い扱いをしたい ってときに、その主義だと速度への犠牲の強い方が大きそうだ
>>56 > いや、それじゃコンパイル通らないし。
どうして?
>>58 なにかコンストラクタを追加した時点で
structの暗黙のデフォルトコンストラクタが無効になるから
どうして?ってのがどうしてだよ。
>>59 「まずそこを起点にして」、考え直せば、デフォルトコンストラクタを足すという
というのが、変化の第一歩かなと思ったけど、
そもそもの思考が全然違うわけか。
ちなみにEffective C++信者の方?
>>57 そういう案件のプロジェクトなら何十人も関わってるはずなので
-Weffc++なんてリベラルなことは死んでもやれない
>>59 叩き台のスタート地点を決定稿扱いして批判開始するのは極端な思考だと思うし
PODかさもなくば初期化子フル装備のクラスかの二択でしか考えないのも極端な思考だと思うし
とりあえず初期化子必要性に関しては一番端っこの原理主義者みたいなものでしょ?
そうでない人との議論はする意味あるのかな
>>62 別に批判してるわけではなくて
言われなくてもわかるっしょ?行間読めよって言われても
正直
>>55 でなにを試せって言われてるのか俺にはわからん
初期化子をきっちり書くだとか 継承するときはかならず仮想デストラクタ付けるとか そういうオマジナイさえしっかりしておけば あとは気を抜いても安全が担保される 速度の犠牲は許される代償である effc++信者の思考パターンね だから信者を端的に現すと 「オ・マ・ジ・ナ・イ」で「ア・ン・シ・ン」
初期化子なんていらない派の知識のなさが露呈してきた
>>64 オマジナイだけで安心できるなら、それでいいんじゃない?
それは悪いこと?
ゲッタセッタ病は裏に二つの病 オマジナイ安心病 実装依存インタフェイス病
なんでもかんでも病認定するお医者さんが住み着いてるな IDでねーからなこの板・・・
洗脳確定すると解けないようにできてるんだから あれはよくできた宗教本だよ
病気でもいいからオマジナイはほしい。 大概のクラスはいくつかに分類できるんだから、先に分類例をあげて、その場合の典型的な実装例を示して 最後にそう書く理由を説明される方が分かりやすいし覚えやすい。
>>70 安心欲しさにオマジナイにすがるのは
放射能怖さに沖縄に引っ越した人みたいで嫌だ
沖縄はいいところだよ
Effective C++は初心者の恐怖を利用して巧みに洗脳するんだな。 オマジナイのおかげで気を抜いても安心とか最低だろ。
初期化市は書けよって結論でおk?
おkhoge
>>33-34 ,39,55,58
こいつの基礎知識のなさに絶望したわ
Effc++批判する以前の問題だろ
>>64 どうでもいいところを安全側に倒すっていう判断は普通にアリでしょ。
多くの場合に意味のない効率と、多くの場合に意味のない安全性とのトレードオフね。
78 :
デフォルトの名無しさん :2013/10/31(木) 09:27:57.10
でもeffectiveすら読んだことない奴はゴミ
>>78 さすがに二十年前の本だしな
この二十年間Effectiveを読まないように気を付けてきました
なんてやつがいるならお目にかかりたい
本高いから何も読んでないな
俺もC++始めて5年目だけど読んでない ボロボロでもいいから中古で千円なら読む
82 :
デフォルトの名無しさん :2013/10/31(木) 10:14:44.37
セオリー知らない奴はホント困る コーディングで個性発揮してんじゃねーよ
よい子ちゃんは人に教えられたことを頑なに守るからね。 俺みたいなアウトローはeffectiveC++を読んでeffectiveC++で禁止されていることを やるのがカッコイイんだけど。
ゴーアウト
>>81 5〜6年前はブックオフで300円とかで見かけることもあったけど、
今はどうなんだろうな
ブックオフは正規の半額の値段か100円のどちらかだろう。 300円とか半端な値段にはならないはず。
日本語版effectiveの1,2版は訳がひどくて原書で読めといわれる技術書の代表だったから気をつけろ というかこの流れでも日本語1,2版を前提にして語っているのが混じってそうだな
おれは英語版しか読んだこと無いが・・・ 俺から言わせて貰えば日本語版で読める代物はほとんど無い。 英語でしか表せないウィットにとんだジョークなども日本語に翻訳したとたん 陳腐で下劣なものにしかならないからな。
第三版がいいなあ
ちゃんとした翻訳版があれば原書は遠慮したいな 技術英語なら一応は読めるっていっても 流し読みたいところを高速に流し読めるのは日本語以外考えられない
英語をスラスラ読めるとかなり有利だよな 急がば回れということで英語を勉強するのも手か
英語はセンスだからな。 センスの無い奴がいくら英語を勉強しようとも絶対分かるようにはならない。 フィーリングっていうのを感じられるようになるには英語の理論だけは絶対理解できない領域だからな。
>>83 ネタみたいな書き方してるが、
実際、effectiveをいかに素早く通過するかは大事なことで、
effectiveに従順に従う期間が長くなると癖のように染み付くのが良くない。
うだうだ言わずに読め
英語は言語だ誰だってできるようになる …いやほんとそう思うよ。できないのは触れる時間が短すぎる
大事なのは一字一句読み取る能力じゃなくて いらないところを読み飛ばしたり構成をつかんだりする能力だろう けっきょく経験するしかないのじゃ
>>96 それは本当
以前は勉強しても全然英語が伸びなくて受験生時代センター英語3割だったけど
それから二年中英語のゲームやってたら浪人して英語だけ9割取れるようになった
99 :
デフォルトの名無しさん :2013/10/31(木) 13:17:23.46
そこは C++ だって同じやん 文法だけいくらおぼえても、からっきし何も作れない 要は言語で表現しようとしているものを理解する必要があるってだけ 外人に何を伝えたいのか、何を言ってきているのか 時に基本的な発想が違っていることがあったりするのは文法ではわからない
100 :
デフォルトの名無しさん :2013/10/31(木) 19:39:53.12
>>98 お前一人のサンプル出されて本当って言われてもね
お前の脳に異常があるとかそういうオチだろどうせ
自分一人のサンプルで本当とか言い出す辺りそっちのほうが可能性としては高い
101 :
デフォルトの名無しさん :2013/10/31(木) 19:44:55.82
前置詞って聞き取れないよね〜。 なんでだろうね〜。 困るわ〜。
オブジェクト指向ってのが難しくてわかんないんだけど、 画面作ってボタンのクリックイベントから先はなんでもかんでもクラス化して クラスがいっぱいになったりするんですけど、そんなもんですか? グローバル変数を使わない方がいいと思って クラスのアクセサつかったりしてるんですけど、 逆にごちゃごちゃしてる気がしてなんかなぁって感じです 基本的にどんな設計が一番保守しやすいんでしょうか? 気を付けていることとかを聞かせていただけるとありがたいです。
インスタンスを生んだら手を尽くして例外なく可能な限り早急に殺す。 dataはプログラム全体をカバーする巨大構造を別に設計してソコに収める。
通報した
>>103 生成したインスタンスすべてを管理するクラスを作るってこと?
インスタンスを生成したクラスの中やデストラクタでdeleteしてるんですけど、
そのなかで解放はしないでそっちの管理するクラスで解放するってことですか?
>>102 「逆にごちゃごちゃしてる気がしてなんかなぁって感じ」る程まで小分けする必要は無いだろ。
管理しやすい単位で留めとけよ。
>>105 それはなんちゃってオブジェクト指向の作り方説明じゃねぇの?
>>102 細かいクラスほど別のプログラムで再利用できるように意識する。できない場合は分けるだけムダってことも
基本クラスはできるだけ継承で機能を拡張しやすいように作る
メンバのdeleteは普通にデストラクタですればいいよ
〜再利用を考えてつくられたクラスは再利用されない法則〜
>>107 delete なんて書くんじゃねぇ。スマートポインタ使え。
C++でレースゲー作ってるんだけど、どうせならハンドルを握りたい USB接続できるハンドルでC++で制御することがサポートされてたりする商品があったら教えて欲しい
>>110 プレステのハンドル形コントローラーと、プレステパッドのジョイパッドコンバータを組み合わせて使えば良い。
プレステコントローラーを流用する時点で保証的なものは無いけど、製品数や品質はそこそこ期待できる。
112 :
デフォルトの名無しさん :2013/11/01(金) 06:58:57.08
継承で機能拡張なんて悪手だわ
旧:抽象クラス≒インターフェイスクラス→具象クラス→拡張クラス(時々?)→拡張クラス2(極稀?)→拡張クラス3(奇跡?愚作?) 現:Traits/Policyクラス→抽象クラス→具象クラス→拡張クラス(時々?)→拡張クラス2(極稀?)→拡張クラス3(奇跡?愚作?)
>>107 あんまり、初心者に継承は教えない方がいいと思う。
既存のファイル読み書きクラスを継承してログ出力クラスなんてものを作ったりするし。
先ずは、カプセル化、そして多態とかインターフェース継承、
最後に高等テクニックとして実装の継承を教えるとかかな。
>>101 ネイティブもちゃんと聞いてなくて、話の流れで判断してるらしい
117 :
デフォルトの名無しさん :2013/11/01(金) 08:42:18.10
日本語でも協和語みたいに接続詞や助詞がおかしくても通じるしね
前置詞で文意が変わってしまうような場合は 発する側も意識して発音する
どの言語も単語を羅列することから始まってるので 語順も助詞もぶっちゃけ飾りです
120 :
デフォルトの名無しさん :2013/11/01(金) 16:18:48.04
かなり変わってくるぞ 「お前はプログラミングができない」 「お前もプログラミングができない」 「お前はプログラミングもできない」 「お前もプログラミングもできない」 「お前とプログラミングはできない」 「お前でプログラミングはできない」
「お前をプログラミングはできない」 「お前のプログラミングはできない」
あなたを、犯人です。 普通に意味通じる。
語彙の情報と構文の情報の不整合による摩擦を無視してるのは明らかだけどな
あなた、犯人、違いないで十分通じるんだから、助詞とか要らなくね?
私そう思うある
流暢には聞こえないし場合によっては通じない 通じたとしても違和感は感じるよね ただ、日常のよくやる会話ならほぼアクセントだけで通じると思ってる 挨拶みたいな定型句なんかは余計に
128 :
デフォルトの名無しさん :2013/11/01(金) 19:13:49.38
>>125 「彼、あなた、殴る」
だとどっちがどっちを殴るか不明瞭
文脈や共有知識があるかどうかにもよるわな
スレが縄文時代に戻った こんなかんじで言葉は発展してきたんだろうな
131 :
デフォルトの名無しさん :2013/11/01(金) 19:54:14.04
日本語だと助詞が重要だが英語だと語順が重要
「あなたはリンゴを食べます」
「あなたをリンゴが食べます」
「You eat this apple」
「This apple eat you」
また、上述の単語のみを用いて会話する場合、同じ世界観を背景としていれば「あなた(you)、リンゴ(apple)、食べる(eat)」でも伝わる
これは、人間がリンゴを食べることはあってもリンゴが人間を食べることはないという共通の関係性を認識しているため可能なこと
>>128 のようにどっちがどっちに対しても行うことが可能な関係性の場合には破綻する
あくまでoperator の話をしているように見える俺は、operator の記述を使いこなしてない
翡翠だったのに。
スクラッチでちょっとコード組むんだけど メンバ変数の接頭(尾)辞おまえらどんなにしてる? m_foo か foo_ が2強だと思うんだが視認性的に前者最強?
135 :
デフォルトの名無しさん :2013/11/02(土) 02:18:43.65
視認性なら大文字使えば?
>>135 大文字表現は定数と(数少ない)マクロのためにとっておきたい
どっちでもいいし付けなくてもいいと思うけど foo_ 同じ接頭辞の変数は一瞬見紛いやすいから
>>137 サンクス。てかpart105にも同じ話題があった…蒸し返しすまん
139 :
デフォルトの名無しさん :2013/11/02(土) 08:29:50.13
hoge_ かな
m_で統一してから自動補完で捗るようになったわ
>>125 逆に全部揃ってても文脈無いと判断付かん文章もあるしな。
助詞とかは解釈を分りやすくするヒントであって、必ずしも省略不可能な要素では無いんだろうな。
C/C++だって不定なコードとか鼻悪魔なコードとかあるわけだし。
m_は古臭い 自動補完なんてそんなのなくても余裕だし、this->書いて消せば命名どうしようが関係ないし
全部にthis->書くプロジェクトに当たって恐ろしく見通しが悪かったトラウマがある んで最悪な事にところどころ忘れてやがんの、なんの意味もねえw
144 :
デフォルトの名無しさん :2013/11/02(土) 11:32:12.79
なんでthis->だと見通しが悪くなるんだよ。慣れてないだけだろ
this->書いて消すとかアホらし
全部にthis->とか正気か? コピペ面倒だし行が無駄に長くなるだけだろ
>自動補完なんてそんなのなくても余裕だし、 これの方が古臭い根性論に見える。
148 :
デフォルトの名無しさん :2013/11/02(土) 11:53:02.96
今どき文字数を減らすとか行数を減らすとかマジ無意味だからやめて
t C-/ でメンバー一覧出るから、this-> 便利だろう
m_でいいや
this->はたまにやるけど
>>143 は許しがたいな。C使えよ
m_の2文字で自動補完かかるんだっけ?なぜか3文字だと思い込んでた。
>>147 覚えきれないほどのメンバ変数がある時点で捗るもクソもない
this->忘れてもエラーにも警告にもならないからね 意味なし 俺はc#もやりだしてから_fooで統一した
>>153 1クラスで済む話じゃないからねえ。
どのクラスに何というメンバがあるか全部覚えておくというなら、やっぱり根性論か、
あるいはよっぽど小規模なプログラムしか作ったことないんだろう。
this->m_hoge_ 結構いかしてると思わない?
古臭い
>>155 実装中じゃないクラスなら、インテリセンス効くじゃんか
バカか
160 :
デフォルトの名無しさん :2013/11/02(土) 16:27:22.71
>>156 どーせなら糞ハンガリアンも追加したら?
this->は忘れてもコンパイル通るから メンバの目印としては極めて悪質
ハンガリアンは嫌われるというけれども win32api の頭に :: つけているのが結構ありがたかったり‥‥
先頭アンスコは忘れてもコンパイル通るから極めて悪質
167 :
デフォルトの名無しさん :2013/11/02(土) 17:12:43.34
おいおい、スコープと混同かよ・・
ぶわははは
>>166-168 グローバルスコープ指定を流用するって悪癖だっけ?結構便利なんだけどなあ
>>169 ハンガリアンとの関連も見いだせないし、流用の意味もわからないのですが…
172 :
デフォルトの名無しさん :2013/11/02(土) 17:36:54.82
エイゴリアーーン
それはロッキー
先頭アンスコって付けていいんだっけ?
175 :
デフォルトの名無しさん :2013/11/02(土) 17:51:40.69
良いともいえるし、悪いともいえる
>>170-171 識別子の冒頭になにかつけて、なにかしら認知しやすくしよう、という心理が似ているなあと、いやまあアレですけど
>>174 たしか小文字が続くならOKで大文字はアウト
>>161 thisが参照なら・・・せめて参照なら・・・
this.foo
this->foo
この一体感の差は大きい
17.6.4.3.2 Global names [global.names] 1 Certain sets of names and function signatures are always reserved to the implementation: ? Each name that contains a double underscore _ _ or begins with an underscore followed by an uppercase letter (2.12) is reserved to the implementation for any use. ? Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.
うん、知ってる
>>181 つまり、クラス内などの「グローバル以外のスコープ」なら、アンスコをどう使っても自由って事でオケ?
m_hoge はださすぎ hoge_ しっぽ生やす方がスマート
>>179 this が参照だったら this 自体を変えれるんですか?this が左辺値だったら、だったらいいことがあるかも
m_ってメンバ補完使うときに邪魔じゃね? 余計に打たないといけないじゃん
foo_m じゃーこういうのどうよ?
>>183 グローバル名前ではであって、グローバル以外の名前のことは書いてないから
なんとも言えない。
>>184 winならm+ハンガリアンだろ
しっぽ掴んでるように見えてきたじゃねーかw
190 :
デフォルトの名無しさん :2013/11/02(土) 18:40:35.50
foo_qm
補完の為にプレフィックスつけるって発想がもう古くね 開発環境の都合にコードを合わせるなんてばかばかしいだろう そんなのはIDEで対応してくれよ
>>184 コンストラクタでメンバ変数の初期値を指定する場合
hoge_ = hoge; のようになるけど、
インテリセンスで両方出てくるから
hoge = hoge; や hoge_ = hoge_; になるバグを仕込む危険性があるので頭悪い
>>191 ほとんどの人は「補完の為に」付けてるわけじゃないだろう。
ポストフィックスにしておけば補完のときにメンバ変数がまとまって出るから便利という程度で。
メンバ変数である目印に付けてるな 色が変わるIDEもあるけど、そんなのばかりではないし 変数の寿命が分かりやすいから 見知らぬコードも読みやすい
補完の時にメンバ変数がまとまってる利点ってなんだよ
むしろ取り違えの危険性があるのでデメリットしか感じない
199 :
デフォルトの名無しさん :2013/11/02(土) 19:13:33.04
>>193 それは初期化ではなくて代入だC++erなら初期化と代入は区別すべきコンストラクタでの初期化はそのための構文を使え
結論:
>>193 は頭が悪い
>>199-200 別にメンバ初期化子でも同じだけどな
hoge_(hoge_) にしても警告でない環境なんぞ普通にある
g++ 4.6.0 -std=c++0x -pedantic-errors -Wall で無警告
202 :
デフォルトの名無しさん :2013/11/02(土) 19:19:00.38
じゃあ、m_hoge が一番良いのか。 かっこわるいけど
格好は悪いけど、一番理にかなってる
何でもかんでも警告出ると思ったら大間違いだ!
>>201 それがなにか?
環境依存の話をされても
コンストラクタ内の記述で代入を使うのはどーかといっているだけだがな‥‥
m_は醜すぎてコード見る気しなくなる
>>205 話の流れ理解してる?
メンバ初期化子であっても同じ現象が起こるから
問題であることに変わりないって言ってるんだが
_ ポストフィックスだと メンバ変数かどうかの確認にワンテンポかかるんだよな m_ は主張が強くて一瞬で分かる
"m"にはメンバ変数以外の意味があるが 末尾_には意味が無い 末尾_を使うのがあらゆる場面でメンバ変数であることを約束できる唯一の方法
組織、プロジェクト等の命名則に従えで良いだろ
末尾 _ は構造体コンストラクタの引数につけることがあるわ
"m_" プリフィクスをメンバ変数以外に付けてるの見た事ない "_" ポストフィクスはそれ以外で付けてるのを見た事がある m_ の勝利
>>201 gcc 4.8.1なら出るぞハゲ
warning: 'Hage::hoge_' is initialized with itself [-Winit-self]
出ない環境が1つでもあれば気をつけるべき 出る環境の事なんてどうでもいい
なんだアスペか 相手して損した
>>217 アスペルガー批判をする暇があるならC++を勉強してくれ
219 :
デフォルトの名無しさん :2013/11/02(土) 19:38:46.13
俺は、Attribute の a_hoge が良いと思う
220 :
デフォルトの名無しさん :2013/11/02(土) 19:39:54.54
だからアルファベットを使うと何かと被るって
C++の規格中でattributeは別の意味を持ってるしだめだな
被るって本当に?
_ だけでも被るんだなこれが
キに スる ダけ ムだ
接頭接尾字は付けずに自動変数と紛らわしいときだけthis->を付けるという手も
パッと見でメンバ変数かどうか分からないと 知らないコードの動きを見る時に凄く不便なんだよ
>>225 大きなクラスをつくらない、の掟を守ってる限りは実際それもありだと思う
しかし得てして実装は肥大化していくもので
メンバ変数がグローバル変数ばりのスコープの広さをもったとき破たんする
メンバはIDEサイドで色分けしてほしいけど それも一種の環境依存なのかな
環境依存だな メンバ変数の色分けは難しすぎる中年
#define self (*this)
全部にthis->つけてるんだけどだめなの? たしかに横に長くなるけど確実じゃね?
手間の割に確実性に欠ける
this->全部付けられりゃいいけど、絶対忘れる所出てくるでしょ そうなると気持ち悪い
m_も確実性なんてないけどな
>>235 this->と違って、定義のときだけ気をつけていればあとはコンパイラが保証してくれる。
>>234 せめてthis必須のコンパイラオプションとかあればな
m_はダメだろ mから始まる関数名を補完しようとしたら、m_系が大量に出てくる
打つ速度が遅ければね。 普通はちょうどいい感じに出てくる。
お前らが大好きな「exceptional C++」はhoge_だな 「C++ coding standards」もhoge_ m_hogeで有力な本とかライブラリって何よ
自分のソース
Googleのコーディング規約もfoo_ m_fooは、昔のVC++だな
>>244 Googleのって例外の使用禁止とかのアレ?
だとしたら、アレって普通の人が参考にしていいようなもんなの?
ポストフィクスと例外禁止に何の関係が?
bulletはm_hoge Qtはm_hoge collada-domはhoge ORGEはmHoge 結構いろいろあるな
アンスコかm_ルールのなんてチームで明文化されてればそれでいいだろ
>>160 システムハンガリアンは当然詰め込むとして、アプリケーションハンガリアンも詰め込もうぜ。
this->m_dwyenHoge_
>>251 「Global names」にはマクロも含むんだろ
「なんとも言えない。」=「自由とも言えない。」≒「(自由である保証が無い限り)自由じゃない。」 じゃねーの?
>>253 「なんとも言えない。」=「自由でないともいえない」≒「(自由でない保証が無い限り)自由である。」
の可能性はどこにいった?
>>254 括弧の中に消えた。
安全側に倒そうと思ったら、そっちにはしたくないと思うんだ。
>>251 箇条書きの最後にだけ "in the global namespace" って書いてあるでしょ。
ほかはそうじゃないって事。
>>256 それとは別の項目に
・ローカル引数において〜の場合は前置/後置アンダースコアを使用しないこと
って書いてあっても
>>181 の文と何の矛盾もないだろ
>>251 はそういうことを言ってるんだよ
使う側にとって大事なのは安全である保証だけで安全でない保証はいらんだろ常識的に考えて
_小文字はダメで _大文字はOKなんていう見た目にハッキリしないルールは守られない _で始まる識別子は一律で禁止しとくのがメジャーだし合理的
>>260 結論は正解って事を自ら証明したんだろ。
_大文字はprivateメンバ関数に使ってるな
>>259 そう思うならそう言う言語を作って使えばいい。
>>261 マッチポンプもいいとこだけどなー
一律禁止には同意
global namespace の意味わからないのか? 英語読めないバカは日本語の規格書読んどけ - 下線で始まる名前は,大域的名前空間における名前として,処理系用に予約する。
>>265 グローバル以外の名前空間ならアンスコ自由に使っても合法と言う事でオケ?
>>265 何がいいたいのかわからんけど、(誰かを馬鹿にしたいだけ?)とりあえず訳間違えてるよ
間違えてないだろ。 つか、誤訳だというなら日本工業標準調査会に指摘しろよ。
>>257 >って書いてあっても
なんで規格読まずにそんなバカなこと言ってるの
>>266 グローバルで(空間ではない。つまりどこでも)でアンダースコアで始まって大文字とアンダースコア二連続が予約されてる。
で、global namespaceでアンダースコアで始まる名前が予約されてる。
規格の話はさ、こんな吹き溜まりでブチブチやるより、twitterで暇そうな規格策定者に呟いた方が早いと思うよ
>>270 ん?ああ、そう言うことか
日本語でも勘違いしてたかもしれん
グローバルに予約しているから、当然ローカルでも使えんと言う事か
んじゃ、
>>267 は規格翻訳者に「間違ってるよ」とtweetして、ここで報告する事。
メンバ変数の_小文字はOKだから。 global namespaceがクラススコープも含ならその前の文要らないだろw でも、この程度の文章も読めない人達はアンスコ始まりは一律に 禁止したほうが良いかもね。
MSDNより: Use of two sequential underscore characters ( __ ) at the beginning of an identifier, or a single leading underscore followed by a capital letter, is reserved for C++ implementations in all scopes. You should avoid using one leading underscore followed by a lowercase letter for names with file scope because of possible conflicts with current or future reserved identifiers.
>>274 読めない人達は禁止にしないでしょ、現にglobal namespace以外は好きにアンダースコア使っていいと勘違いしてた人も居るんだし。
読めない、読まない人達のために禁止にするんだよ。
>>275 これが規格に書いてあれば勘違いしなかったわ
規格ではダブルアンダースコア「を含む名前」が予約だけど、msdnではダブルアンダースコア「で始まる識別子」なんだな なおさないとまずいだろう msdn
>>278 why?
「Visual C++はダブルアンスコは先頭にしか使わないので
途中のダブルアンスコはVisual C++と衝突しませんよ」
という製品仕様の説明だろ?
規格上問題ない
そうだそうだ
17.6.4.3.2 グローバル名 [global.names] 1 特定の名前や関数のシグニチャは処理系により予約されている: ・ 2連続のアンダースコア __ かアンダースコアの次の大文字が続く名前 (2.12) はあらゆる用途において処理系により予約されている ・ 1つのアンダースコアで始まる名前はグローバルな前空間に所属する名前としては処理系により予約されている マクロの制限は規格の別の所に書いてあったような・・・
×グローバルな前空間 ○グローバル名前空間 このへっぽこIMEめ・・・
>>279 「Visual C++」じゃなくて「C++」と書いてあるじゃん
本製品ではC++実装のために ってことだろ
> 本製品ではC++実装のために > ってことだろ MSはC++規格に追従していない ダブルアンダースコアで始まる識別子が予約されていたのはC++98, C++03ではダブルアンダースコアを含むと改訂されたが、MSは追従 せずに、そのまま残っている。 つまり件の記述は今は規格外となっているが、書かれた当時はC++標準 (ISO/IEC FDIS 14882)を指していたもの。「本製品のC++実装」の事ではない。 英語読めないなら日本語の規格読んでろ。
>>269 これだけ読むと云々ってレスへのフォローだろ
落ち着けよ
>>285 手元のC++98と同等と思われる文書を見る限り特に変わりは無いようだが、それはどこソースの情報だい?
>C++標準(ISO/IEC FDIS 14882)を指していたもの。「本製品のC++実装」の事ではない。
>>285 の脳内ではそうなのだろうけど
どうしてそこまで妄想の決め付けが激しいのか
土方/hogeは妄想がコア
だがそれがいい そるこそがスレを加速させる力
質問させてもらいます。 #include <iostream> #include <fstream> using namespace std; void main(){ char* buffer; int size; ifstream in( "text.txt", ifstream::binary ); if( !in ){ cout << "ファイルがありません。" << endl; } else{ in.seekg( 0, ifstream::end ); size = static_cast<int>( in.tellg() ); in.seekg( 0, ifstream::beg ); buffer = new char[ size ]; in.read( buffer, size ); } cout << buffer << endl; } text.txtの中身 こんにちは! 実行結果 こんにちは!■■■ となるのですが何故でしょうか…?
文字列の愁嘆が無いんじゃね?
詩的だな
>>292 ありがとうございます。
buffer[size] = '\0';
といれれば解決しました。
しかし、"こんにちは。"は全角文字なので size = 12バイトとなりますが、
未確保のbuffer[12]に文字を入れても大丈夫でしょうか…?
何度も質問すみません…
new char[ size + 1 ]
296 :
デフォルトの名無しさん :2013/11/04(月) 02:04:20.42
>>287 | This is a PDF version of WG21/N1043, a draft standard for C++98,
| which was used as the 1997 Public review document.
って奴だな。
17.3.3.1.2 Global names [lib.global.names]
|1 Certain sets of names and function signatures are always reserved to the implementation:
| Each name that begins with an underscore and either an uppercase letter or another underscore (2.11) is
|reserved to the implementation for any use.
| Each name that begins with an underscore is reserved to the imple
で、お前の「手元のC++98と同等と思われる文書」とはどういう素性のものだ?
>>288 英語読めないバカは引っ込んでろよ。「本製品のC++実装」爆笑
>>295 先ほど、それをやってみたのですが、
こんにちは!ヘ
となってしまいました…
現在のコードです。 #include <iostream> #include <fstream> using namespace std; void main(){ char* buffer; int size; ifstream in( "text.txt", ifstream::binary ); if( !in ){ cout << "ファイルがありません。" << endl; } else{ in.seekg( 0, ifstream::end ); size = static_cast<int>( in.tellg() ); size += 1; in.seekg( 0, ifstream::beg ); buffer = new char[ size ]; in.read( buffer, size ); buffer[size] = '\0'; } cout << buffer << endl; }
>>297 そうじゃなくて、size+1で13バイトを確保すれば
buffer[12]に文字を入れても大丈夫でしょ?
もっとちゃんと勉強してから手を付けたほうが良いレベル
そのコードじゃ+1した意味ねーだろwww
>>297 フじゃなくてヘが入るのは珍しいなってちょっと思った
どなたか終端文字つっこむとき '\0', L'\0', TEXT('\0') とかじゃくて
0つっこむ派のお仲間はいらっしゃいませんか?
>>299 >>300 意味わかりました!
まず、buffer = new char[ size + 1 ];
で13バイト確保して、文字を読み込み。
13バイト目に'\0'を入れればいいんですね!
>>302 理解してるとは思うんだけど12バイト目っていっとくれ
いやそれは日本語としておかしい
>>302 次はnew使わない書き方覚えな。
危なっかしくて見てられん
0〜12だからですね!以後気を付けます!
>>304 序数は0から数えるのが少なくともC/C++の文脈では暗黙の了解
0バイト目って言ったらインデックス-1 イテレータでいうrendの位置だと思ってた
あとそう、void main()がどっかの入門書の受け売りならいますぐその本燃やせ
>>307 はまず日本語を勉強すべき
インデックスが0オリジンなのと
「nバイト目」の日本語は別
>>310 いやしかしメモリのオフセットを相手に伝えるとき1から表現するかお前?
>>312 オフセットが0オリジンなのと
nバイト「目」とかn「番目」の日本語は別。
規格でもfirst element of the arrayという表現はあっても
0th elementという表現は無い
0番とはいうが0番目はちょっと違和感があるかな でも正直どっちでもいいし今回も通じたんだから突っ込むよなことではないだろと思う
>>313 説き伏せられた
第一要素の、的な噛み砕いた文章になると確かにそうだな
309がスルーされた件
「p[〜]」を日本語で言う場合どう表現する? 「p大括弧〜大括弧閉じの要素」 「pのインデックス〜の要素」 「pのオフセット〜の要素」 「pの序数〜の要素」 「pプラス〜の要素」
mainの戻り値考慮しない悪書はままあるからなぁ・・・ int main()でreturn無しとかreturn;とかorz
メイン関数の掟 1.戻り値の型はintでなければならない 2.戻り値以外は処理系依存の形式 3.ただし処理系はint main()とint main(int, char **)の どちらも許可しなければならない 4.returnが無い場合、0を返したと見なされる
int main() try { throw "うんこ"; } catch(...) { } ←コレもreturn 0とみなされるの?
>>319 「pのn番目」かなぁ。nは0から。あれ?
口頭だとぴーぜろ、ぴーいち
324 :
デフォルトの名無しさん :2013/11/04(月) 03:16:20.34
return ← これなんて読むの?
レットラン
リトゥーム
なんでたまにretrunになるんだろう retrまで左手でタイプして右手が追い付かないのか
>>327 左右の指を交互に1本ずつ折り伸ばししていくのが意外と難しいということ
>>313 普通に0番目の要素とか使ってるぞ
そして、0以外の場合は必ず0オリジンか1オリジンか添えてる
330 :
287 :2013/11/04(月) 08:14:17.51
>>296 先頭ページに"ISO/IEC 14882 First edition 1998-09-01"とあるな。
N1043ってことは1997/01頃のドラフトだから、そこから規格成立までの間に変わったって事か。
ってことで検索したらN1111にNBコメントへの対応として記録があったよ。
> Change [lib.global.names] from:
> ? Each name that begins with an underscore and either an uppercase letter or another underscore (2.11) is
> reserved to the implementation for any use.
> To:
> ? Each name that contains a double underscore (__) or begins with underscore and an uppercase letter
> (2.11) is reserved to the implementation for any use
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1111.ps
>>327 同時押し状態が存在するとキーボードによっては状態を正しく認識できない
俺の書いたコードのほうが美しいな
仕事手につかないどころか、捗っちゃうよ いいとこ見せたい
美しすぎない 普通
美しくても意味がない
コードの美しさの方が大事
338 :
デフォルトの名無しさん :2013/11/04(月) 20:14:55.25
でもこの人ハンガリアン記法らしいよ
かわいい子が汚いコード書いてるとか、興奮するじゃないか
>>339 美しすぎるうんコードなんて誰も注意できないな。最恐・・・
>>340 バカだなあ
叱りつける→優しくする→ギシアンだろ
疑心暗鬼ですね。
>>339 いいねえ実は引き出しの中はごみためだったとか
メソッドの呼び出しについて質問があります。 下記のTestクラス内で、値を返す int getNum() const と、参照を返す int& getNum() を定義したのですが、 int getNum() const が呼ばれることはあるのでしょうか。 呼ばれる場合はどのような処理になるのかもご教授いただきたいです。よろしくお願いします。 class Test { public: int num; public: int getNum() const { return num; } int& getNum() { return num; } };
>>344 Test t;
static_cast<const Test>(t).getNum();
というかそれ戻り値が違うからオーバーロードされてるわけじゃなくて(C++では出来ない)
const/非constメンバだからじゃん
346 :
344 :2013/11/05(火) 06:09:17.38
>>345 呼ぶことができました!ありがとうございます。
でもこれってオーバーロードされてないんですか?
>>345-346 これもオーバーロードだよ。暗黙の this ポインタも引数とみなされる形で。
int&f(Test&a){return a.getNum();}
>>345 普通にconst Test t;で良くない?
>>346 constメンバー関数としてオーバーロードされてる。
呼ぶクラスがconstの場合そっちが呼ばれる
>>348 返り値の型参照にしちゃだめだろ…
わからんか?本物のバカだな
352 :
344 :2013/11/05(火) 06:54:07.31
const Test test1; test1.getNum(); ↑でconstメンバ関数の呼び出しを確認しました。 constメンバ関数の必要性がやっと理解できました... ありがとうございました!
>>349 > 返り値の型参照にしちゃだめだろ…
自己レス
参照でも問題無かった。
constメンバー関数をいかに呼ぶかの話だったから引数にconst付いてると勝手に空目してた
getNumという名前に結びつけられた関数の趣旨が constと非constの違いで大きく変わるのが良くない
本筋ではないが名前と機能の関係以前に メンバ変数への参照を返すメンバ関数はメンバ変数に直接アクセスするのとどう違うのか?って話になるな
外部から変更される可能性があるよってフラグを立てるくらい
>>355 あとで内部ポインタ化と遅延評価が可能。
全くわからん。具体的な例を示してくれんか
たくさんのクラスから呼ばれるString型の値範囲チェックルーチンを作りたい。 C言語的なファイルにルーチンを置いておいて、各クラスから呼び出すようにすると 「それは手続き型だ」って言われるんだけど、オブジェクト指向的にするには、 文字列チェックのルーチンはどこに置けばいいの?
「それは手続き型だ」って言うJaバカに聞けば?
>>358 class NewsArticle {
Datetime& dt_;
Datetime& dt() { return dt_; }
ってやっておけば、あとから
class NewsArticle {
time_t t_;
Datetime* dt_;
Datetime& dt() { if(!dt_)dt_=new Datetime(t_); return *dt_; }
と変更することだって可能だろ。
生ポ
>>363 例なんだからそんな枝葉は本質じゃないような
「食わせる」なんて言葉使うやつって初心者が多いよなhw
全然スレッドセーフじゃないよね?
「食わせ者」なんだよきっと
メモリーイーター「mallocおいしいです」
>>367 5年も前の糞日記だ。ほっといてやれ
黒歴史放置されるとかなり迷惑だけどな
374 :
367 :2013/11/05(火) 16:47:12.93
了解、ありがとう。
>>367 もうこれでアウト。
> * Logger::info("いんふぉ", __FILE__, __LINE__);
> * Logger::debug("でばっぐ", __FILE__, __LINE__);
> * Logger::warn("わーん", __FILE__, __LINE__);
> * Logger::error("えらー", __FILE__, __LINE__);
>>361 ああ
> 内部ポインタ化と遅延評価
ってそういう意味でいってたのか
>>375 そんなゆうたらお前
> * Logger::configure("./logger.ini");
カレントディレクトリについて一通りの知識があるのかも微妙やで
ロガーなのに自分のは > // 例外はスルー クッソワロタ でもこれ以上黒歴史さらすのはかわいそうになってきた
ライブラリーの中でロガーは最大の堅牢さを求められる
平時にファイル閉じっぱなしのロガーライブラリーは… アプリの方でEMFILE ENFILEを起こしたとき、 その旨を記録しようとロガーを呼び出すと、 十中八九ロギングが失敗する。 送り先がsyslogでも同じ。 事前にダミーでルートディレクトリを開いて、非常用の数を確保しておけ。 その準備をしていないロガーライブラリーは、全部ゴミ。
>>375 そこは耐えたが LOTATE_SIZE と LOTATE_GENERATION はさすがにダメだった。
>>379 異常事態になったときのLogだめぽじゃだめだからな
shared_ptrってマルチスレッドで使っても大丈夫なのかしら なんかタイミング悪く2重開放とか2重確保とかしちゃったりいない?
間違えて途中で送ってしまったけど、内容的に十分だった。 標準仕様の方で、参照カウンタのatomicityは保証されてるから、MTSafeだよ。 ただし、中身のすげかえは別。
shared_ptrの参照先はスレッドセーフとは限らない(テンプレート引数の型がスレッドセーフに実装されているかに依る)
>>382 ロガー弱いと障害発生後に
「ログが残ってないので調査不可能。原因不明のまま調査終了」
となって、後が面倒だよなー
それをやって客にブチキレられて
ボーナス無くした部署があってだな
あれ以来ロガーだけはガチガチの社内ライブラリに頼ってる我が現場
それは悲惨だなあ でも、それ以前にお客さんブチ切れ寸前だったんだと思うよ(笑)
「ログが残ってないので調査不可能」なんて言った時点でブチキレられるのは当然
>>389 そういうときは嘘でも理由つけて"解決"するもんだ
ああ、ダメだって解っているさ。でも現場なんてそんなもん
でも、彼は何故スレッドセーフなどと思ったのだろう?
doxygenのメソッドコメントとかって、ヘッダーファイルと実装(cpp)、どっちに書くのが正しい?
>>394 ヘッダの方が統一感あって良い気がする
ヘッダだけで完結出来るしね
が、俺はcppの方にできる限り書いてる
ヘッダに書きたいけど実装に書いた方が楽なんだぁ サマリーだけヘッダに書く手もあるけど
ヘッダの文章をちょっと書き換えただけで、全部リコンパイル
>>394 面倒だから実装に書いちゃってるけど、ヘッダに書くのが正しい気がする
結局QT形式とjavadoc形式、どっちが正義なの?
アスタリスク書いてられんからQt
>>394 俺はcppのほうだな
ヘッダは画面に収めて俯瞰したいのと
日本語(ascii範囲外)の文字を入れたくないから
コメントを全部英語で書ける人ならいいが
>>401 ASCII範囲外の文字が入っていたら、どういう不都合があるの?
403 :
デフォルトの名無しさん :2013/11/06(水) 13:57:52.05
最近のdoxygenって.NETのxmlコメントにも対応してるの?
>>402 //コメントで改行した末尾文字がシフトJISで0x5cだと別環境で悲惨な事になる
へー、doxgenって今時英語以外に対応できないウンコなんですね
この板ではうんこはQzの代名詞なので別の表現にしなさい
>>404 それはヘッダーからcppファイルに移すことで解決するの?
>>402 VCのリソースコンパイラがUTF-8に対応してないとか
純ASCIIだったら気にする必要がない
SJIS問題はCP932で解決するんだっけ
世界で最も不合理なコードだな
>>410 ほんと誰が考えたんだろうね。この糞文字コード
業務の環境からSJIS消えて、早くも10年 いや、そんなに経ってないか mysqlでは一通りのトラブルに遭遇させていただきました libmysqlclientのわずかなバージョンの違いがSJIS扱いをバグらせたり
413 :
デフォルトの名無しさん :2013/11/06(水) 21:03:23.35
auto i = std::equal_range( first, last, val ); でvalが存在しない場合の挙動で i.first == last && i.second == last であるのは保証されてますか?
414 :
デフォルトの名無しさん :2013/11/06(水) 21:33:57.63
lower_bound と upper_bound のペアが返されるんだから i.first == i.second だけ val が挿入されるべき位置
416 :
デフォルトの名無しさん :2013/11/06(水) 21:52:25.79
じゃあvalが一番大きい時はlastになりますか?
>>413 http://www.cplusplus.com/reference/algorithm/equal_range/ The behavior of this function template is equivalent to:
template <class ForwardIterator, class T>
pair<ForwardIterator,ForwardIterator>
equal_range (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator it = std::lower_bound (first,last,val);
return std::make_pair ( it, std::upper_bound(it,last,val) );
}
これで考えてみればわかるだろ
418 :
デフォルトの名無しさん :2013/11/06(水) 22:13:02.60
419 :
デフォルトの名無しさん :2013/11/06(水) 22:19:12.75
>>410 UTFの方が、夫々の言語体系を無視してるってだけの話。
しかし半角カナなんてものを1バイト領域に残す価値なんて S-JIS策定当時からあったのだろうか
互換性のために必要だったんだろ。
コピーコンストラクタで、constメンバを初期化するのって、どうすればいいの?
MS-DOSの日本語版作るのに急いでやんなきゃならなかったんだろ
むしろ既存のデータと互換性のない文字コードに当時何の価値が
>>524 コピーコンストラクタにもイニシャライザを書けるのか!ありがとう!
>>426 同時期にでけたEUC-JPが種々の問題をスルーしてることを考えたら
糞っぷりには何の疑いもない
すでに1バイトカナのデータが蓄積されていて それを2バイトに変更するとプログラムの修正を一気に行わねばならず また漢字に3バイト使えるほど記憶容量の余裕が無かった ってとこかな
EUC-JPってDECだっけ カナのデータなんて無かったんじゃないの
>>428 は会話のキャッチボールができないコミュ障
あったよ、3バイトで表現
>同時期にでけたEUC-JP え? そう思ってるのはシフトJISをShift_JISにすり替える安岡信者だけでしょ
>>432 3バイトカナは知らない人も多かった
そもそもEUCで3バイトはあり得ない!
とか言われたこともある
辛い記憶が
3バイトは奇数アドレスでアクセスするとバスエラーになるハードウェアがあるからじゃね? つまり3バイトでpack出来ないマシンがあるわけだ だから「本当は4バイトもいらないんだけど、1バイト無駄になるなら4バイトにしてしまえ」と 言う事っしょ
>>435 そりゃ3バイト固定長文字コードがもしあればの話だ
可変長文字コードじゃどうあっても1バイトアクセス
…3バイト固定長って内部表現としてそう悪くないんじゃないかと思うんだけどどうよ
弄るのも計るのも楽だし、UCS-4ほど嵩張らないしさ
>>435 インテルx86は奇数アドレスに多バイト整数アクセスしても
バスエラーにはならないが、やる奴はシロウト。
まっとうなプログラマーはそんなKUSOで
動作未定義でクソ遅いコードは書かない。
>>436 packの意味も分からないって・・・
だから3バイト毎に配列作ったとするよ、一つ置きに奇数アドレスからのアクセスになるだろ?
まだわかんねーのか
>>438 いたずらにバスサイクル増やすだけだしな
>>435 ワードが奇数アドレスにあっちゃダメってのはわかるけど、単に奇数アドレスアクセスでエラーになってたらどうすんだよ?
442 :
デフォルトの名無しさん :2013/11/07(木) 22:08:53.34
>>435 頭悪い発言させるスレ立ててそっちでやってくれ
void foo(int* begin, int* end); って関数にstd::vector<int> v のbeginとendを入れたいときどう書いてる? foo(&*v.begin(), &*v.begin() + v.size()); は悲しくなる。
>>443 一番素直な書き方じゃね?
ただ要素数ゼロの時がまずいような
じゃあ if ( v.size() == 0 ) throw "unko"; foo(&v[0], &v[0] + v.size());
まずくないだろ foo内で for ( auto it = begin; it < end; ++it ) ってなってると思われる。
要素が空のときv.begin()を逆参照したらいかんだろ fooに渡す以前の話
>>443 foo(&v.front(), &v.back());
foo(v.data(), v.data() + v.size());
>>448 空の時にfrontは呼び出してはいけませぬ
呼び出すとどうなるの?ケツから味噌汁でも出てくるの?
yes
そもそもbackはendの代わりにならないんですがそれは・・・
んなこたーみんなわかってる
fooのインタフェースを変更する
vector::iterator だけを対象にしてるわけじゃないだろ
>>445 俺これ嫌い
> if ( v.size() == 0 )
458 :
デフォルトの名無しさん :2013/11/07(木) 22:53:54.98
_____________________
>>435 ∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ こいつ最高にアホ
彡、 |∪| /
/ __ ヽノ /
(___) /
459 :
136 :2013/11/07(木) 23:05:25.41
base()だめなの? ポインタとは限らないから?
別スレのが出てしまった。忘れてくれ。 foo( v.begin().base(), v.end().base() );
素直ならこうだろ foo(&v[0], &v[v.size()-1]);
>>461 gnu-stlの実装依存だった。
revervse-iteratorだけが持ってる奴とは知らなかった。
つまりgnu何とかとやらは 普通のイテレーターとreverseで base()の意味が異なる糞という訳ですね。
465 :
デフォルトの名無しさん :2013/11/07(木) 23:40:44.20
GNUが事実上の標準。 C++規格は紛い物。
>>464 普通のイテレータに、勝手につけてるだけだと思う。
意味が異なるわけじゃない。
まさかGNU何とかとやらは vector<unko>::rbegin()で返されるイテレーターのbase()がunkoになるのでしょうか
>>439 頭おかしいのか?
packの意味が分からないなんて話がどこから出てきてる?
>>462 範囲の一番後ろの一つさらに後ろをendにするんだから
それじゃおかしいだろ
どっちにしろvectorが空のとき参照はずしがダメだってならどれもNGだな
>一番後ろの一つさらに後ろをendにする
>>469 の脳内ではそうなのだろう
>>443 はそんなこと一言も言っていない
参照はずしって何だ? ポインタとか配列とか、使わなさすぎて忘れちゃったか?
まさかgnu何とかとやらは vector<unko>::rbegin()で返されるイテレーターのbase()がunko*型になるのでしょうか
>>443 > void foo(int* begin, int* end);
> って関数にstd::vector<int> v のbeginとendを入れたいときどう書いてる?
template<typename T> void foo(T begin,T end);
> foo(&*v.begin(), &*v.begin() + v.size()); は悲しくなる。
foo(v.begin(), v.end());
参照はずし?逆参照?
>>477 void foo(int* begin, int* end); って関数
>>476 GNUはISO規格より自分が正しいと盲信する処理系だからきっとbase()の仕様が違う
void foo(int* begin, int* end); void foo(vector<int>::iterator begin, vector<int>::iterator end) { if(begin!=end)foo(&*begin,&*end); } foo(v.begin(), v.end());
>>476 試してみた。
vectorのrbegin()で取ってきたのは、iteratorが返ってくる。
型指定してポインタ渡して生成すると、ポインタが返ってくる。
C++03の仕様も見てきたけど、中身返すだけだからこれで問題ないはず。
無理にiterator使おうとするから変になる operator[]が一番直感的じゃないか
>>483 base()が返すのは中身じゃなくてイテレータじゃないのか?
>>482 それはbegin==endの時に元のfooと挙動が変わるからNG
普通begin==endなら何もしないだろ? foo(&*v.begin(), &*v.end()); でいいだろ
普通って何だ
普通っていうかfooはそうなっているべきだろ begin==endは空という意味以外にありえないと思うけど
>>486 にプログラムの改修を任せると
妄想で勝手な修正をするので危険
>>485 中身かつイテレータが返されるようだから、
「中身じゃなくて」は間違いで、「イテレータが返される」は正しい。
仕様にはポインタもイテレータとして扱えることが保証されると書いてある。
&*v.end() って大丈夫なんだっけ?
ダメれす
>>489 じゃあ空の時にどうやってfooを呼び出すっていうのよ?
fooのbegin==end時の振る舞いが明記されていない様な糞環境なら
482でいいだろ
>>490 >仕様にはポインタもイテレータとして扱える
扱えたら
>>460 が正しいコードだと言いたいのかおまいは
>>493 おまえアホか
要素数1でbegin()とbegin()を渡されたらどうすんだ
第一、中身が不明だからこそ
元の挙動が最低限保持されるように修正するんだろjk
beginとendを渡される関数は 「begin==endのときは何もしない」が正しい設計
>>496 begin==endの時に出すようにしていたログが出なくなりました
とか
begin==endはあり得ないパターンなのでassertで落とすようにしてましたが動きがおかしくなりました
と苦情が出たらどうするんた低農
>>491 vectorが使えねー理由の最大はそこだよな。
は! &*v.endはダメなのか。。。 じゃあ空チェックした上で foo(&*v.begin(), &*v.begin() + v.size()); しかないね
そういうのは設計がおかしい(とボクは考える) ↓ (ボクの考える)おかしな設計はあり得ない前提でプログラム修正する こういうクズは他人に迷惑をかける前に死んだ方がいい
vectorを丸ごとコピーして修正して そのあたりの問題を解消した新vector使ってしまえば解決だろ
>>502 > (ボクの考える)おかしな設計はあり得ない前提でプログラム修正する
日本語でヨロシク
if(!v.empty()) foo(&v[0], &v[v.size()]); の方が短いか
>>497 > begin==endはあり得ないパターンなのでassertで落とすようにしてましたが動きがおかしくなりました
この部分、何を言いたいのか全然分からん
落ちる筈の所で落ちなくなったということ
>>502 なにファビヨってるの?
もしbegin==end時の挙動が明記されてない糞関数を関数使わなきゃいけないハメになったら
実際に確かめるか、空チェックするから、心配なく
>>494 正しいなんて一言も言ってないが。
だから、gnu-stlの実装だけと言ってる。
>>506 v[v.size()]は範囲外アクセスになるじゃねーか
514 :
デフォルトの名無しさん :2013/11/08(金) 01:28:36.94
>>510 おまえ本当に頭が悪いな。
begin==endだと困る関数fがあったとして
begin==endをチェックしてプログラムを落とすようになっていたとして
>>482 の糞改修によって
end()でない同一のiteratorが渡されたときに
エラーチェックが発動しなくなったら困るだろ?
返り値があるならまだしも void foo(Type begin, Type end); の姿になってる関数は、begin==endのときは呼ばないのと同じ結果になるべき
>>515 > begin==endだと困る関数fがあったとして
> begin==endをチェックしてプログラムを落とすようになっていたとして
ありえんだろ。そんな設計
業務ロジック上同一になることがあり得ないという妄想がどこから来たのか
>>513 なるほど
begin==endで問題が出るようなfooちゃんなら、endがアクセスできない時もどうなるか分かったもんじゃないな
>>515 そういうレアな要求があるなら、その要求に合わせて
>>482 で追加された関数にもチェックを入れて落とすようにすれば済むだけじゃないの?
チェック入れれば済むだけのことなのに、君は何で新たに追加された関数にチェックを絶対に入れるもんかの精神になってるんだ?
>>515 そういうおかしな関数を設計する人は少数派なので、
そいつを辞めさせれば解決する問題
>>520 fooの中にどんな処理があるか不明なのに
追加した呼び出し側にわざわざコピペするという方針は変だろ。
どうして「可能な限り元の挙動やセマンティクスを保持する」
ことを嫌うのか不思議。
>>522 fooの仕様を知らないのにfooのラッパー関数を書けるわけがないと言っているようだが、
それならfooの仕様も知らずにそれを呼び出すコードだって書けるはずがないよな。
これから呼び出して使おうとしている関数の仕様を知らないという前提で物事考えてるのはおかしくないか?
もし、fooで空チェックして特別な処理する仕様(エラーメッセージ出すとか、ログするとか) なら当然それが明記されていなければいけないわけで。。。 挙動がわけ分からんfooちゃんを「正しく」使うなど不可能だから
>>522 > どうして「可能な限り元の挙動やセマンティクスを保持する」
> ことを嫌うのか不思議。
それを実現しようとした場合、どんなコードになる?
>>515 が言ってるのは、元のfoo()の中でaseert(begin!=end)してたらって話だと思うよ。
レアでもないだろう。
>>527 引数チェックにassert使うのはそもそも間違いなのだが。
>>526 if ( v.empty() )
もとのfの仕様を確認必要
else
foo(&v[0], &v[v.size()]);
>>528 挙動が変わって困る例の揚げ足を取るなよ
例外スローならお気にめすのかい?
>>529 そんなチェッカー付きの呼び出しをあちこちに書くくらいなら
ラッパー関数方式を採用してラッパー関数の中にチェッカー入れた方がマシだな
>>449 が正解だろ?その後のグダグダは何なの?
>>529 お前は
>>482 の関数にチェッカー入れることに対してはナンダカンダの理由付けて否定しておきながら
同じチェックを呼び出し側に入れるのは平気なんだな。
わけからんよ
534 :
デフォルトの名無しさん :2013/11/08(金) 02:01:20.72
>>524 >これから呼び出して使おうとしている関数の仕様を知らないという前提で物事考えてるのはおかしくないか?
全くおかしくない。
関数呼び出しは関数インターフェースという、
呼び出す側と呼ばれる側とのcontractによってなされるべきもので
関数の中身まで全知全能という前提は止めるべき。
>>535 使えるでしょ。 data() も size() も空の vector に呼び出して問題なし。
>>536 begin==endで呼ぶとどうなるかは関数仕様の基本的な要素。
呼ぶ側がそれを知ることを全知全能呼ばわりしてはいけない。
>>538 デリファレンスもないし完璧だけど、C++11だからスルー。
>>538 NULLポインターを渡すことになるのでは?
fooがそういう呼び出しを許容していることが確定してるならいいけど
542 :
529 :2013/11/08(金) 02:08:39.61
>>533 >同じチェックを呼び出し側に入れるのは平気
そりゃ要素数0の時にfが何を期待してるかにクリティカルに依存するからね
もともと要素数ゼロに対応しないように見える関数だから
ちなみに
>>482 は要素数ゼロとbegin==endか等価ではないよ
>>528 このまま流れが立ち切れる前に、ぜひ理由を教えてくれ。
外側のAPIでもない限り、使っても問題ないと思うんだが。
>>529 > if ( v.empty() )
> もとのfの仕様を確認必要
> else
> foo(&v[0], &v[v.size()]);
このような呼び出し元チェックなら問題なくて、
void foo(vector<int>::iterator begin, vector<int>::iterator end)
{
if(begin==end)
もとのfの仕様を確認必要
else
foo(&*begin,&*end);
}
foo(v.begin(), v.end());
というラッパー方式は駄目だと言ってんだよな?
理由が全然分からんけど
545 :
529 :2013/11/08(金) 02:15:46.31
C++11なら if(! v.empty()) foo(v.data(), v.data() + v.size()); の一択
548 :
529 :2013/11/08(金) 02:17:20.51
>>546 要素数ゼロとbegin==endが等価ではないからね
>>545 なんだそりゃ。
擁護してたのが馬鹿みたいだ。
おおう、スレ更新してなかった ゴミ書いてすまん
>>548 (1)「要素ゼロ」かつ「begin!=end」
(2)「要素ゼロではない」かつ「begin==end」
のいずれがありえるの?
>>544 でもって、ラッパー方式が駄目なのは、fooの仕様が分からないから
ラッパー内のチェッカーが書けるはずがないから。
553 :
529 :2013/11/08(金) 02:25:13.92
>>546 補足しておくと、482において
・f(v, v+1) のケースは問題ない
・vが要素数ゼロの時はそもそも対応していないように見えるので確認が必要
・f(v,v)は挙動が変わる
この最後のケースが問題だと言っている
>>553 vの型はstd::vector<int>だよな
555 :
529 :2013/11/08(金) 02:32:06.50
ああ間違えた 544ならおk begin==endで無条件にスルーしなければ
556 :
529 :2013/11/08(金) 02:35:19.81
>>554 紛らわしい変数名を使ったすまぬ。
↓ 訂正
>>546 補足しておくと、482において
・f(array, array+1) のケースは問題ない
・vが要素数ゼロの時はそもそも対応していないように見えるので確認が必要
・f(array, array)は挙動が変わる
この最後のケースが問題だと言っている
もうそれ確認以前に、fooラッパーも外でチェックすればいいじゃないの? fooは元々そういう想定なんでしょ?
fが同一の有効ポインタを渡されたときに何をしたいか不明なのに何をチェックするのよ?
>>548 > 要素数ゼロとbegin==endが等価ではないからね
何が違うんだ?
>>555 お前、520じゃねーの?
やたらと矛盾だらけに見えるんだが
>>556 いやいや、その話は既に
>>520 で指摘されてるはずだが。
ラッパー内にチェッカーを入れれば済むだけのことだろうと。
それに対して522=529が否定してたんだよな?
562 :
555 :2013/11/08(金) 02:54:15.33
>>562 で、結局
(1)「要素ゼロ」かつ「begin!=end」
(2)「要素ゼロではない」かつ「begin==end」
のいずれがありえるの?
>>562 > 3つ前のレスくらい読んでくれ
どこを読んでも
「要素数ゼロ」と「begin==end」が一致しない理由なんか書かれてないわけだが
>ラッパー内にチェッカーを入れれば済むだけ
fの中に(同一の要素へのポインタを渡されたときに)
どんな壮大なコードがあるかもわからないのに
チェッカーを入れるだけって、、
>>563 後者だよ。
vが要素数1でも&v[0]を二つ渡せばbegin==endでしょ。
訂正 vが要素数1でもv.begin()を二つ渡せば
>>555 > 544ならおk
いやいや、それはおかしいだろ。
544に書かれてる「おまえはこれを否定してるわけだよな」の話はお前の今までの意見をまとめ上げたもので、
それをいきなりひっくり返したら
497以降のおまえの発言は全部自己矛盾だぞ。
これでいいじゃん template <class T> T wrapFunc( const std::function<T(T*,T*)>& func, std::vector<T>& v ){ return func( v.data(), v.data() + v.size() ); } ... if( v.empty() ) ;// 論外の話なのでスルー else wrapFunc<int>( foo, v );
>>565 > >ラッパー内にチェッカーを入れれば済むだけ
> fの中に(同一の要素へのポインタを渡されたときに)
> どんな壮大なコードがあるかもわからないのに
> チェッカーを入れるだけって、、
ならば、どういうコードにすべき?
570 :
デフォルトの名無しさん :2013/11/08(金) 03:09:00.29
ラッパー内にチェッカはないわ 入れねえだろ普通
>>569 if ( v.empty() )
もとのfの仕様を確認必要
else
foo(&v[0], &v[v.size()]);
こうすればいい
>>571 v[v.size()]が領域外を示してる
>>565 > vが要素数1でも&v[0]を二つ渡せばbegin==endでしょ。
vの要素数は関係ない。
begin==endで渡されたら、beginとendとの間の要素数はゼロ。
if ( v.empty() )
もとのfの仕様を確認必要
else
foo(&v[0], &v[0]);
おまえの想定する状況はこれだ。
vの要素数を確認することに意味がないことくらい分かるだろう。
>>522 > fooの中にどんな処理があるか不明なのに
> 追加した呼び出し側にわざわざコピペするという方針は変だろ。
話が枝葉に散らばってるが、発端はこの論の是非なんだろ?
で、この主張してる人が
// 良いコード例
if ( v.empty() )
もとのfの仕様を確認必要
else
foo(&v[0], &v[v.size()]);
// 悪いコード例
void foo(vector<int>::iterator begin, vector<int>::iterator end)
{
if(begin==end)
もとのfの仕様を確認必要
else
foo(&*begin,&*end);
}
foo(v.begin(), v.end());
この例でいうところの、前者は問題ないが、後者には問題あると修正してる。
これはあってるよな?
ラッパーにチェッカー入れるのは悪いこと ラッパー書かずに呼び出し元にチェッカー入れるのは良いこと ということなんだろ
>>575 fooの中にどんな処理があるか不明なのに
ラッパーにチェッカーをわざわざコピペするという方針は変だろ。
ラッパー否定論者さんは、どの発言を読んでも他の複数の発言との間で矛盾してるようですね。 プログラマに向いてないのでは?
チェックしないラッパーを書いて、呼び出し元でチェックでいいだろ なんでラッパーの中でチェックすんだよ 一貫性無いだろ
>>578 直接元のfooを呼ぶ場合はfooの中にあるチェッカーを利用して、
ラッパーfooを呼ぶ場合は呼び出し元が元のfooがやってるチェックをするってこと?
なんか盛り上がってんな 俺もまじゃりんこしていいの?
>>566 要素数1でv.begin()を二つ渡すって?
じゃあ要素数がn個のときはv.begin()とv.begin()+n-1 を渡すのかよ
どんなアホがそんなことするんだ?
584 :
582 :2013/11/08(金) 07:03:22.98
okと言われていたのは==でなくてemptyチェックか、 スレ汚し失礼…
>vの要素数は関係ない いやあるよな 「データが1件以上あるけどfに渡したい範囲がたまたま空だった」 と 「データが1件も無い」 は別に決まってる 前者は配列版でもあり得るけど後者はvectorにしたから起こり得る いずれにせよ前者の時の挙動を真似するコードをラッパーにコピペはいただけない
誰か
>>543 に答えてやれ。
俺は関数内部(原因は関数自身)の矛盾がassertで、
呼び出し側の問題は例外や戻り値が良いのではないかと思う。
実行時チェックを省くことに価値がある部分なら 「空の要素数で渡すな」って約束しておけばassertでもいいだろ あと関数内部の矛盾ってなんだよ。矛盾起こすなよ
>矛盾起こすなよ キチガイあらわる
assertせずになるべく例外投げてくださいお願いします 極端な奴だとリリースで消えることすら知らなかったりする
Javaなら不正な値が渡されたかいちいちチェックして例外投げるけど C++なら不正な値が渡されたら未定義動作でいいと俺は思っている
消えないassert()をdefine すればいいだけ
>>592 違う意味になる関数ならわざわざ名前をぶつけなくていいじゃないか
594 :
デフォルトの名無しさん :2013/11/08(金) 20:36:13.05
ガベコレとかポインタの循環参照とか例外とか、 アマチュア(自分)が普通気にしないような話をちゃんと書いてある本でお薦めありませんか? 言語は特にこだわりません。 スレチだったらごめんなさい。
スレチ
596 :
デフォルトの名無しさん :2013/11/08(金) 20:39:26.52
スダチ
アマチュアでもそれくらいは気にしとけw
自分はC++使ってるんですけど、言語固有の問題じゃない気がして、何かいい勉強の種はないかなぁと。
すみませんでした。推薦図書っていうすれがあるんですね。移動します!
そんなスレあったのかw
ガベコレとかポインタの循環参照とかはlispを作る話かな
言語の根幹を知りたいなら言語の作り方を調べればいいよ
603 :
デフォルトの名無しさん :2013/11/08(金) 21:17:39.09
俺のガベージコレクションを見てくれ!とか言われて見に行ったら 川で拾った石ころとか浜に流れ着いた木の棒とか見せられる。 そんな感じだと思った。
GCのリファレンスカウンタとか循環参照の取りこぼしにはマークスイープだとかそういうことが知りたいなら
>>602 は決して極論じゃないからな
template <class IT> typename IT::pointer iter_cast(IT it) { IT zero = IT(); typename VIT::pointer null(0); return null + (it - zero); <--- A } std::vector<int> v; int*p iter_cast(v.begin()): これでイテレータをポインタに変換できると思ったら A の引き算箇所で実行時エラーになるのな。 どこまでも頑ななやつw
foo(POINT* begin, POINT* end); //何か描画 こういうのがけっこうあるんだよなあ。
Compound Literalsで行こう
ふと思ったんだが std::vector<int*> std::vector<void*> がある場合、両方とも具体化されるんだよな ポインタのサイズは固定だから余計なものが作られないようにはならんかな
>>608 自分で共通ポインタ型作ればいいんじゃないの
最適化フェーズでどうにかならないのかな
std::string str = "a:\\b\\c\\d\\e\\f\\g.txt"; からg.txtを抜き出そうとしましたが泥臭いやりかしか出来ません・・・ std::string str = "a:\\b\\c\\d\\e\\f\\g.txt"; std::string::iterator itr,itrFound; itrFound = str.begin(); while((itr = std::find(itrFound+1,str.end(),'\\')) != str.end()) itrFound = itr; std::string s(itrFound+1,str.end()); カッコいいやり方はありませんか? vs2008です
rbegin/rend
boost::filesystem::path p("a:\\b\\c\\d\\e\\f\\g.txt"); std::cout << p.filename();
str.substr(str.find_last_of("\\/")) ただし、Shift_JISのようなマルチバイト文字列だと\問題が起こって使えない
Win限定ならPathStripPath
2008ならregexも使えるか。ただし、Shift_JIS〜 static const std::regex re("[^\\\\]+$"); std::string s; std::smatch m; if (std::regex_search(str, m, re)) { s.assign(m[0].first, m[0].second); }
複数配列a[3][4]などのメモリ上の並び方ってなんか覚え方あるかしら
一番右から並んでいく
>>617 変数から遠い順に型なんです
int a[3][4]
これは
int (a[3][4])
えーと、a[][]に該当するのがint型なんです
続いて
int (a[3])[4]
えーと、a[]に該当するのは、intが4つ並んだ配列という型なんです
続いて
int (a)[3][4]
えーと、aに該当するのは、「intが4つ並んだ配列」が3つ並んだ配列という型なんです
画像とかは、a[y][x]で格納することが多いね a[y=0][x=0],a[y=0][x=1] の順に並んでいく
画像なんかは単純な配列で表現するわ 関数に渡すときに一貫性がなくなるから。
>>608 >>610 同一内容関数を複数のシンボルで共有するって最適化が掛かってれば消えるな。
型に依存する定数や関数を参照してたら多分消せないけど、そういうのが無い部分はOK。
昔から存在してる最適化だし今でも有効だろ。
std::vector<int> v; if(v.end() == std::find(v.begin(),v.end(),elem)) { v.push_back(elem); } if()の中身長くなりすぎじゃね なんとかならんかったのか
if (boost::find(v, elem) == v.end()) v.push_back(elem);
いちいちO(n)探索すんな、みたいなのはまあ別の話
for (auto elem : v) { if (elem == v.end()) v.push_back(elem) }
>>625 そのコストが気になるなら別のやり方するでしょ
>>626 そのforはなんか落ち着かないわ今でも
>>625 algorithmなんて大層な名前ついてるのにO(n)なの?
テンプレだからソース見りゃわかるが すごい簡単なことしてるだけだからな
なんか大層なことをやってるのかと思ったら そんくらいならvectorに入れておいてくれよ・・・
vectorには入れなくていいだろ
いや、なんでベクターにないのか素直にわからん 外でできることは外でやるポリシー?
vectorに入れたらほかのコンテナにもないとおかしいだろ?
そうしたらコードが重複して無駄になるし、コードを修正するときにほかのコンテナに組み込んだソースも修正しなきゃならん
>>633 は便利だからってクラスに機能詰め込んで一つのクラスが膨れ上がってるんじゃないか?
>>633 おんなじ実装がlistやその他 iterator と operator== 装備してるクラスで使えるから
メンバにする理由がない
何でもメンバーにしたがるのは一種のオブジェクト指向病
>>634 >ほかのコンテナにもないと
なんで?普通にlistにあってvectorにないメソッドとかあるよね?
>>635 あーなるほど
しかしなんか釈然としないな
>>636 逆じゃね?
コンテナとアルゴリズムを組み合わせるのがC++流なんだよわかれ
O(n)以下にしたいならmapとかsetとかbinary_searchでも使えば?
listにのみ存在するメソッドは、listの実装の都合上<algorithm>の関数のコンセプトを満たせないことがあるから特別に実装されている アルゴリズムがM種類、コンテナがN種類存在するとき、それぞれのコンテナに全てのアルゴリズムを実装すると全部でM*N種類の実装が発生するが、コンテナとアルゴリズムの間にイテレータを挟むことで実装個数をM+N個まで削減することが出来る
>>641 たしかに list のソートとか別にあるね
std::listはmergesortだっけ std::stable_sort()の必要要件がRandomAccessIteratorだからメンバ関数で持つ必要があったわけね
なんか汚いよな <algorithm>の方を特殊化で対応するわけにはいかなかったんだろうか?
いちいち特定コンテナに構ってたらalgorithmのほうが複雑化するだろ
std::advanceってどのようなときに使うの? イテレータに+−じゃ駄目なの?
647 :
デフォルトの名無しさん :2013/11/10(日) 15:26:11.99
std::listやstd::mapのイテレータはランダムアクセスイテレータでないので、+や-演算子で特定の数だけイテレータを進めることが出来ない(ループで書く必要がある) std::advanceは、引数がランダムアクセスイテレータならば直接加減算、その他の場合はループで進めてくれる便利な関数である
operator+じゃだめなの?
650 :
デフォルトの名無しさん :2013/11/10(日) 15:50:12.98
InputIteratorには+はないじゃん
>>644 > <algorithm>の方を特殊化で対応するわけにはいかなかったんだろうか?
listのsortはコンテナ内のノードのリンクに対する変更であって格納されてる値そのものは変更されない
(なので(あまり意識されてなかったけど)コピー(・ムーブ共に)不可のクラスのlistでもsortできる)
一方algorithmのsortはイテレータの参照先の値そのものを変更するところがlistのsortと根本的に違う
そのためalgorithmのsortの作法に従うと特殊化してもlistのsortの利点を無くすし
listのsortの利点を残すためには加えてイテレータの高機能化が必要だけどそれは結果に対してコスト他で割に合わない
といった理由がある
この辺はちゃんとデータ構造とアルゴリズムの勉強してないと疑問に思っちゃうんだろうな ゆとりはプログラム組む前に勉強しろ
大学の講義でも一本うけてこい
ちゃんと勉強、ってほどの内容じゃないけどな
じゃあeffective stlでいいか・・・
>>656 データ構造とアルゴリズムが勉強じゃなけりゃ何が勉強なんだろう・・・
しっかり学として学ばないとすぐに迷信に堕ちるぞ
データ構造とアルゴリズムは、他の言語でも応用が利くから学んどいても損はないな
>>658 いや数日で終わるようなことを「ちゃんと勉強」というのかってこと
662 :
デフォルトの名無しさん :2013/11/11(月) 14:08:32.97
地道な積み重ね
「線形代数を復習しなきゃ・・・」 「確率・統計の基礎をおさえとかなきゃ・・・」
mfcでメイン画面に複数のボタンを設置して それぞれ全く別の画面を表示させて処理をするようなシステムを作っています。 規模的にはそんなに大きくはないのですが、 機能は全く別なので、それぞれdllにして分けた方がいいのでしょうか? また、分けるならそれぞれのdllでシングルドキュメントの実装ができればと思っているのですが、可能でしょうか? ダイアログベースでもいいのですが、なかなか融通が利かなくて 使いづらいというか、win32でやってた方がやりやすいような気がするのですが、 ダイアログベースのうまい使い方とかあれば是非教えていただきたいです。
dllって普通モジュールやコンポーネントをまとめるもんじゃない? 外装ごとにdllつくるってなんか違う気がする
めんどい
微妙にわからんが、DLL単位で交換できるメリットを出せるなら
ビヤーネ・ストルブストルップがC++を開発したってどういう意味なんですか? 彼がコンパイラを作ったって意味? 彼作のコンパイラなんて見かけないですが・
仕様を考えたって意味だろう
cfrontをぐぐれ
>>668 C,C++は朝鮮人のhogeという奴が作った。覚えとくように
>>671 ハァ?C++はデンマーク人のhageなhigeが作ったんだよ。忘れんな
673 :
デフォルトの名無しさん :2013/11/13(水) 07:49:28.00
>>672 hageなhigeを専門用語でhogeというんだよ
>>679 ::TerminateThread(hoge, 0);
長い長い連鎖あぼーんだこと
682 :
デフォルトの名無しさん :2013/11/13(水) 19:57:12.18
c++11で導入されたSTL使ったプログラムをg++4.8.1でコンパイルすると「-std=c++11」つけろって怒れたので、オプションつけたら g++: fatal error: no input files compilation terminated. って言われたんですが、ubuntuでg++でc++11をコンパイルするにはどうすればいいんですか?
>>682 はあ?
他人でも再現できるように説明しろよ
>>682 今のubuntuでc++11ならg++は使わないよ
clang++だよ
>>680 std::thread(hoge,"hoge");
685 :
デフォルトの名無しさん :2013/11/13(水) 20:17:30.63
//WinDef.h ... #define far #define near ... なんなんだよおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお
mfcのコンボボックスって動的に生成すると高さ変えれないんですか? CViewクラスのOnCreateで CComboBox *combo = new CComboBox(); combo->Create(WS_VISIBLE, CRect(0, 0, 100, 20), this, ID); として生成してるんですが、 CRectの値を変えても、SetWindowPosしても、MoveWindowしても変えれなくて、 BS_OWNERDRAWを設定してOnMeasureItemでitemHeightの値を設定しても全然高さが変わってくれません… 他のエディットテキストやスタティックテキスト等のコントロールより高さが微妙に高くて 見た目が悪いのでスマートな細さにしたいんですが、何か方法はないですか? ちなみにフォントも小さくしてみたのですが、変化が無くどうしたらいいのやらさっぱりです…
>>686 Win16の名残
多くのポインタ類にNearとFarの区別があった
>>687 コンボボックスの中にエデットコントロールがある
以下の条件を満たす場合は、デストラクタが例外を投げることが許される。 ・解放する必要のある資源をひとつも持っていない。 ・他で発生した例外に巻き込まれている渦中においては、自身のデストラクタで例外を投げることは決してない。
691 :
デフォルトの名無しさん :2013/11/13(水) 21:51:03.95
ゲームだと全く例外使わないんだけどお前ら何に使ってるの?
>>689 中にエディットコントロールとはどういう事ですか?
そのエディットコントロールの高さも変えないとコンボボックスの高さも変わらないってこと?
>>682 ISO/IEC 14882の1998,2003,2011のいずれにも
STLなどというものは登場しませんが
何のことを言っているの?
>>693 子ウィンドウになってる
GetWindow
CBEM_GETEDITCONTROL
STLは俗称として普通に使っても良いとは思うけど、 682が何のことを言っているのかは確かに分らんわ
int a[N]; int b[N]; とサイズの等しい配列が2つあった場合、それぞれの配列の合計を算出したい場合 std::accumulate(a, std::accumulate(b, と後輩が書きやがりました。あたかもC++知ってますと言わんばかりに・・・ for { suma += sumb += } としたほうが、ループを1回しか回らないので明らかに速いと思うのですが どう思われますか? VS2008(2010以降ではありません)
とりあえず時間を計ってみる あんま変わらんと思うけど
普通に考えたら後者の方が速くなることが期待できるだろう。 見さすさや保守性、バグの起きにくさ、要求仕様との対比 まで考慮した上で速けりゃいいかどうかは 別だとは思うけど。
後輩の方がC++知ってて悔しかったのかな
>>698 計測する必要はないでしょ
前者のほうが速いなんてことはありえない
ループを倍回るし、呼び出しのオーバーヘッドもあるし
前者のほうが見やすいから前者の勝ち intの足し算なんて量が多けりゃ読み出しが追い付かないし 少なけりゃ速度を気にする必要はない
キャッシュに入りきらないような巨大な配列の場合 2回に分けたほうが速いってことは無いんかな
ヘッダに書いてあるからと言って
キャッシュに入りきらない事態が2度起こるって考えると・・・
>>690 例外を投げるデストラクタはいかなる場合でも許されない
ってじっちゃが言ってた。
>>703 インラインとか関数オブジェクトとか無い世界から来たんだろう
キャッシュを設計する人の気分になったら この例でキャッシュヒット率は同じ筈
っつうかそんなクリティカルな動作が必要な箇所なのかと 昔Cは遅いからアセンブラでって言ってた人思い出したわ
a[N]とb[N]がともにでかくてキャッシュに入りきらない場合、 for ( suma += a[i]; sumb += b[i]; } のa[i]とb[i]は必ずメモリ上遠い位置にあるだろう。 すべてのiについて毎回そうなるけど、そうなるとどうなるんだろ?
>>708 インラインはそう保証されてないだろ?
関数オブジェクトは呼び出しコストの話とは関係ないし。
インライン展開が大前提の技術で保証がないとか言われてもねぇ 「お前テレビ買ってきたようだが映らない可能性はゼロではない」 ぐらいの言いがかり
言語設計者でもないんだから、下手な考え休むに似たり。 計測すればいいだけ。
やってみた
ttp://codepad.org/jDnOTDt3 VS2013Express
最大限の最適化/Ox 64bitバイナリ
結果
test1 : 504 test2 : 559
test1 : 450 test2 : 574
test1 : 574 test2 : 543
test1 : 492 test2 : 535
test1 : 483 test2 : 526
だいたいforの方が1割ぐらい早いかな
>>715 それは処理するデータの量と実行環境で簡単に逆転するから半分ウソ
基本は記述性を優先
インライン展開されてもループ制御命令の実行コストが余分に掛かるけどね。 意味が明確でコードがコンパクトだし速度重視でなければそれも良いと思うけど、 デバッグビルドでインライン展開とか最適化とか積極的に掛けるかというと微妙。 末尾最適化もそうだけど、そういう設定が適用される前提が共有できない状況で最適化に頼るコードに太鼓判押す奴はクソだと思う。 「(末尾最適化・インライン展開が有効なコンパイラ・コンパイルオプションならば)」って前提も無くそれに頼るなと。 頼るなら明示しろ。
719 :
デフォルトの名無しさん :2013/11/13(水) 23:43:36.68
>>707 そんなこたあない。
なぜ普通はダメなのか考えれば、それにあてはまらないパターンがあることもわかるはず。
>>714 実際にインライン展開されるかどうかは保証されてないよ
intrin使うとどうなるかな
>>716 C++はCに比べて遅いからな
だから、いまでもC++よりCがたくさん使われるんだよな
724 :
デフォルトの名無しさん :2013/11/14(木) 00:58:11.57
JSはCの二倍速い。
遅いのはC++じゃない。iostreamだ。
C++は言語仕様が大きすぎるので 調子に乗った奴がクソコードを書かないよう 「Cの範囲で」とガードをかけるのが吉。 それ以外にCの存在意義はない。
729 :
デフォルトの名無しさん :2013/11/14(木) 18:59:27.80
Cもインライン展開とかってしてくれるの?
C++の言語仕様がでかいとか ほかの言語に触ったことない人なのかな
>>728 > C++は言語仕様が大きすぎるので
そんな頭弱いこという子に用はありません
いや…C++の言語仕様はでかいね でかいし掴みどころがない あとiostreamは失敗作。ノータッチで
lambdaのグロさに愛想を尽かした どうすればコンピュータサイエンスの真髄をあんなグロい表記に出来るのだ
仕様の隅々まで把握しないと使い物にならんという意味ではデカ過ぎる
strstreamなら割と使うな なんでも突っ込めるし ラムダはもう慣れたわ
それよりもsstream使うべし
>>695 エディットコントロールを取得することはできたんですが、
エディットコントロールとコンボボックスをいじってみても高さを変えることができません
あれこれ調べてはみてるのですが、プルダウンの高さを調整する方法しか出てこなくて…
>>737 SetItemHeight のインデックス(-1)は試した?
自分のときはフォントの大きさ帰るだけで小っちゃくなったけどなあ
>>738 はい、-1を指定してもかわらなくて、
0を指定するとプルダウンしたときのリストの幅が狭くなりました。
SDIで動的に生成しているのですが、ダイアログベースじゃないと変更できないんでしょうか?
試しにフォントをかなり小さくしたりして試してみたのですが、全然小さくなりませんでした
出来ればエディットやスタティックと同じ20位に統一したいのですが、どうやっても25くらいの高さになってしまいます…
741 :
デフォルトの名無しさん :2013/11/14(木) 20:25:52.64
>>741 逆転したのも興味深いけど
最近の話題をそこはかとなく混ぜてくるセンス嫌いじゃない
>>743 結論としては、記述性と可読性が最優先。
パフォーマンスは全体を計測してみてネックと思われる部分を集中的に手当てするの正解。
趣味や研究ならガッチガチにトリッキーなコード書くのもおもしろいけどね お仕事なら干されるけどね
意味のないトリッキーなコードは公然猥褻罪が適用されるべき公開オナニー
748 :
デフォルトの名無しさん :2013/11/15(金) 12:07:27.02
記述性と可読性はもちろん大事だが 真性バカの隠れ蓑であることにも注意が必要 どんなに小手先の最適化をしても 全体的な構成がおバカでは際限ないイタチごっことなる システム全体を広く深く洞察できる高スキルな人にとっての 記述性・可読性は、真性バカの主張とは大きくずれる
仰々しく言ってるけど言ってることは抽象的で薄い
「可読性は大事だが、低スキルも言い訳に使うから困る」 レスが自己言及かってぐらい長すぎだろ
来週からMFC使う事になって予習してるんだが、 使いずらくてかなわんな… CDatabaseとかCListとか関数の戻り値にしたいんだが cobject::cobject 〜 private でアクセスできませんとかで、ポインタじゃないと戻り値にできないいんだが、 MFCってみんなこんななの? C#だとコンボボックスにオブジェクト入れれるんだけど テキストしかセットできないし… まぁコンボボックスは継承して自分でオブジェクト入れれるようにできればいいんだけど、 cobject〜ってのがよくわからん 関数内で CList<hoge> fuga; return fuga; ってできないのは何故?
MFCがそう言うものじゃなくて、C++がそう言うもの C#だけの知識でC++使うのは相当に厳しい 来週からなんて無理
試してないができるだろ どうせアホなことしてるだけだろうけど
MFCでつまずくとこそこじゃないだろ いわゆるポインタがわかってない人ですかい
C++のクラスは参照型じゃなくて構造体とほぼ同じもの &つけて参照にできるけど ポインタで統一したほうが楽かなぁ
などと意味不明な供述をしており
ポインタと参照をそんなレベルで語るなよ
>>757 参照型とかJava脳用語はやめてくれ‥‥
>>754 ,
>>755 ,
>>756 ,
>>757 C++は少しはやったことあるんだけど
確かに分かってるとは言えないレベルです・・・
ポインタは少しは理解してるつもりなんですが、
戻り値にポインタってあまり使わないと思うんだけど、
c++はそれが普通ってこと?
>>755 アホなことはしてないと思いたいんだけど、関数内で
struct hoge {
int a;
};
hoge xxx;
xxx.a = 1;
CList<hoge> fuga;
fuga.AddTail(xxx);
return fuga;
ってな具合で処理してるっていっても例に挙げたくらい簡単なものにしても
cobject::cobject〜ってなるんです
ネットで調べたりしてみてはいるんだけど、
とくに小難しいことはしてないのになぜエラーになるのかいまいちわかりません
APIとか見てもポインタの戻り値ってあまりないと思うんだけど、
積極的に使ってもいいものなの?
762 :
デフォルトの名無しさん :2013/11/15(金) 21:00:06.82
ちゃんとソースコード出して
アホには無理 十年早い
だから C/C++ では参照型にならないと言っている 明示的に & を付けるか ポインタにするか
単Ttd:: listはコピー返し出来るけどCListはコピー返し出来ないってだけの話だろ。 参照型にできないとか見当はずれにも程がある。
>>761 >戻り値にポインタってあまり使わないと思うんだけど、
>c++はそれが普通ってこと?
誤解を恐れずに言うが、C#やJavaのオブジェクト型はポインタだよ。
だからMFCでの書き方は、普通のC++よりはC#に近いはずだよ。
C++では確かに戻り値にポインタは使わないけど、
それはJavaやC#のいわゆる「参照型」ですらない。
たぶん全然理解できずに言ってると思う。仕様を疑ってる場合じゃない。
768 :
デフォルトの名無しさん :2013/11/15(金) 21:45:03.92
> C++では確かに戻り値にポインタは使わないけど、 え??
メモリイメージを意識するんだ!
>>767 どうやったらそこまでアホになれるんだよ
100%ポインタを使わないって意味じゃないよ。 基本的に引数で参照を受け取るし、 戻り値で返す場合でも値のが多いよ。 ポインタ扱う場合でもスマポ=値型で返すでしょ。
>戻り値で返す場合でも値のが多いよ。 うーん、この
まずCでの構造体を考えろ struct T x,y; のとき、x=y; として、y をいじると、それでももとのxは不変なんだよ C++のクラスでも同様。下手にx=y; 式のことをやると、 ポインタが紛れ込んでるとカオスになる Javaぽくやるなら、struct T &x,y; x=y; などと、最近やっとJavaの本を安く ぶくおくで買って読んでいる俺が供述しており
>>773 言いたい事があるならはっきり言いなよ。
無知で申し訳ないです…
でも皆さんの意見は大変勉強になります
structは関数の外で定義してます。分かりずらい書き方してすみません
>>767 確かにそういわれてみればC#に近い気がする
c++だとガベージコレクションがないから
newすることに気を使いすぎているのかもしれません…
関数でデータベースから値をとってきて返したいのですが、
戻り値の型を気にしてしまって
配列にすればいいのかコレクションにすればいいのか
配列に限らず汎用的な戻し方ってのは何に気を付ければいいんですか?
コピーコンストラクタ禁止してるなら、スマポ返しも無理じゃね
778 :
デフォルトの名無しさん :2013/11/15(金) 22:02:54.59
> Javaぽくやるなら、struct T &x,y; x=y; つっこみどころ多すぎて、どこから手をつければよいやら・・・
C言語じゃあるまいし、ナマポで返り値返すとか普通しないでしょ。
>>776 1.CListなんぞ捨ててstd::list使う
2.どうしてもCListを使わなければならないなら、CListの実態は呼ぶ側で作ってもらって、引数でそのCListを参照渡しして、それに要素を詰め込む。
>>777 コピーコンストラクタ禁止って、デフォルト以外も?
どんな環境よ。
std::unique_ptr<CList<hoge>> fuga(new CList<hoge>); return fuga; はい、できました。解決。終わり終わりw
>>728 実行モジュールのコンパクトさも利点だよ。
大量に、スレッドとかプロセス生成したり、頻繁に破棄と生成繰り返すようなときは、最近のサーバーでも負荷が変わってくる。
784 :
デフォルトの名無しさん :2013/11/15(金) 22:12:32.70
> C言語じゃあるまいし、ナマポで返り値返すとか普通しないでしょ。 何と戦ってるんだ?
また荒らしに来たのか低能
MFCやるって言ってるのをわかってない奴がいる
たぶんnewしたオブジェクトのナマポのことに限定してるんだと思う
すまないが TRY - CATCH - END_CATCH なんてクソ汚い入れ墨を彫ってる奴以外は帰ってくれないか
みんなよく > cobject::cobject 〜 private でアクセスできませんとかで、 の日本語が理解できるな。 さっぱり意味が分からん
MFCつかWin32がreinterpret_castしまくる
>>789 noncopyableのエラーじゃね
shared_ptr使えばいいだけ
MFC使わさせられるような環境で、shared_ptr使えるのか? boost入れるのも環境によってはハードルあるし。
CListってコピコンがprivateなのか。 今手元にexpressしかないからわからん。 ところでshared_ptrやunique_ptrとMFCて排他的な関係でもあんの?
そこだな STL禁止でMFCしか使えないのか MFCでI/F組むことが強制されているのか 単にMFC言われて思考停止してるのか それによって何を学ぶべきかが変わる
>>782 >>791 コピーコンストラクタがprivateなやつをどうやってuniqueやらshared_ptrにするんだ
unique_ptrの潔さが好きだ・・・
「スマートポインタは甘え」と唱えて迫害されたい
stl禁止とかどういった事情でそうなるものなの?
802 :
デフォルトの名無しさん :2013/11/16(土) 00:42:20.99
コンパイラが対応してない
組み込みならrttiも例外もstlも禁止 さらに仮想関数や継承禁止、挙句に最適化なしまで入(ry
それってnewも禁止? 個人的な優先順位は、 STL > 継承=仮想関数 > 例外 > RTTI かなあ・・・
潔さってことで言うと、 コピコン禁止、代入禁止、コンストラクタprivate メソッドがひとつだけ ってクラスが今のお気に入りw
今時 MFC とか言ったら VC6が出てきても驚かない try catchが事実上対応してなくて TRY CATCHとかいうマクロで代用させられるようなシロモノだぞ
>>809 馬鹿すぎワロタw unique_ptr以前に生成自体ができてねーよw
ideone.com/WBhLx0
ideone.com/EZkOCB
環境はGCC 4.8.1で、 Rangeをvectorのconst_iterator型へ変換する時に、 template <class Range> struct v_it { typedef typename vector<typename Range::value_type>::iterator type; }; v_it<set<int>>::type it; こっちはいけて template <class Range> auto f_v_it(Range &&r) -> vector<typename Range::value_type>::const_iterator; decltype(f_v_it(set<int>())) it; こっちはいけない error: expected type-specifier って言われる、型は合ってるだけにエラーを見ても原因が分からん・・・
const_iteratorじゃなくてiterator、 itratorの方がタイプ数少なかったんで変更したんだけどここだけ変え忘れてた
自己解決しました template <class Range> auto f_v_it(const Range &r) -> typename vector<typename Range::value_type>::const_iterator; decltype(f_v_it(set<int>())) it2 = vector<int>().cbegin(); typename抜けてただけだったんだぜ☆
>>801 例外が使えないコンパイラだろ。
そういうコンパイラ向けにstlもどきのフリーのライブラリがあるから
それ使えばいいわけで。
>>816 例外が使えないC++コンパイラなんてあるの?遭遇したことないんだけど。
>>801 大抵は過去に別のプロジェクトで事故って、プログラムをよくわかんない人がそれを参考にしたとか。コピペしたとかそんなんじゃないかと思う。
あとは、いろんなOSに移植すること前提とか。
819 :
815 :2013/11/16(土) 11:19:59.91
起きて冷静になったら書き込み色々めちゃくちゃですまんかった
820 :
デフォルトの名無しさん :2013/11/16(土) 12:06:20.43
>>817 AndroidのNDKとか初期は例外が使えなかったとかなんとか
>>817 コンパイラ自体じゃなくて、例外をサポートするためのランタイム環境が整備されていないRTOSが昔は多かった
規格なんて努力目標にすぎないのよ あなたも大人になれば分かるわ
>>803 STL禁止じゃC++使う意味ないな。だから今でも組み込みはCなんだろな
小メモリのワンチップマイコンなんかでは、最大使用メモリの管理
が大変とかでnewなんかも禁止なんかな。
富豪的プログラミングだとゆとり言語が使えていいよな
824 :
デフォルトの名無しさん :2013/11/16(土) 19:12:21.00
> STL禁止じゃC++使う意味ないな。 だから何でそんなに飛躍するんだよ
ゆとりなんだろ
>>823 C++の強さは、既にあるSTLが使えることではなくて、
STLのようなライブラリでさえも、
欲しけりゃ自分でゼロから作り込むことが出来るところにあるんだよ。
昔EC++とかいう誰が使うんだろうって規格があってだな
STLに相当するより高性能なライブラリはどの会社でも持ってるもんだと思ってたわ
だから組み込みってどの程度の規模か知らんが、C++なんか使わんって
830 :
デフォルトの名無しさん :2013/11/16(土) 19:54:53.55
組み込みでもC++使ってるわ。なんで嘘つくの
組み込みって言ってもピンキリだし、ナビとか Java ですら使ってるのに C++ ないとか、いつの時代だよ (w
ナビのアプリなんか組み込みじゃねえわ
オレオレ帝技の前に敵なし
最近のマイコンはワンチップでもクロック100MHz越えでオンチップROMが1MBとかあるからなあ しかも安くてデバッグ用機能もバッチリ 組み込みでもC++を避ける理由なんて最早ないわ
これ最後のtryのところでRuntime Errorになるんだけど、おかしくない?
http://ideone.com/JdEveI 同じコードをVC2010でやってみると、エラーにならずに"catch destructor"が
出力されるんだけど、ideone.の方は
stderr
terminate called after throwing an instance of 'char const*'
になってしまう。
おまえらはどの組み込みマイコンでC++を実際に使っているの?
839 :
デフォルトの名無しさん :2013/11/16(土) 21:37:51.71
840 :
デフォルトの名無しさん :2013/11/16(土) 21:39:11.40
nvidiaのボード使った映像端末
Linux入ってるような組み込みもあるんだし 使える環境だってあるだろ
OSより上の層は組み込みじゃない
>>835 やっちゃダメってことをわざとやってるようだけど?
OSが載らないような環境でもコンパイラさえあればC++使うだろ。Cで縛る意味がない。
>>845 OSの載せないような環境ならコンパイラあってもC++なんか使わない
AVRはgcc使えたはずだけど、コイツでg++使うのは変態だと思う。
組み込みなんてろくにやったことないのに組み込みの話してるんじゃないのか?
あまり興味深い世界とも思われない。 知らないだけなんだろうけど。
>>846 OSが載ってたらいいのか?判断基準は何なの?
>>846 OSない環境でもC++は生産性に大きく寄与するよ(当たり前だけど)
お前さんには使えないってだけ
>>851 とてもじゃないが使えないっつうか、使おうとも思わないって人が多いと思う
だいたいOS載らないってことは小規模かクリティカルなもんだろ やっぱC++なんか使わんわ CだろうがC++だろうが、ちゃんと書けば生産性なんか変わらん
>>835 おかしくない。規格どおり
・デストラクタが例外を投げたらそのオブジェクトは破棄されたことにならない
(デストラクタの正常終了をもってそのオブジェクトが破棄されたとみなす)
・スタック巻き戻しによる破棄はそのブロックで正常に構築されて未だに破棄されてない自動変数が対象
・例外送出によるスタック巻き戻しの最中にデストラクタが例外を投げたらstd::terminateが呼ばれる
>>895 のソースでは
1 56行でTemporary_t型の一時変数(自動変数)のデストラクタ内で例外が投げられる
2 その一時変数は例外送出時点で破棄されていない(とみなされる)
3 スタック巻き戻しで一時変数のデストラクタが呼ばれる。そして例外が投げられる
4 上記のルールによりstd::terminateが呼ばれる
となってる
いまどきPCのブート直後の処理でさえC++製なのに
C++って若い時は万能間感じるけど熟練になるとスマポと参照だけあれば他はCのままで良いじゃんと気が付くよね
例外処理もほしい…そうなるとやっぱりポリモも必要
>>856 PCもC++erからすれば組み込みだよな
組み込みだと真っ先に例外が削られるわ
>>835 一時変数しか作れないようにして、あとで発生した例外処理には絶対巻き込まれないようにしたってことか。
VCでエラーにならないってのは変だな。
>>854 > おかしくない。規格どおり
> ・デストラクタが例外を投げたらそのオブジェクトは破棄されたことにならない
> (デストラクタの正常終了をもってそのオブジェクトが破棄されたとみなす)
規格にそんな記述あったっけ?
オブジェクトの「生存期間」はデストラクタ開始時点で終了してるんだけど。
「破棄されたかどうか」っていうタイミングが別にあるの?
いまや8bitの小さなマイコンでも例外が必須でC++だよな
>>854 ~Temporary_t() に明示的な例外仕様が無いからデストラクタの特例で noexcept が適用されて、
そこから例外飛ばそうとしてるから std::terminate() ってだけじゃないの?
>>835 のソースでは
56行 temporary_t(s) << "ABCDEFGHI " << 123456789;
(1) (2) (3) (4)
(5) 57行以降のどこか
のうち(2)〜(5)の4カ所で例外が発生する可能性がある。1はない。
(2)と(3)では実際どうなのか知らんが、一応operator << が失敗しうる。
(5)57行以降のどこかで例外が発生した場合のスタック巻き戻しの処理では、temporary_t(s)は
もう破棄されているから無関係。例外多重発生は起こらない。
(4)のデストラクタ内での例外発生に関しては
>>854 の言う通りだったらダメだな。
>>867 アホみたいな極論しか言えないのかこの低脳
>>867 そんな貧困環境向けの極小プログラムなど何で作ろうがどうでも良い
32バイトしかないならそりゃアセンブラで30年以上昔のやりかたでやるしかないだろうなあ(笑)
いいからお前はレトロ環境でシコシコしてろよ
無能で十分説明されることに悪意を見出すな
他でやらかす前に学習できてよかったな。 対人だとしばらくは馬鹿扱いされるだろうし、 業務でやったら最悪損害が出てしまうからな。
RAM32バイトで出来ることなんてたかがしれてるからどうでもいいわ
32もあればC++動かすには十分だろ
RAMが32バイトだと、コールスタックも大した数積めないだろうしね NVRAMじゃねーのいまどき
C++関連スレって基地外スレ化しているよな hogeみたいな基地外がいっぱいの言語じゃしょうがないが
C++なんて基地外ばっかだろw boost見てみろよ まじキモイソースじゃん
STLの方がキモイだろ あのキモイソースよく見れるなと毎回思ってるわ
安定したものを素早く書けるなら美醜なんてどうでもよいわ メジャーになったらどうせ尻尾振って賞賛するような価値観だろうし。
キモかったとしても糞ではないからなぁ(iostreamを除く) 糞コードに溢れてる実務の癒やしの部分。
C++は実は気合を入れて実装するとキモくなるんだよ C++って建て増し言語だからね
だからといって新築しようとすると傍流に堕ちるからな
STLのソースコードみたことないですごめんなさい(`・ω・´)
見たことないとかないだろテンプレートなんだから
ゆとり世代はboostすら読まないらしいな あの程度の基礎知識もなしにどうやってプログラムするんだろう
>>888 そんなことはないと思うけど。
boostのソースからヒントを得ました
なんて若い世代かなり多いと思う。
>>888 そういう新しいのを渋るのは年取ってる人の方が多いんじゃないか?
>>889 メタプログラミングを覚える過程として、boostの写経という名のコピペは欠かせないな。
でも、手探りでとりあえず動いてるだけのコード群には地雷が一杯。
そして、メタプログラミング禁止令が出て、テンプレートを書いても許される層と使うこと
だけが許されてる層へと役割の細分化が進むw
テンプレートを書くことが許されないってことあるの?
やる気のない奴には書けないし 無駄にやる気のある奴はゴッテゴテの訳わからないライブラリを作り出す それがテンプレート
894 :
デフォルトの名無しさん :2013/11/18(月) 00:11:31.98
Qtを使ってる人って少ないの?Qtがお気に入りなんだけどさ。
FA業界で装置制御GUIは未だにMFC + intel c++ compilerでやってるな 凝ったこと(最近の見栄えの良いGUI)しなければ、MFCもVC#も大差ないからな
>>898 FAの装置制御GUIでCLじゃなくてICC使う理由が良く分らん。
最適化が重要な処理があるとか、CLのバグ避けとか…?
ドラマの話かよw
902 :
デフォルトの名無しさん :2013/11/18(月) 06:57:29.41
iostreamって何がダメなの
ダメって言っておいた方が何かかっこいいだろ 言わせんな、恥ずかしい
>>902 「遅いから」
その一言に尽きる
設計自体は継承のデモンストレーションになっているために実際の使用に対しては
柔軟性は確かにあるが、実用性は「?」な部分が多い
今boostのメンバーに一から作らせたら全く違う物を作るだろう
boost.iostreamsのようにね
>>905 いや全体的に遅いし
結局出力はC関数限定になるし
iostreamが遅くてもstdio.hよりは速いけどな
io.hと言わないところがミソですね
アセンブラ厨への道を歩きたい人以外は、お薦め出来ない。
左シフト演算子とかないわー
>>909 io.hなんかPOSIX規格には無いはずだが
コンソール入出力なんてちょっとしたツール作るとき位にしか使わないから 遅かろうがどうでもいいわ
cin >> var; という書き方がキモいです。
>>912 Posixがいいならunistd.hで
速度は問題じゃなくてformatの指定が使う気にならんとか、locale設定が使い物にならないとか。std::ios_base::binaryが各プラットフォームでどういう挙動になるのかよくわかんねぇとか。 その辺使わなきゃいいんだけどね。
localってそもそも日本じゃ使い物になってない気が
ちょっとした図形のシミュレーションをやるプログラムを作っていて、
マウスの動きで時間を進めたり戻したりしようと思いました。
マウスを直線的に動かすとすぐ画面外にはみ出ちゃうんで、
時計回り->時間が進む、反時計回り->時間が戻る、としたいです。
回転の向きを捕えるのはこんな感じで簡単に実装できました(関数mouseConvexity)。
http://ideone.com/JvT6Ck で、マウスのふらつきを吸収するための調整項が中途半端に残ってます。(「要調整」のコメント部分)
とりあえず機能はするんですが、こういう調整項を実行時に動的に最適化するような
プログラムってC++でうまく作れないでしょうか?
>>919 こういうときの"点の採取"ってのは低域通過してからやるもんで
平たく言うとサンプリングした過去n点を足してnで割っとけ
nを動的にするアルゴリズムとかもある
C++関係なくね?
921 :
919 :2013/11/18(月) 23:47:57.22
>>920 あーサンプリングですか。そうですね。
関数側でそのための領域を保持しておきたいところですが、
呼び出し側に確保するしかないのがいまいちスマートじゃないですね。
(既存のstaticデータもそうだけど)
C++関係なさそうなだけど、どこがいいのかわかんなくてすいませんでした。
922 :
919 :2013/11/19(火) 00:04:43.41
俺すげーアホだわw 関数じゃなくてファンクタにすればいいんだわ。 >そのための領域確保 まあそのファクンタはstaticにしなきゃならんけど。
>>921 簡単にいうとデータとそれに関係する関数群の関係付けしてるものがクラスだよ。
だからフィルターするクラスを作るんだ。
生の位置を突っ込んだら補正した結果を返しつつ突っ込んだ生データを内部のメンバに保持するような。
アルゴリズム的に「〜って言語で〜は作れない」見たいなケースはまず無い。 それはそれとして、その辺の設定値はふらつきだけじゃ無くて速度も変わる。 速度の目標値が無いのにふらつきだけ消そうとしても、自動では上手く行かないだろ。 スレショルドは一応決められるけど、円の直径と速度の目標が定まらないとやっぱ安定しない。 中心決めて、10度で1カウントとか円周上XXpxで1カウントとかにしたほうが手っ取り早い気がするな。 中心は決めうちの方が楽だけど、移動範囲が縦横XXpx以上での移動範囲の中心を使っても良さげ。 XXpxとかはUIの解像度から決める値にしておけば、自動調整項自体が式から消える。
>>921 マウスはひとつしかないんだし、ウィンドウプロシージャの case WM_MOUSEMOVE: でしか呼び出す場所ないんだろ?
関数側に過去データ確保しておけばいいじゃん。
>>925 操作終わった時のリセットがわからんとか。
staticだと、その関数の引数で過去の移動記録破棄を指示するとか、関数のstatic変数を外から触るとか、若干キモイ事になる。
>>926 一般論ではそう。
だけどこれは過去の点は2つしかとってないし、新しい操作との不整合はすぐ押し流されてしまって検知できないレベルだよ。
↑ リセットなんかせずに放置でいい、って意味ね。
>>922 オブジェクトにデータ持たせることが目的になってるしタダのクラスだよなそれ。
確保した領域のクリアもするならそれこそ関数オブジェクトではなくなるし。
>>927 これは
>>920 で保存するデータ増やす事も想定した話だからまぁいいんじゃね?
930 :
デフォルトの名無しさん :2013/11/19(火) 00:50:35.25
staticにする必要ないだろ WM_なんちゃらって書いてるって事はメッセージループ周ってるんだろうからループスコープのの外に書けばいいだけ。 >staticだと、その関数の引数で過去の移動記録破棄を指示するとか、関数のstatic変数を外から触るとか、若干キモイ事になる。 関数内のstatic変数を外から合法的に触る方法なんて無いし(そりゃあ中から渡せば別) 関数の引数で中のstatic変数の破棄を指示とか若干どころかキモイの極み そんなコード書くやつが同じプロジェクトにいたら殺意沸くわ。
>>930 C++だとキモイの極みだが、Cでは……
strtok:第一引数がNULLならば前回からの続きを処理し、非NULLならば前回までのデータを破棄して最初から処理する。
Cでもコンテキストを関数内で書くような奴と一緒にやりたくない 最低でも構造体渡し
strtokはマルチスレッドが当たり前の現在の環境では恐ろしくて使えないよね
マルチスレッド対応の_rが整備されてるだろ
素人の質問だけど if文で if(条件式) 実行文; if(条件式) 実行文; ・・・・ ・・・・ とやるのと if (条件1) { 文1; } else if (条件2) { 文2; } | | else if (条件n) { 文n; } else { 文; } とやるのどっちが速いんだろうか
>>935 そもそも可換であることが少ないだろそれ
後者で書けるなら後者で書くけど
>>935 後者の方が余計な条件式の判定を行わないけれど、
条件式の内容と最適化次第ではどちらも同じコードなったりする。
条件式に時間が掛かる処理を含むのでも無い限り、見通しが良い方で書いたほうが良さげ。
>>938 そういうものか 単なる不等号の判定だからどっちでもいいのかな?
>>934 んなこたわかってるけど、それだと内部のstaticがなんちゃらと話がつながらんだろ
>>937 ループ構造がアホだからそこから修正。
例えば、8行目のi==(L-1)は6行目のfor文の中では不変なのだから、7行目のfor文の外で判定できる。
最適化がちゃんと効いてれば修正不要だが、効いてるか調べるか手で直すかどっちかやるべき
>>941 成程 最適化が効いてるかどうか調べるには実行速度を調べればいいの?
>>942 strtokとか関数内部でstaticを不用意に使ってるとマルチスレッドで死ぬっていういい例じゃん?
>>943 吐き出されたコードを見るのが一番だけど、無理なら実際組んで比べてみるとか。
あと、ループ全部一緒に見えるんだけど、纏めれないの?
>>937 こういうのはSIMDにしたい病がうずうずする
Eはオーバーフローしないのかこれ?spinが限定された値域なのかもしれんが
>>945 >吐き出されたコードを見るのが一番だけど、無理なら実際組んで比べてみるとか。
アセンブラ見るのか? 実際組んで比べたほうがいいっぽいな。。
>あと、ループ全部一緒に見えるんだけど、纏めれないの?
配列の内容が[x][y][z][方向]で各軸で[方向]が違うのと 後 条件文で周期的境界条件を課してるから違うと思うよ
プログラム的に同じにできるってんなら俺には分からない範囲
>>946 >Eはオーバーフローしないのかこれ?spinが限定された値域なのかもしれんが
spinは実は1,-1,0のみを取る配列
実行結果は論文の理論値と一致してるからアルゴリズム自体が間違ってるっていう可能性は低いかなーと思ってる
問題は単純に下手で実行速度が遅い点
SIMDつーのも勉強したいな
>>948 なる。3値ならいいんだ。SIMDの出る幕でもない
>>950 いやよく見りゃ分かるけど各軸のforの中は違うと思うよ
>>937 ifを4個書いてるのは端末処理かよ
速度重視するときこういうのはループの外に出すもんだ
>>952 ありがとう
ifで分岐させた後にループすべしって事か
そうする
954 :
デフォルトの名無しさん :2013/11/19(火) 02:50:22.17
>951 ん?まずこうできないの?って聞いてるんだけど。 codepad.org/IYfLhMKL おまけLが大きいなら並列化 codepad.org/7XhkkqRd とか適当に書いたから3個までしかスケールしないけど リンク禁止とか言われるからスラッシュ二つまでつけてくれ
>>954 これは恥ずかしい
こっちのほうをなんで思いつかなかったんだろw
並列化ってのがあるんだな知らなかった
どうもありがとう
956 :
デフォルトの名無しさん :2013/11/19(火) 03:14:19.67
失礼します。 変な質問になりますが、 for(int i=0; i<2; i++){ ●ここですぐiの中身を確認する } のように、for文の式でまず変数「i」を宣言し、同時に0を代入するも 「17515237」などとわけもわからない値が入っている場合があります。 別のなにかが作用してそうなるのならまだしも、宣言してすぐにそんな値が入っているんです。 for(int i=0; i<2; i++){ →ここですぐiの中身を確認してみました } 代入させたはずの0では無く、別の値が入るというのは、 どういう原因が考えられますか? ループなりなんなりしたのであれば調べる箇所も目星はつけられますが 宣言後すぐ調べても変な値が入っているので原因がわからず、途方にくれています。
確認のつもりで printf("%d", i); を printf("%d",&i); とでもしてるとか
958 :
デフォルトの名無しさん :2013/11/19(火) 03:41:19.16
>>957 レスありがとうございます。
しかし、そのようなことはしておりません。
ちなみに確認はブレークポイントをつけて、デバッグにて確認しています。
>>956 デバッガーじゃなく、printfで表示させるとどうなる?
>>937 これを
>>941 >>952 >>953 すると
for(k=0;k<L;k++){
for(i=L-1,j=0;j<L-1;j++){◆1}//(L-1)回、右端?
for(i=0,j=L-1;i<L-1;i++){◆2}//(L-1)回、下端?
for(i=L-1,j=L-1;i<L;i++){◆3}//1回、右下?
for(i=0;i<L-1;i++){
for(j=0;j<L-1;j++){◆4}//(L-1)回×(L-1)回、その他?
}
}
こうか。ifはきえる。
961 :
デフォルトの名無しさん :2013/11/19(火) 04:02:17.11
>>959 上下左右それぞれのキーを押すと
そのfor文箇所が実行されるようになっていますが、
それと同時にfor文の「i」の変数をprintfで表示も実行させてみました。
すると、押した(iが作成された)瞬間に例のすさまじい桁の値が表示されます。
ビルドしなおしてみるに、毎回「i」の中身の数値は違っているようです。
なぜか「-0」の時もあります。
どういうことなんでしょうか、、、。
"%d"で-0はでねー
>>961 前後のコード晒せよ
隣の変数からオーバーランしてきてる可能性もあるし文章じゃ解らん
964 :
デフォルトの名無しさん :2013/11/19(火) 04:25:11.46
>>962 すみません、そこは癖で%fで表示させています。
intを表示するなら問題はないかと思います。
>>963 それが出来れば話が早そうですが
ちょっと量がすさまじいので、、、すみません。
自分が知りたいのは、そういう例があるか否か、
経験豊富な方が経験されていないかな、と思って。
965 :
デフォルトの名無しさん :2013/11/19(火) 04:26:23.17
int i=0;で作成した途端に、オーバーランしてきたのが影響を与えるって あり得るんでしょうか?
>>964 問題ありまくりだよ
なんか色々と根本的な知識不足がありそうだな・・・
968 :
デフォルトの名無しさん :2013/11/19(火) 04:49:49.95
え、%fだと問題ありますか?? でも、まあ表示の仕方がわかってないのと、 今回のバグは関係ないですよね
なんだ釣りかよ
970 :
デフォルトの名無しさん :2013/11/19(火) 04:53:07.93
ちょっと待ってください。 逆に気になりました。 わかりました。 %fがまずい理由を解説してくださいませんか? お願いします、、、
>>970 printfの使い方くらい調べなよ
まずい理由を説明する以前の問題だ
972 :
デフォルトの名無しさん :2013/11/19(火) 05:01:34.78
調べましたよ。 自分の思った通りの解説ばかりです。 %f [-]dddd.ddddddの形式で出力する これがint型を表示するのになにか問題があるんですか? マジでわかりません。
>>972 マジで悩んでるなら初心者スレに逝け
ほとんどの処理系で8バイトdoubleを受ける%fに
4バイトintをあてがって問題がないと考えるロジックがわからん
>>964 %f に紐付ける変数は double (かC99 なら float)
%f に整数型を渡すな、渡すなら (double)でキャストする
976 :
デフォルトの名無しさん :2013/11/19(火) 05:14:16.23
>>973 いや、細かいこと言えば、doubleやint、floatなどで
合わせたほうがいいけど、
ただ、変数の中身を表示させるだけですよ?
普段はよくdoubleの表示でつかっているんで、%fで打ってるのを
面倒だからint相手でも%f使っただけです。
容量的な問題を言ってるなら、それこそ重箱の隅、
もしくは揚げ足とりなだけに聞こえるんですけど。
intをdoubleで表示して数値が変わるわけでもなし。
絶対釣りだと思うんすよ だってここまでの奴こんな所来ないもの
ぶったぎってすみません。 RPGのプレイヤーが壁に当たる処理において 壁にめり込んだ→壁の外に戻す、の処理をさせてるんですが めり込んだのが表示されてから ずいっと戻る感じになってしまうですよ。 壁の方向を押し続けてもめり込まずに止まるようにしたいんですけど どうすればいいですか?
>>976 >細かいこと言えば、doubleやint、floatなどで合わせたほうがいいけど、
細かいことではなくて重要なことだ
>押した(iが作成された)瞬間に例のすさまじい桁の値が表示されます。
当然の結果だね
わからないのなら、まず「合わせた」ほうがいいんじゃないか?
cは諦めてjavascriptでもやっとけ
javascriptはええぞー、ぜーんぶdoubleだ
982 :
デフォルトの名無しさん :2013/11/19(火) 05:41:04.87
>>979 あのですね、ものすごい桁が問題なのではないんですよ
そんなの%fを使ってるんで当たり前でしょ。
int i=0;
のiを%fで表示して、0.00000000000みたいに表示されてる〜って騒いでるんじゃないんですよ
5678909.8765000000000みたいな感じで表示されてるから騒いでるわけで。
そこで、%fのせいだ、なんて言われるほうが「はい?」ってなるんですけど
まあいいです。
わからないんですよね?
自力でやります、ありがとうございました。
>>982 疑問が解決したようで、安心しました。
私の方で[回答マーク] させていただきました。
また疑問点などありましたら、Answers をご利用くださいね。
あの〜
あ
>>988 壁際で止まる処理の皆さんが手前処理してるんでしょうか?
要は、移動先を先に確認してってことですよね?
そのやり方を使わずに、自分が触れたらにしたいんですけど
それだと無理なんでしょうか?
>>982 intをfloatやdoubleとして解釈などすると値が無茶苦茶に壊れる。0は0な場合が多いが保証も無い。
それに加えてdoubleは変数のサイズが異なるので、前後にある無関係なデータを値として解釈するので当然無関係な値が出る。
さらに浮動小数点数の引数は数値のスタックではなくFPUのスタックを使う場合があるので、その場合も無関係なデータが使われる。
浮動小数点数と整数を変換できるのは、それぞれがどんなデータ型かをコンパイラが正しく解釈して変換するから。
printfは型情報が一旦消滅するので、正しい型で引数と書式を書かないと大抵異常な動作をする。
>>978 >>989 めり込んでから戻すまでの間に描画が入るからそうなる。
描画前に戻すか、めり込む前にキャンセルするかすればよい。
>>989 だから描画手前で衝突判定の処理すりゃいいだけだろ
表示されてしまうじゃねーよさせんなよ
>>982 >5678909.8765000000000みたいな感じで表示されてるから騒いでる
int を %f で表示させようとするからそうなる
釣りに構うなよクソが
>>982 %fを指定したときは対応する実引数の型がfloatまたはdoubleでなければならない。
intを渡すのはundefined behavior
doubleのくるべきところに、intおいても、自然に変換される。そうおもってるんだろ? でも、printf系の、「なんでも置けるところ」は、必ずしもそうじゃない。 それが、C/C++の良さでもある。Cにようこそ。
C++というより、Cだな。 C++ならオーバーロードで解決だ。
ごくろうさま
999 :
デフォルトの名無しさん :2013/11/19(火) 09:42:04.54
美しすぎる意味
そしてQZは相変わらず>975で大嘘を書くのであった。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。