【初心者歓迎】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/ >>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 が必要なのでしょうか。 一緒に消えないのですか。どうもありがとうございました。 >>310-312 A のコンストラクタ内で例外が送出されると delete b が実行されない可能性があるのでなるべくならスマートポインタを使うのが望ましいし楽。 B b; と定義したなら、b = new B;が不要で、Aのデストラクタ実行時にbも一緒に消える。 B* b; と定義したなら >>311 だが、わざわざポインタで定義するのは コピーコンストラクタ等々自前で定義しなきゃならんのでお勧めしない。 スマポならAのデストラクタ実行時にbも一緒に消えるけど、 shared_ptrはコピー時に共有されてしまうし、unique_ptrはコピーできなくなる。 なるほど。B* bで書いたつもりが間違ってました。 しかしA内でbを使い回すなら、B b の方が良さそうですね。 どうもありがとうございました。 多分スレチな話題だけど 高速化目的で固定小数点数クラス作って満足してた所に、コンパイラの設定で浮動小数点モデルをfastにしたら何倍も速度差つけられたんだが どういう原理でそうなるのかわからない 調べても中々資料出てこないし 誰か教えて下しい >>317 現代では浮動小数点はハードウェア (CPU) のサポートがあるので丸め方の一貫性とか捨ててめいっぱいに CPU の機能を利用したら速いよ。 昔、インテルの一部のCPUにfloating pointの処理に不具合があって、それで高い精度が求められるプログラムでは、ソフトで対応できるようなコンパイラが作られたらしい(要出展?)。 SSDは早い。400MB/sec近い。 HDDは遅い。100MB/secくらい。 音声に加えて画像も出力することを考慮すると、音声出力の実際の性能は50MB/sec以下だろう。 音声を最高の品質にすると、10msecごとに音声データがおよそ3900バイトあるようだ。1秒では390000バイト、390KB/secになる。余裕のよっちゃんだ。 記憶媒体やOSはときどきフリーズすることがある。0.5秒フリーズしても耐えられるようにするには、390KB*0.5==195KB。 少なくともこれだけのバッファが必要になる。余裕を持って事前にリングバッファ400KBを用意することにする。 一度にファイルに書き込むデータは100KBにする。このデータ量は小さすぎても性能が下がるし、大きすぎると流れが止まってしまう。 アプリ起動時に音声消費スレッドを起動する。イベントハンドルで音声データが車で待つ。イベントが来たら、音声データを少しずつファイルに吐き出して、消費する。全部消費したら再びイベントを待つ。これの繰り返し。 長く録画してると、画像と音声のタイミングがずれる。 WM_TIMERのせいか? WM_TIMERの精度が低いから音ずれが起きている。 QPCと別スレッドで書き直し。 何のタイミングを作ろうとしてる? リアルタイムに録画したデータをストレージに保存するんだよね? どうもタイミングの累積誤差があって、ゲームのWinDepthで試すと動画では音が遅れるみたいなんだ。 録画した後、それを再生するとずれていくといこと? それとも狙った時間でスクショをキャプチャできないという意味? >>336 WindowsMediaPlayer起動しながらやってみたらどうなる? Visual Studio 2017だと音ズレはなくなった。 MSYS2のデバッグバージョンでは少しずつ音がずれる。 WinDepth のSTAGE 2にいくと0.5秒ほどずれる。 MSYS2のリリースバージョンでも音ズレなくなった。 ありがとうございます。 https://github.com/katahiromz/YappyCam/blob/master/YappyCam.cpp#L75 これがPictureConsumerThreadProc (映像消費スレッド)。 https://github.com/katahiromz/YappyCam/blob/master/YappyCam.cpp#L158 これがPictureProducerThreadProc (映像生成スレッド)。 次はパフォーマンスを出来る限り高めないといけない。 CreateThreadはCRTと一緒に使っちゃいけないらしいから、_beginthreadexで書き直しだ。 PT_SCREENCAPにBITMAPチェックを入れたら直った。 画面にごみが残るのはどうにかならないかなあ? フレーム落ちはしてないから、性能の問題ではない。たぶんフレームと音声のタイミングの違いだろう。音声の方が長い場合は音声を削ることも検討する。 >>346 なんか意味あるの? 当たり前だが、フレームレートに枚数をかけ算すると、動画の時間が求まる。これを音声の長さと比較して音声が長ければ音声の先頭を削除。これでいってみるか。 あらかじめMediaPlayerを起動しておくと あら不思議なぜか動作が軽い っていうのは昔から有名な検証方法の一つ >>347 Windowsのタイマーはmsecのオーダーは出ない(Linuxもだ) それしかビデオのタイミング作る手段がないならタイムスタンプ管理すべきだ またPCではそもそもハードウェア的にビデオとオーディオは同期してる保証がない その前提を踏まえてつくる必要がある オーディオもビデオもキャプチャしたタイミングでタイムスタンプを取得して同様にファイルに保存する 再生するときにそのタイムスタンプを比較してビデオが±0.5フレームずれてきたら フレームをスキップかリピートして調整する オーディオを基準に考えるのがポイントだ 最後にWindows10では画面録画は標準機能だ >>351 核心情報キタ―――(゚∀゚)―――― !! ありがとうございます。 YappyCam 0.9をリリースしました。 https://katahiromz.web.fc2.com/yappycam/ja - パフォーマンスの改善。 - 音ズレを修正。 これで終わり、、、じゃないよ。 プラグインで時刻表示と猫耳ができるまで終わらないぞ。 プラグインを実装するには自作のPluginFrameworkを参考にする。 これもC++/Win32で書かれている。 PluginFramework https://github.com/katahiromz/PluginFramework 拡張子は.yapでいいだろう。拡張子こそ違うが、プラグインファイルの中身はDLLファイルと同じ。LoadLibraryで読み込めるはずだ。 クラスの中の処理を別のプロセスのプログラムに行わせたいんですけどどのような方法があるでしょうか 64bit環境のプログラムにインターフェースのみを提供するクラスがあって、中の処理を32bitのプログラムに行わせたいです クラスは状態を保持する必要があるので呼び出す度にプログラムを実行することはできません ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる