- 1 名前:デフォルトの名無しさん mailto:sage [2018/12/28(金) 06:04:52.38 ID:ufThBpcD.net]
- エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.103【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1530384293/
- 428 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 12:06:46.94 ID:QKPibkAC.net]
- >>426
天才達だけに許された言語なのでしょうか? もっと身近なプロダクトはないんですか?
- 429 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 12:32:11.46 ID:PRVQuzHN.net]
- 古い例だとニコニコ動画がC++
まあおかげで開発がスケールせずオワコン化したわけだが
- 430 名前:デフォルトの名無しさん [2019/02/11(月) 12:32:14.48 ID:itY+kGJR.net]
- the door is open
- 431 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 12:43:40.65 ID:MmPS3pUZ.net]
- >>428
聞いてばっかりじゃなくてお前がどういうものを探しているか書いたら?
- 432 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 13:10:19.37 ID:Y0EVtjJ+.net]
- CADとか画像処理とかビット演算系アルゴリズム(cf.ZDD)なんかは
まだまだ他の言語には負けないね
- 433 名前: mailto:sage [2019/02/11(月) 13:44:01.42 ID:HT+vwAFW.net]
- >>429
>開発がスケールせずオワコン化した これってどういう意味ですか?
- 434 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 13:51:23.27 ID:awXFg/MG.net]
- JavaからC++勉強中です
C++の場合、他のクラスのオブジェクトを複数持たせるときは、一般的にどうするんでしょうか ・コンテナにオブジェクトそのものを突っ込む(一番わかりやすいけど、ムーブの定義忘れとかでミスが出そう) ・コンテナにオブジェクトへのポインタを持たせる(コンテナ解放時に、クラスごとに同じようなメモリ解放処理書くのかしら) ・コンテナにポインタをスマートポインタで持たせる 辺りをネットで読ませてもらいましたが、こんな感じで良いんでしょうか? 不勉強な上、他のオブジェクト持つという基本的なことなので、なんかもっと簡単な方法を見落としてる気がしてしまいまして
- 435 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 13:54:24.78 ID:QKPibkAC.net]
- >>434
時と場合によりますので一般的な答えはありません
- 436 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 14:06:14.14 ID:fD0IDjkv.net]
- >>434
Javaのオブジェクト参照はC++のポインタに該当する。 C++のオブジェクトは、型を持ったバイト列だと考えていい。 C++で自動変数を宣言すると、スタックにバイト列が割り当てられる。 newやスマポやコンテナを使うと、ポインタによりヒープでメモリーが割り当てられる。 ポインタも型を持ったバイト列。ポインタは配列のように周りのメモリーにアクセスできる。 C++のクラスは構造体に関数群を追加したもの。C++でクラスを継承すると、関数群とバイト列を引き継いだサブクラスになる。
- 437 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 14:12:14.41 ID:0TxoCFW6.net]
- >>434
大体、その3つの通りで、そこに述べられたものの上から優先的に選ぶ。 つまり、普通にメンバ変数にオブジェクトとして宣言するのがC++では 最も効率が良くて伝統的な書き方。それでは問題が生じる場合にオブジェクトの ポインタとして持たせる。スマートポインタは後になって導入されたもので、 人気があるものではないので無視して良い。 二番目のポインタとして持たせるのは、例えば、今定義している最中の クラス(自分自身)と同じ型のデータで、子どもや親にあたるデータへ リンクを作りたいようなときか、または、ある基本クラスを継承した 色々なクラスのオブジェクトを持ちたい場合に用いる。
- 438 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 14:16:41.10 ID:fD0IDjkv.net]
- C/C++では、sizeofキーワードを使えば、簡単にvoid以外の型のサイズがコンパイル時に取得できる。Javaではオブジェクトのサイズを簡単に取得することはできない。
C/C++はよくオブジェクトのサイズやバイトの並びを意識してプログラミングする。
- 439 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 14:17:25.55 ID:a3vDiVrE.net]
- 結局CのポインタってJavaとかの言語で表すなら何なんだ?
- 440 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 14:23:20.42 ID:fD0IDjkv.net]
- なぜなら、例えばスタックに巨大なデータを割り当てると、スタックオーバーフローというエラーが発生するし、
ヒープだって、巨大なデータの割り当ては失敗することがある。 また、構造体を変更すると、構造体のサイズやデータ構造が変化して、互換性の問題が発生することがある。
- 441 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 14:24:23.31 ID:awXFg/MG.net]
- >>437氏他
丁度今、ウェブ上のC++で書かれたCompositeパターンのソースを読ませて頂いてました 正に2番目で実装されてましたが、都度メモリ解放処理書くくらい当たり前なんですね、流石C++です 独学なもんで、こうはっきり言ってもらえると本当にありがたいです、使い分けて行きたいと思います 他の皆様もありがとうございました、勉強になりました
- 442 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 14:34:10.39 ID:fD0IDjkv.net]
- >>439
Javaの動的配列はCのポインタに近いが、Javaの配列では危険なアクセスは制限されているし、参照カウントで管理されている点が異なる。 Javaのオブジェクト参照は、参照カウントで管理されており、C++の構造体/クラス型に対するstd::shared_ptrに該当する。
- 443 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 14:37:16.50 ID:BEdrdhIs.net]
- しかし、std::shared_ptrはヌルポを指定できるが、Javaはできない。
- 444 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 14:49:43.57 ID:0TxoCFW6.net]
- >>441
C++ は、デストラクタに必ずメモリ解放処理を書いておけば、そんなに メモリーリークを気にすることはない。多くの場合にはそれで完全に処理できるから。 次のように書くだけで、ほとんどの場合、メモリーリークは起きない: class CMyClass { BYTE *m_pBuf; CMyClass() { // コンストラクタ m_pBuf = NULL; // メモリをまだ未割り当てであることをマークするためにこうしておく } ~CMyClass() { // デストラクタ if ( m_pBuf != NULL ) { delete [] m_pBuf; // メモリの解放 } } }
- 445 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 14:52:47.12 ID:dGdUrFsa.net]
- すごく古い書き方だ
- 446 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 14:54:57.57 ID:BEdrdhIs.net]
- >>444
ナマポの場合、代入したらまずいよ。例外安全にも問題があるし。
- 447 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 14:55:46.62 ID:DnOcmNTU.net]
- 確かに、人に教えるレベルじゃないね
- 448 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 14:56:36.09 ID:0TxoCFW6.net]
- >>444
正しくは、次のようにアクセス制御のための「public :」を書かないといけない。 class CMyClass { protected : BYTE *m_pBuf; // 高速化のため、自動的には初期化はされないのでコンストラクタで初期化する。 public : CMyClass() { // コンストラクタ m_pBuf = NULL; // メモリをまだ未割り当てであることをマークするためにこうしておく } ~CMyClass() { // デストラクタ if ( m_pBuf != NULL ) { delete [] m_pBuf; // メモリの解放 } } } なお、必要に応じて、コンストラクタの中で、m_pBuf = new BYTE [xxx]; のように書いても良い。 それと、BYTE は、「オブジェクト」ではないので、あなたの書いているような場合には、 BYTE *m_pBuf の部分を CSomeObject m_pObj; のように変えて、m_pObj = new CSomeObject; のようにする。
- 449 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 14:58:34.69 ID:BEdrdhIs.net]
- >>448
ダメだこりゃ。
- 450 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 15:03:05.98 ID:MkFOBvt9.net]
- 良い子のみんなは>>444の危険性が理解できるまではスマートポインタを使ってね
おじさんとのお約束だよ
- 451 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 15:11:57.93 ID:Qk3j4qw0.net]
- >>448のデストラクタでnullチェック必要?
nullポインタをdeleteしても問題ないはずだが 二重解放防止にはならんし意味わからん
- 452 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 15:18:49.80 ID:BEdrdhIs.net]
- >>451
超独自仕様の組み込み開発とか、メモリー管理がbuggyなプログラムでは意味があるらしい。 例えば解放したメモリーブロックをアクセスするような行儀の悪いプログラムでは意味がある。
- 453 名前:はちみつ餃子 mailto:sage [2019/02/11(月) 15:19:34.89 ID:eS7AzULV.net]
- >>444 >>448
・ 初期化を初期化リストでやらずに代入でやるのは邪悪。 ・ delete に NULL を渡した場合には何もしないことが保証されているので、 無駄にヌルチェックする必要はない。 ・ ポインタ型や整数型の値もまたそういう型の「オブジェクト」である。 (元質問者が Java から入ってきてるから「Java の用語で言うところの」という意味?)
- 454 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 15:19:51.73 ID:3tLemvMU.net]
- 初心者なので確認
コンストラクタの中に飛び込む前のメンバの初期化で例外発生したら m_pBuf は中途半端になるから コンストラクタの中で代入するんじゃなく、メンバ初期化子で初期化しろ という認識でいいのかしら
- 455 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 15:29:14.84 ID:BEdrdhIs.net]
- >>454
「C++ 例外安全」でググれ。ナマポを使わずに、素直に生配列、コンテナ、スマポのどれかを使えば済むこと。マネージされてないナマポは村八分にしろ。
- 456 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 15:39:02.97 ID:3tLemvMU.net]
- なんとなくわかった ような気がする
生ポそのものはコンストラクタもデストラクタに何ら操作しないから宙ぶらりんこになるのか
- 457 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 15:41:57.41 ID:dGdUrFsa.net]
- ちょっち理解は大変だけど生ポはスマポにドンドン置き換えたい
- 458 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 15:43:11.94 ID:BEdrdhIs.net]
- スマポならコピーコンストラクター・代入のややこしさからも解放される。
- 459 名前:はちみつ餃子 mailto:sage [2019/02/11(月) 15:52:25.23 ID:eS7AzULV.net]
- まあまあ。
スマートポインタを活用しろというのはその通りだが、 ポインタ (や例外機構) を理解せずに 思考停止してスマートポインタを使うのはあかんやろ。 ここの元質問者はまだそこを理解しようとしている ところなんだから、スマートポインタを使わなかった場合にどう書けば良いのか、 きちんと書くと面倒くさすぎるという体験も必要だろ。
- 460 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 16:16:38.24 ID:fD0IDjkv.net]
- 所有権の管理は人類には早すぎる。
所有権が変動するときは、スマポでOK.
- 461 名前:さまよえる蟻人間 mailto:sage [2019/02/11(月) 16:28:46.52 ID:fD0IDjkv.net]
- こんなときはナマポを使ってもよい:
処理の中で所有権が移動・消滅しない場合。 バイナリーデータやPODを生で扱う場合。 処理系がナマポやトークンやハンドルの入力を要求する場合。
- 462 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 16:36:19.07 ID:QKPibkAC.net]
- 生ポはスマポのオーバーヘッドすら許容できないときに使うものです
だから初心者は無理して生ポを使わなくていいです
- 463 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 16:59:08.84 ID:V2lM2C5l.net]
- >>437
スマポは後になって導入されたもので人気がない、なんて意見は一般的ではないので無視して良い
- 464 名前:デフォルトの名無しさん mailto:sage [2019/02/11(月) 18:19:37.85 ID:j549IniP.net]
- スマポをC#のusing感覚で使ってる
- 465 名前:デフォルトの名無しさん mailto:sage [2019/02/12(火) 13:19:56.52 ID:VqanzRzk.net]
- エアプwwwwwwwww今は参照カウントじゃねーよw残念だったなクソ蟻wwww
- 466 名前:デフォルトの名無しさん mailto:sage [2019/02/12(火) 13:20:43.00 ID:VqanzRzk.net]
- それで、Cの生ポってC/C++以外で表現するなら何なんだ?
- 467 名前:デフォルトの名無しさん mailto:sage [2019/02/12(火) 16:02:24.32 ID:VerJGrBE.net]
- >>466
native int
- 468 名前:デフォルトの名無しさん mailto:sage [2019/02/12(火) 17:27:09.82 ID:VqanzRzk.net]
- >>467
仮装アドレス的な意味で来るとは思ってなかったwでも本質はそうだよなあ
- 469 名前:デフォルトの名無しさん mailto:sage [2019/02/12(火) 17:29:23.18 ID:t+DTqVP+.net]
- CALL -151
- 470 名前:デフォルトの名無しさん mailto:sage [2019/02/13(水) 06:16:37.08 ID:2WlGbphz.net]
- >>466 今の言語は極力「生のポインタ」が見えないようにしてるからなぁ。
オレの乏しい知識で無理矢理ヒネリ出すなら、 「古いBASICの peek, poke のアドレス指定に変数を使った場合」かのう。 型のない単なるアドレスって言うか数値だけど。
- 471 名前:デフォルトの名無しさん [2019/02/13(水) 15:13:52.62 ID:Yg4iFXpY.net]
- upvar
- 472 名前:デフォルトの名無しさん mailto:sage [2019/02/13(水) 15:46:18.41 ID:SgfrIpbp.net]
- >>466
BYTE ptr = アドレス値; BYTE MEM[4096 * 1024]; // 4GB のメモリ配列 *ptr ---> MEM[ptr] // ptr は MEM[] 配列の添え字
- 473 名前:デフォルトの名無しさん mailto:sage [2019/02/13(水) 15:46:56.07 ID:GHq8zte2.net]
- 訂正:
BYTE MEM[4096 * 1024 * 1024]; // 4GB のメモリ配列
- 474 名前:デフォルトの名無しさん mailto:sage [2019/02/13(水) 15:48:00.46 ID:GHq8zte2.net]
- 訂正:
Uint32 ptr = アドレス値;
- 475 名前:デフォルトの名無しさん [2019/02/13(水) 18:19:07.37 ID:QnNf1eu6.net]
- 恥の上塗り
- 476 名前:デフォルトの名無しさん mailto:sage [2019/02/13(水) 19:18:53.91 ID:BFnAt9lr.net]
- intptr_t とか、INTPTRとか。
- 477 名前:デフォルトの名無しさん mailto:sage [2019/02/13(水) 19:41:39.99 ID:D91GFqhb.net]
- eax
- 478 名前:デフォルトの名無しさん [2019/02/13(水) 22:43:21.58 ID:8CyDgeqf.net]
- 行儀よく バッファなんて 守れやしなかった
夜のサーバ オーバフロー起こしてまわった *印見て アナルといわれた 早く添え字になりたかった 信じられぬ カーニハンとの 争いの中で 許しあい いったい何 解りあえただろう うんざりしながら それでも過ごした ひとつだけ解ってたこと このポインタからの 卒業
- 479 名前:デフォルトの名無しさん mailto:sage [2019/02/14(木) 07:38:16.87 ID:fSoz/vTj.net]
- まあstatic変数やglobal変数使ってリークしてないとか言い張るバカよりかは
ナマポ使えやとは思う。 それならまだコード修正効くからな。 初心者にスマポ使わせればリークしないコード書かせることができるって考えははっきりいって幻想だわ。
- 480 名前:デフォルトの名無しさん mailto:sage [2019/02/14(木) 22:35:36.88 ID:vW9ukCJU.net]
- 昔研究室の後輩でポインタがわからないから全部グローバル変数でプログラム作ってるって奴がいて、
それはそれである意味すごいなって思ったわ。 マルチメディア系ライブラリを触る必要がある研究室なのだが。 元々組込系が得意な奴だったってのもあると思うけど。
- 481 名前:デフォルトの名無しさん mailto:sage [2019/02/14(木) 22:50:47.58 ID:tlcLfILV.net]
- COBOLERだったんじゃね
- 482 名前:デフォルトの名無しさん mailto:sage [2019/02/15(金) 00:04:29.72 ID:tnuHGyjk.net]
- 一度切りの使い捨て用途とかなら全然よくね
- 483 名前:デフォルトの名無しさん mailto:sage [2019/02/15(金) 00:36:18.42 ID:kpfA4lgp.net]
- >>479
スマートポインタを使うとコード修正効かなくなるの?どういうこと?
- 484 名前:デフォルトの名無しさん mailto:sage [2019/02/15(金) 00:46:46.72 ID:TR5VS7Vw.net]
- mp4boxをちょこっといじったのを作ろうとしたんだけど、
signed int32の計算で -2112000 / 48000 の結果が 89434 になるんですが。 VS2015のx64です。
- 485 名前:デフォルトの名無しさん mailto:sage [2019/02/15(金) 06:57:51.95 ID:OZ8Dcboc.net]
- >>484 「-2112000 / 48000 の結果が 89434」
その環境を持ってないんで分からないけど、 -2112000 の32bit16進数表現が 0xffdfc600 89434 * 48000 == 4292832000.000 == 0xffdf6b00 両者のビットパターンが一致することと関係ありそうね。 被除数の -2112000 を64bitで表現する際に 符号拡張 0x_ffff_ffff_ffdf_c600 とすべきなのに ゼロ拡張 0x_0000_0000_ffdf_c600 にしちゃって、 その後の計算は64bit正数でやってる感じかな。
- 486 名前:デフォルトの名無しさん mailto:sage [2019/02/15(金) 07:20:58.81 ID:1DfV94Wg.net]
- >>483
本人がスマポ理解できてないってオチだろ
- 487 名前:デフォルトの名無しさん mailto:sage [2019/02/15(金) 07:22:53.73 ID:1DfV94Wg.net]
- >>480
組み込みが得意でポインタがわからない後輩 設定に無理がありすぎw
- 488 名前:482 mailto:sage [2019/02/15(金) 07:53:28.61 ID:OZ8Dcboc.net]
- 再び >>484 「-2112000 / 48000 の結果が 89434」 (間違いを訂正)
-2112000 の32bit16進数表現が 0xffdfc600 89434 * 48000 == 4292832000.000 == 0xffdf6b00 ビットパターン一致してないね。桁数多くて見間違えちゃった(テヘペロ)。 -2112000 を32bitで表現すると 0xffdfc600 であり、 これをゼロ拡張した 0x_0000_0000_ffdf_fc600 == 4292855330 を 48000 で割り算して小数部を捨てれば 89434 という答えが出る。 ということなら合ってるかな。
- 489 名前: mailto:sage [2019/02/15(金) 07:57:48.46 ID:8MeM2Ami.net]
- >>484
コードを https://ideone.com/ に貼っていただけませんか?
- 490 名前:デフォルトの名無しさん mailto:sage [2019/02/15(金) 09:49:31.73 ID:tuwIijw4.net]
- >>484
どうせ48000がunsignedなんじゃねーの それにつられて -2112000もunsignedになって4292855296 その結果が薬師美代ちゃん
- 491 名前:デフォルトの名無しさん [2019/02/15(金) 13:45:38.25 ID:TNDmXWGM.net]
- >>482
自分が何してるか判って使う分には問題無いな 適材適所だ
- 492 名前:デフォルトの名無しさん mailto:sage [2019/02/15(金) 21:13:40.77 ID:kkRd+/gL.net]
- >>483
>スマートポインタを使うとコード修正効かなくなる どういう風に読むとそういう理解になるのか。。 まずは日本語の理解が必要だな。
- 493 名前:デフォルトの名無しさん mailto:sage [2019/02/17(日) 07:14:37.91 ID:KxX3tJEE.net]
- 超初歩的な質問になるのですが
scanf関数を使って20個未満の任意の数だけ、数値を配列変数で受け取りたいです たとえば「2 4 8 9」と入力し、Enterが押されたらそれで確定 num[0]=2 num[1]=4 num[2]=8 num[3]=9 としたいわけです。 どうしたらよいでしょうか? 一応自分で考えたコード(期待通りの動きをしません)を掲載します for(i=0;i<20;i++){ scanf("%d",&num[i]); if(num[i]==‘¥n’){ break; } }
- 494 名前:デフォルトの名無しさん mailto:sage [2019/02/17(日) 07:30:35.53 ID:a45/WyPQ.net]
- for(i=0;i<20;i++) if (scanf("%d",&num[i]) != 1) break;
- 495 名前:デフォルトの名無しさん mailto:sage [2019/02/17(日) 09:09:16.12 ID:uZDoAvc4.net]
- >>493
scanfや標準ライブラリの関数など、参考書とかで普通の使い方はわかると思うけど、細かい仕様をmsdnやmanコマンドで調べるようにするとかなり理解が広がると思うよ。
- 496 名前:デフォルトの名無しさん mailto:sage [2019/02/17(日) 22:37:58.74 ID:O/E0SKNM.net]
- 中途半端なUI使うよりもcsvパーサーを作るかどっかからとってくるかすれば?
- 497 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 00:02:29.61 ID:yZfkTbdS.net]
- autoってコンパイル遅くなりますか?
- 498 名前: mailto:sage [2019/02/18(月) 00:59:53.43 ID:aN2QSVsl.net]
- >>497
むしろ遅くなる方に振れるでしょうけれど、そんなのどうでもいいのでは?
- 499 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 01:22:44.39 ID:c9cLPpQ7.net]
- autoって変数の型宣言の話だよね?
コンパイルは遅くなるのか 速くしたい時はどうすりゃ良いの?
- 500 名前:はちみつ餃子 mailto:sage [2019/02/18(月) 01:27:51.06 ID:ViRlfcsh.net]
- C++ の auto は右辺と一致させるように推論するだけの単純機構で、
ややこしい演算で推論するわけではないので、 コンパイル速度ではほとんど差はないと思うよ。
- 501 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 01:30:04.86 ID:tKsXQ0K5.net]
- autoはむしろコンパイル速くなるんじゃない?
いちいち型を解決せずとも、既に解決済みの型を右から左へコピーするだけでいいんだから C++でコンパイルを速くするのは簡単で、単純にソースファイル数とインクルードするヘッダを減らせばいい C++のコンパイルが遅いのは主にコンパイル単位という時代遅れで極めて非効率なコンパイル戦略に起因しており、実はコードの複雑さ自体はわりとどうでもいい
- 502 名前: mailto:sage [2019/02/18(月) 01:31:11.50 ID:aN2QSVsl.net]
- >>499
C++を言語として選択した時点で「記述の時間やコンパイル時間を投資して実行時間を稼ぐ」という思想なのでは?コンパイル時間を短くする努力はする気がないと思います
- 503 名前: mailto:sage [2019/02/18(月) 01:32:21.67 ID:aN2QSVsl.net]
- >>501
>いちいち型を解決せずとも、既に解決済みの型を右から左へコピーするだけ この記述はコンパイル時を想定しているの?それとも実行時を想定しているの? はっきりさせたいので念のために確認します
- 504 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 05:41:12.34 ID:KTgkm+s5.net]
- >>493 サーバーの 503 エラーに引っかかって昨日のうちに書けなかったんだが…。
>>494 の方法だと Enter が単純に読み捨てられて scanf() が終了せず まだ入力をよこせと言ってくるからダメみたいね。 11 22 33 (Enter) だと読み込みが継続、期待通りに動作しない 11 22 33 x (Enter) なら x を解釈する時点で scanf() が 0 を返してループ脱出 先に文字列として1行読み込んで sscanf() と思ったけど… ndat = sscanf(s, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &num[0], &num[1], &num[2], &num[3], &num[4], &num[5], &num[6], &num[7], &num[8], &num[9], &num[10], &num[11], &num[12], &num[13], &num[14], &num[15], &num[16], &num[17], &num[18], &num[19]); 実際に読めた値の個数は ndat に入る。 これは書くのもメンテナンスするのも嫌だなぁ。 strtol() で1個ずつ数値を拾いつつ、地道にポインタ進める方が良いかも。
- 505 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 05:53:27.02 ID:KTgkm+s5.net]
- >>503 自分は >>501 の人じゃないけど。
ごく簡単な場合ながら、例えば int val_a = func(para); // func() がint互換の値を返すかチェックが必要 auto val_b = func(para); // func() の返す型そのまんまで val_b を作ればいい てな具合に考えると auto で定義した方がコンパイル時の手間が少ない、 という考え方にも一理あるかと。
- 506 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 08:39:38.41 ID:KTgkm+s5.net]
- 瑣末なことだけど val_a, val_b って変数名は良くなかったね。
変数 variable の例なんだから var_a, var_b だわな。 というか、この場合は a, b で十分だ。
- 507 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 10:06:03.91 ID:PGieQvh3.net]
- まず計測しろよ
- 508 名前:491 mailto:sage [2019/02/18(月) 13:24:52.92 ID:fHtoi1qq.net]
- >>504
ありがとう。ちゃんと確認してなかったわ。 タブに空白に改行はスキップしやがるんでしたか 別案としては fgets() ⇒ sscanf() になるんかな
- 509 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 13:29:17.97 ID:fHtoi1qq.net]
- 505の後半は無しで
1文字ずつ切り出して解析してったほうがよさそうね
- 510 名前:デフォルトの名無しさん [2019/02/18(月) 15:27:41.58 ID:bbNHvPxv.net]
- コンパイル時間にリンク時間は含まれますか?
- 511 名前:デフォルトの名無しさん [2019/02/18(月) 15:28:58.14 ID:bbNHvPxv.net]
- >>504
scanf は禁止 >>508 が正しい
- 512 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 15:34:26.17 ID:c9cLPpQ7.net]
- 人間の様な邪悪なものからの入力でscanfは使うなと、ばっちゃは言ってた
- 513 名前: mailto:sage [2019/02/18(月) 20:54:12.82 ID:aN2QSVsl.net]
- >>505
>func() の返す型そのまんまで val_b を作ればいい この発想は実行時なのでは? >てな具合に考えると auto で定義した方がコンパイル時の手間が少ない、 実行時の発想をコンパイル時に適用していいのでしょうか?
- 514 名前: mailto:sage [2019/02/18(月) 20:54:41.05 ID:aN2QSVsl.net]
- >>507
コンパイル時間を計測するのですか?…
- 515 名前: mailto:sage [2019/02/18(月) 20:57:23.82 ID:aN2QSVsl.net]
- >>512
賛成です、そういうのは1ラインを秘術を尽くして何とか読み込み、後で sscanf() とかを使うべき
- 516 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 21:15:24.03 ID:JRPNr6+t.net]
- >>515
今回の例(>>493) のように可能な限り %d で抜き出して打ち切るとなると sscanf 単発では面倒 なんとか行単位でバッファに詰めた後 連続空白などでトークンに区切ってそのトークン単位で sscanf をぶんまわすような ほのかな中途半端感が
- 517 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 21:20:31.62 ID:etvvcICH.net]
- >>513
別に実行時の発想じゃないでしょ 型を書けばコンパイラはその型名に対応する型を解決しなければならないし、 型変換の要否や可否のチェックも必要
- 518 名前: mailto:sage [2019/02/18(月) 23:19:20.43 ID:aN2QSVsl.net]
- >>517
>型変換の要否や可否のチェック これは10中8, 9 コンパイル時にすることなのでは?
- 519 名前:デフォルトの名無しさん mailto:sage [2019/02/18(月) 23:37:20.44 ID:Q29xkQ9H.net]
- >>518
初めからずっとコンパイル時間の話をしている。お前さんだけ噛み合ってないから、もう黙っててくれ。
- 520 名前:デフォルトの名無しさん mailto:sage [2019/02/19(火) 15:32:09.41 ID:Hz70ZqtS.net]
- C++です
インクルードガードがあっても関数の定義がヘッダに書かれていればヘッダが複数回読み込まれていた場合リンク時に多重インクルードでエラーが出る ここまではわかるのですが、同じことをクラス関数で実験した結果エラーになりませんでした 具体的にはヘッダのクラス内に関数定義を書いて複数のファイルからインクルードしました これはどういうことなのでしょうか?
- 521 名前:デフォルトの名無しさん [2019/02/19(火) 16:00:36.20 ID:uP1odnYQ.net]
- >>520
クラス定義の中に書かれたメンバ関数の定義は 自動的にインライン関数になる(関数の実体の定義ではない) この場合は、複数の場所にメンバ関数の実体が作られるわけじゃない、 という説明でどうかな。
- 522 名前: mailto:sage [2019/02/19(火) 17:19:54.69 ID:BVj1SDNF.net]
- >>519
そもそも「実行時」「コンパイル時」の区別がついていないのでは、コンパイル時間の話なんかできないのでは? だから「実行時」「コンパイル時」どちらを適用するかに執着しているだけです
- 523 名前:デフォルトの名無しさん mailto:sage [2019/02/19(火) 17:23:21.85 ID:Hz70ZqtS.net]
- >>521
なるほど クラス内に定義を書くとインライン関数になって普通の関数としては扱われないんですね もう少し理解するために調べたのですが、インライン関数は内部リンケージのみを持つものとしてコンパイラに解釈されるらしいですね だからコンパイラはファイル間での関数の重複を調べようとしない そしてインクルードによって複数のファイルで同じものを読み込んだとしてもエラーにはならないと・・・ 理解です 勉強になりました ありがとうございました
- 524 名前:502 mailto:sage [2019/02/19(火) 17:39:36.16 ID:uP1odnYQ.net]
- 失礼、なぜか >>513 を見逃してて(黙殺するような意図はまったくなかった)。
C++ は関数を宣言・定義するときに返り値型を書くから auto で受けてもコンパイル時に曖昧さは生じないと考えたんだけど。 実行時まで返り値の型が決まらない関数って作れるんだっけ? これは純粋に質問、教えを乞いたい。 あんまり高度な話だと振り落とされるかも知れないけど。
- 525 名前:デフォルトの名無しさん mailto:sage [2019/02/19(火) 17:48:52.81 ID:h1wI7nx1.net]
- 型推論が実行時に行われるとかトンチキこいてるやつが一人騒いでるだけ
- 526 名前:デフォルトの名無しさん mailto:sage [2019/02/19(火) 18:43:18.16 ID:+3biNeIC.net]
- >>524
おそらく君の書いた「func()の返す型〜」をqz某が勝手に勘違いしているだけだからスルーしていいよ。 初心者が必ずしも正確な用語を使わないことくらい想像つくだろうし、文脈からして普通ならそんな勘違いはしないはずなのだが。
- 527 名前:はちみつ餃子 mailto:sage [2019/02/20(水) 00:20:40.27 ID:C98K3aY7.net]
- >>524
出来ない。 強いて言えば C++17 からは std::any があるけれど、 これはこれで実行時に型が決まるわけではなくて コンパイル時に std::any 型であることは確定する。
- 528 名前:デフォルトの名無しさん mailto:sage [2019/02/20(水) 00:28:15.76 ID:qDW9CRq2.net]
- >>523
> もう少し理解するために調べたのですが、インライン関数は内部リンケージのみを持つものとしてコンパイラに解釈されるらしいですね どこにそんな嘘書いてあった? https://timsong-cpp.github.io/cppwp/n4659/dcl.inline#footnote-94 > The inline keyword has no effect on the linkage of a function.
|

|