【初心者歓迎】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/ >>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のポインタでそれらの配列を 参照すれば出来るのかなと思ってるんですが、考え方はあってますか? >>266 ポリモーフィズムがうまくできていればAnimalのポインタの配列にDogやCatのポインタを突っ込めるはず。 >>268 んでサウンドは使えるようになったか?w >>268 ポインタ突っ込む方法を具体的に教えてくれませんか? ポインタがよく分からないです…。 Animal *array[10] = {NULL}; array[0] = new Cat(2, 3); array[0]->walk(); delete array[0]; >>270 一旦オブジェクト指向のことは忘れてポインタを先にしっかり学んできた方が近道かもよ。ここで小さなサンプル教えてもらって真似しても近い将来嵌まって行き詰まりそう。 オブジェクト指向の勉強が目的なら他の言語で始めた方が余計なところで躓かないと思う。 >>272 MZうyちゃーーーん♪はBASICで充分w DogやCatのインスタンスも複数あって、 Dog だけでループとかCatだけでループとかしたいんです。 animalだけでループするなら書いていただいたので良さそうなんですが。 DogやCatに自身のタイプを返す機能をつけるか、typeidを使ってループをフィルタすればいい dynamic_castでダウンキャスト失敗すればNULLが買える。一個800円。 >>278 何言ってるか不明ですがキーワードありがとうございます。 とりあえずググります。 for(auto a : animals){ if(typeid(a) == typeid(Dog*){ } } dynamic_cast<Cat>(array[0]) == NULLだったらarray[0]はネコではない || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ||. =ねらー三原則= || || 1.助けない || || 2.教えない 。 ∧_∧ いいですね。 || 3.関わらない\ (゚Д゚,,) ||________⊂⊂ | ∧ ∧ ∧ ∧ ∧ ∧ | ̄ ̄ ̄ ̄| ( ∧ ∧ ( ∧ ∧ ( ∧ ∧ | | 〜(_( ∧ ∧ __( ∧ ∧__( ∧ ∧ ̄ ̄ ̄ 〜(_( ∧ ∧_( ∧ ∧_( ∧ ∧ は〜い、先生。 〜(_( ,,)〜(_( ,,)〜(_( ,,) 〜(___ノ 〜(___ノ 〜(___ノ dynamic_cast<Cat*>(array[0]) == NULLだったらarray[0]はネコではない >>284 理解しました。 そのif文つかうとOpenMP使うときにロードが均等に分散されないので、 dogだけの配列欲しいですね。 >>289 それなら条件に該当するエントリのポインタを抜き出した配列を作ってループすればいいんじゃないか? ループ内の処理が並列化する価値があるくらいコストかかるなら、ポインタを抽出してコピーするコストは無視できるかと思われる。 >>290 ありがとうございます。 それやってみます。 > Animal *array[10] = {NULL}; 20年以上前に配列要素を一つ以上書かないといけない処理系があったな タイムスリップでもしてきたか Animal *array[10] = {p0, p1, p2}; だとすると array[0] 〜 array[2] は p0〜p2 になるが array[3] 以降は全部 NULL で FA? char *array[10] = {p0, p1, p2}; だとすると array[0] 〜 array[2] は p0〜p2 になるが array[3] 以降は全部 NULL で FA? >>294 Cだと今でもダメだから、それ見たんじゃないの? Windows の普通のソフトのインストーラは Program Files 以下に適当なフォルダを作ってそこにファイルをまとめて入れるけど、 コマンドラインアプリの場合ってどうしてる? GUI アプリと同じようにフォルダに突っ込んで環境変数 PATH を設定するってのが標準的なやり方だと思うけど、 そういうのが増えてくると PATH が長大になって嫌な感じなので、なんかうまい方法ってないもんかな? C/C++ とは直接の関係がなくてスマソ。 どのスレがベストかわからんかったもんで。 環境変数なんて入れずに叩くときにフルパス入れりゃいいだけでは? >>302 フルパスを前提にすると連携しづらい場合が出てくるんよ。 「このバッチファイルを実行するにはこのソフトとこのソフトを入れてね!」 みたいなことをやろうとすると、想定してたのと違うフォルダにインストールしてるだけで破綻してしまう。 32bit のアプリケーションって 32bit 版の Windows だと Program Files に入るけど 64bit 版の Windows だと Program Files (x86) 入るようにするのが基本的な作法じゃん? それだけでも違ってしまうけど システムドライブとは違うドライブにアプリケーションをインストールしたりする運用をやってる人は意外にいるので、 インストール先を選択させずに固定するってのも縛りが強いかなぁと思うし。 どこにインストールしてでも同じように使えるようにするには PATH くらいしか選択肢がなくなる。 でも嫌。 っていう話。 20年以上前からある問題だな Windowsではその辺は未だにグダグダだと認識している >>303 設定でその外部アプリへのパス指定できるようにすれば? インストール先固定、環境変数追加、レジストリ追加よりユーザーに指定させるほうが個人的には好き というかこの三種のような方法をとるアプリはそもそもインストールを躊躇する コマンドラインアプリでコンソールから起動 バッチファイルから呼び出し etc 実行ファイルの検索順位に依存しまくるからにゃぁ app paths をコマンドラインでも適用してくれよって思ってる。 > 32bit のアプリケーションって 32bit 版の Windows だと Program Files に入るけど > 64bit 版の Windows だと Program Files (x86) 入るようにするのが基本的な作法じゃん? > それだけでも違ってしまうけど 違わない 32bitアプリケーションからは Program Filesしか見えない 実際はProgram Files (x86)をアクセスしてる訳だが そんなことは32bitアプリケーション側は知らなくて良いし知らない方が良い class A{ public: B b } class B{ … } の時、Aのコンストラクタなどで b = new B; とすると、 このbはAのクラス内で使えますが、Aのデストラクタが走る時に、 bも一緒に消えるのでしょうか。 それとも別途に delete b が必要なのでしょうか。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる