【初心者歓迎】C/C++室 Ver.105【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスやWin32APIなどの環境依存なものもOK そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 http://codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.104【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1545944692/ つまり、めんどくせぇし表現乱立するくらいならvectorなりarray使えってことだな mallocした配列なら* 二次元配列なら** 三次元なら*** すんごく分かり易いじゃん >>167 >cでは、配列は構造体とは違い「満足なオブジェクト」ではないんだ 私にいわせると、C の配列の扱い方こそ正義であり、まるまま渡せるという構造体の方が正義に反するやりかただと考えています 構造体の扱いに関しては、K&R1 のままの方が良く K&R2 は改悪だったと思っています >>168 乱立とかちょっと何言ってるかわかんない Cだけだといろいろ物足りないから C++ をちょっと便利な C として 手を付けるのは あり? Better Cっていう用語があるくらい一般的な使い方です >>173 みんなそうやって C から C++ に移ってきたのだと、私は思います >>175 お前はC++の機能はまともに使えてないけどな >>176 どんなところが「まともに使えていない」と感じられるものだったのでしょうか? いや、もうc言語とかいいじゃん、 c++使おうよ 配列で悩むのめんどくさくね? 配列のサイズ渡せないとか欠陥だからマジで >>176 どうせメタプログラミングもまともに出来ない雑魚だろ? >>178 vectorやarrayじゃないと渡せないと思ってる? >>179 じゃあ、共通的なやり方で動的配列のサイズ渡してくださいよ どうやるんですか? メタプロなんてできない方がかえって生産性あがるわ。 カスが使うと無駄にモジュラリティーの低いもの作るだけ。 >>182 貴重なお言葉恐悦至極に存じます、メタプロとかは私は一生理解できないと思っていますが、それでもいい、というお言葉ですよね… >>182 > 「カスが使うと」無駄にモジュラリティーの低いもの作るだけ。 よくわかってるじゃないかw つまりksかどうかを判定するにはメタプロさせてみればいい、ってこと? >>177 何か指摘するとまたイチャモンつけて否定するだけだろ 俺がまともに使えてないと感じた 理由は自分で考えな >>187 >何か指摘するとまたイチャモンつけて否定するだけだろ そうでもないと思いますよ…実感では 3% くらいしか使っていないかと >>183 理解の問題じゃなくてセンスの問題だつってんだよバカ。 >>189 そうですか、でも、それはそれで興味深いですね センスの問題、ということは非言語領域的テーマだろうか、と推察しますが、 コンピューター言語という極めて形式的=言語的な領域の話にて非言語的概念が語られる、いや、それが最重要であるというところに奥の知れない「恐ろしさ」を予想します (どうもコンパイル時最適化が効くからテンプレートメタプログラミングするって人がいないように思う) コンパイル時最適化て、C++の最適化は普通コンパイル時とリンク時だけやろ >>192 リンク時に最適化するのですか?単にリンカがリンクするだけだと思っていましたが メジャーなコンパイラにはある機能だよ リンク時最適化でggr テンプレートのコンパイル時最適化なんてのはマクロ展開的な最適化をしてるだけ。 そんな最適化が必要な部分はもっと慎重に関数化するわ。 ただドヤリたいだけのバカがありがたがってるってのがよくわかる。 これまで何も考えずにC++で配列を使ってたんですけど もしかしてC++で配列を使うのってナメられますか? arrayやvectorなどでないとやはりコードのクオリティが下がることになってしまうのでしょうか? newからdeleteまでの間の例外処理に不備がないと自信があるなら生配列で構わん >>197 静的配列なら生配列もありかと思う 静的配列でもarrayのメソッド使いたいとか引数で他の関数等に渡すとかあるならarray 動的配列なら他に理由がない限りvector一択 >>197 生配列とarrayやvectorのメリットデメリットや使い分けを理解せずに何も考えずにarrayやvectorにする方がいいらしいなんて理解の仕方ならクオリティは低いままだよ。 >>195 その表現もおかしいけどな テンプレートによってマクロ展開的に生成されたコードにも等しく最適化がかかるだけであって >>197 コードのクオリティとか良いコードとかより、最終的にどちらがユーザーの利益になるかどうかを考える方が健全だと思うけど >>201 マクロ展開で実行評価される必要のない部分が削られるって話なんだが あんまり理解してないでしょ? まあ別に理解してないならしてないでほとんどの場面で使わなくていいものではあるが。 >あんまり理解してないでしょ? こっちの台詞だよ 必要とされたときに初めて実体化されるの 必要ないのに全ての型全ての組み合わせ用意してから削ってると思ってたのか >>197 「配列 キャッシュ効率」で調べると次のようなものが出てくる 平たく言うと「配列をキャッシュに乗せる」 プログラミング :: 高速なプログラムを書く為に :: メモリ ttp://myoga.web.fc2.com/prog/cpp/opti02.htm Processingで見るプログラミングスタイル七変化 - Qiita ttps://qiita.com/FAL/items/19be333d55f7fcb1943a プログラムを高速化する話 ttps://www.slideshare.net/KMC_JP/ss-45855264 >>203 やっぱ変数評価の問題とマクロの関係を全く理解してないんだな。 >>196 そういう型マッチングシステムに依存しまくったものの危険性を全く理解してないのが 問題なんだよ。 SFINEとか型マッチングシステムのデバッグしずらいものに頼る問題を 全く意識していない輩が多すぎる。 変数(というよりテンプレート実引数)を特殊化なりオーバーロードなりで評価した結果コードが生成されない(テンプレートが実体化されない)のは最適化でも何でもない ただし、よくわかりもせずにテンプレートを持て囃したりC++歴数年でテンプレートに首突っ込む(しかも生産性ガン無視で)初心者が増えたのは俺も問題だと思う >>205 君の用語の使い方が独特で、君の思ってることを読み取れるエスパーは少ないって話だと思うよ。 マクロ展開の「実行評価」って何なの? 具体的な問題を挙げずに危険とかいうのは単なるFUDってやつじゃないの? 理解させるために言葉を工夫するつもりが無いなら黙ってくれていい。 >>209 理解してないならそういえばいい。 とりあえずcommon-lispでも勉強することをオススメする。 少しは見識が広がると思うよ。 >>210 common lispで実行評価って、evaluationのことを言いたいのだろうか?それなら「評価」と訳されると思うけど、実行評価はググっても見当たらない。PDCAの用語と混同してるのではないかと思えてしまう。 lispがでてくるならこれはもう defmacro しかないんじゃないか? そやっ common lisp言うたら相手びびるはずやっ まずはダイナミックとスタティックの違いがある 静的なものは未来永劫不動なので、一度作ったら未来でも一切変わらない 動的なものは「未来は不定である」「未来は誰にも分からない」という哲学あるいは神学から作られたので、未来に挙動が変わる 決定論的な未来の世界観では一度作ったらそれきり、静的なものが出来上がる ここでいう決定は本当に神学で、全知全能の神を指している 未来の事柄があらかじめ全部分かっていれば、ダイナミックなことはしなくて良くなる、というのが、彼ら西洋人の究極の理想論 今分かることは動かす前に全部決め打ちすりゃーいい、ってのが静的だ >>215 >未来の事柄があらかじめ全部分かっていれば、ダイナミックなことはしなくて良くなる、というのが、彼ら西洋人の究極の理想論 ラプラスの悪魔、という語句をご存知ですか?西洋人ですら「未来の事柄をあらかじめ」予測することはできない、と観念しているようですよ… 色んなサイトを見てC言語の文法を学習中なのですが構造体の自己参照のやり方がどうも分かりません。 かんたんな短いサンプルコードを使って教えてほしいです よろしくお願い致します😪 構造体Aが内部に構造体Aを持つとすると、Aは無限の構造的ループを持つことになる。これはあり得ない。 自己参照するなら、Aのポインタを使わないといけない。 typedef struct A { struct A *next; int value; } A; こんな感じになる。ポインタが分かっているなら、 A *a = (A *)calloc(1, sizeof(A)); a->next = NULL; a->value = 666; ... この変数aにさらに追加するなら、 A *b = (A *)calloc(1, sizeof(A)); a->next = b; ... 問題は破棄だが、自己参照をたどっていってすべてのAの実体に対して、 freeを呼ばないといけない。 ただし、同じ実体に対して2回free関数を呼ぶことはできない。 また、解放した実体のメンバーは参照することができない。 参照すると、不正読み込みでプログラムが異常終了するかもしれない。 ということでパズルのように解放方法のアルゴリズムを考案しないといけない。 C言語というのは、そういうややこしさをはらんでいる。 1個追加したいときに、このようなコードをいちいち書くのは大変なので、 普通は「1個追加する」という動作を行う関数を用意する。 void add(A *a, int value) { A *b = (A *)calloc(1, sizeof(A)); b->next = NULL; b->value = value; a->next = b; } テンプレートの話題でlispの話題ならマクロの話ってピンとくるもんだと思ったが 結構バカが多いんだな。 >>218 かなりコンパクトに纏めていただきありがとうございます ただまだcallocとポインタ型のキャストがいまいち分からなくて😪 すいません calloc(1, sizeof(A))は、1*sizeof(A)バイトのメモリーブロックを確保し、ブロックをゼロでクリアする。そして先頭アドレスとしてvoid*型を返す。リファレンスをちゃんと読もう。全部書いてある。 c++でanimal, dog, catなどのクラスを作ってオブジェクト指向の勉強してます. dogとcatはanimalを継承するよくある例です. 適当にa[]という配列を切って,a[0]はdogのクラスでa[1]はcatのクラスで… というようにしたいのですが,この配列a[]の型やaのクラスを指定するやり方が 分かりません. 最終的にはa[i].barkというようなことをやりたいです. よくある質問だと思うのですが,適切な検索ワードが分からず困っています. どうやったら良いかor適切なキーワードを教えてください. animalの配列にdog, catをアップキャストしてぶち込む animal, dog, catのunionを作り、そのunionの配列を作る >>226 さっぱり分かりませんがありがとうございます.これでgoogle先生に質問できます. >>229 こんな感じですか? push_backでエラーが出てコンパイル出来ませんが… std::vector<std::unique_ptr<Animal>> a; a.reserve(2); a.push_back(std::make_unique<Dog>()); a.push_back(std::make_unique<Cat>()); 基底クラスの実体配列じゃ多分無理で 基底クラスのポインタ配列しかないと思うわー ポインタの配列を作ったつもりだったんですが違うんですね.... 誰か簡単なコード書いてくれませんか? c++17ならstd::variantが使えそうだけどね。 >>232 std::unique_ptrだからうまくいかない 生ポインタにするだけで通る >>230 VS2019だと問題なくコンパイルできるけど。 Animalをpublic継承していないとかだったりして。 >>230 > push_backでエラーが出てコンパイル出来ませんが… なぜエラーメッセージを貼らないの? つか、エラー貼るまでもないだろ std::unique_ptr コイツはmovしかできないから、コンテナに格納できる条件に合わない。 スマートポインタをコンテナに入れたかったらsharedポインタを使う 常識じゃなかったのか unique_ptrはコンテナに格納可能という俺の常識とは違うようだな >>239 >>235-237 でエラーなくコンパイルできるのに何を言ってるんだよw >>239 std::unique_ptrはコンテナに入れられるぞ std:auto_ptrをコンテナに入れた場合に起きるCOAPという問題は起きないんだぜ 質問者です。すいません。 コンストラクタのエラーでした。 無事コンパイルできました。 ありがとうございました。 人の書いたプログラム読んでるですが,#includeとclassの定義の間に入ってるclassの意味が分かりません. 下の例で言うとHogeのところです. これは何ですか? #include <string> class Hoge; class Foo : public Bar { protected: ... class TA{ static public int a; } があって、 int b = TA::a ; のようにするのと、 TA A; int b = A.a; のようにするのは、bに読み込む速度は違うんですかね。 >>247 後者はAの実体を作るから遅いかも。まあ多分、最適化で変わらないと思う。 wavファイルなどの外部の別ファイルを読み込んで使いたいのですが、どのようにやればいいのでしょうか…? バイナリデータにして読み込む、みたいな方法を見かけたのですがファイルのサイズが大きすぎるとヒープの領域を使い果たしました的なエラーが出てしまって行き詰まっています mallocを使う まずは音ではなく画像、bmp読み込みから練習する 数百MBの音声ファイルよか数MBのbmp画像読み込みの方が気がラク >>249 一度に全データを読み込むのでなく、固定サイズのバッファに、必要な分だけ少しずつ読み込めばいい。 読み込み済みデータを再生するスレッドとは別に、もう一つのスレッドで再生にあわせてデータを先読みで読み込んでいけばいい。途切れなく再生するにはリングバッファとかを使う。 malloc・リングバッファ、詳しく調べて挑戦してみようと思います! あとスレッドの概念もちゃんと理解できてない気がするのでそこも勉強しようと思います。 ありがとうございます! >ファイルのサイズが大きすぎると 積んでるメモリぐらいでかいファイルなのかな? どういった読み込みで失敗してるんだろう? > ヒープの領域を使い果たしました的なエラー これからまず連想したのは、VCで巨大ファイルをリソース化しようとしたときに出るコンパイルエラーだな どのタイミングで出たエラーか書いてないからわからんけど 実行ファイル中にリソースとして埋め込み リソースからバイナリ列を引き出して(読み出して) 再生コードに渡す 音声を実行ファイルに埋め込みたかったのかな? もう少し詳しく書くと、とあるプラグインを作りたくて、それ用のプロジェクトファイルのジェネレーターとVisual studio 2019 を使っています。 そのジェネレーターを通してwavファイルをバイナリデータ化しているのですが、wavファイルのサイズが一定以上になると「error C1060 ヒープの領域を使い果たしました」っていうエラーが出てビルドが通らない状態です。 10MBぐらいのwavファイルだと普通に通って、18MBぐらいになるとエラーが出ます。 プラグイン本体にバイナリデータ埋めまず、エンドユーザーにはプラグインと音声ファイルを配布 音声ファイルのパスだけうまく帳尻あわせてファイル開いて、メモリ確保して、ファイル読んで、etc って設計するかな >>256 そのジェネレータとやらがエラー吐いたという話ならスレ違いだろう。 スレチのような気もするんですが,ここが一番適切な回答がありそうなんで,質問させて下さい. iPadでc++のコード(複数のファイルでつくられている)を読みたいんですが便利なビューワーありますか? 関数名やクラス名クリックしたら定義してるところまでジャンプしてくれるようなやつを探してます. emacsで言うetagsみたいな機能のことです. 「ipad emacs」 でぐぐったら iPad用の emacs そのものがあるようだけど >>264 後出しですいません.キーボードは使わないのでemacsはないです.あと,iPadのemacsはけっこうがっかりだった記憶が…. タッチでジャンプできると嬉しいのですが…. 便利そうなエディタは何個かあるみたいなんですが,ジャンプ機能がないんですよね. 以前 >>225 で質問させてもらったものです。 >>230 で書いたようなプログラムを作ってるんですが、 DogやCatだけでループを回したいんですがどうしたら良いですか? Dogだけの配列とCatだけの配列作ってから、Animalのポインタでそれらの配列を 参照すれば出来るのかなと思ってるんですが、考え方はあってますか? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる