X



【初心者歓迎】C/C++室 Ver.105【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0198デフォルトの名無しさん
垢版 |
2019/08/17(土) 15:52:09.37ID:BZ3r0cTp
newからdeleteまでの間の例外処理に不備がないと自信があるなら生配列で構わん
0199デフォルトの名無しさん
垢版 |
2019/08/17(土) 16:56:59.91ID:kME64/ZP
>>197
静的配列なら生配列もありかと思う
静的配列でもarrayのメソッド使いたいとか引数で他の関数等に渡すとかあるならarray
動的配列なら他に理由がない限りvector一択
0200デフォルトの名無しさん
垢版 |
2019/08/17(土) 17:14:22.35ID:WCU4L4CL
>>197
生配列とarrayやvectorのメリットデメリットや使い分けを理解せずに何も考えずにarrayやvectorにする方がいいらしいなんて理解の仕方ならクオリティは低いままだよ。
0201デフォルトの名無しさん
垢版 |
2019/08/17(土) 18:13:22.13ID:1UQd730E
>>195
その表現もおかしいけどな
テンプレートによってマクロ展開的に生成されたコードにも等しく最適化がかかるだけであって

>>197
コードのクオリティとか良いコードとかより、最終的にどちらがユーザーの利益になるかどうかを考える方が健全だと思うけど
0202デフォルトの名無しさん
垢版 |
2019/08/18(日) 00:09:06.82ID:XCKtcmfj
>>201
マクロ展開で実行評価される必要のない部分が削られるって話なんだが
あんまり理解してないでしょ?
まあ別に理解してないならしてないでほとんどの場面で使わなくていいものではあるが。
0203デフォルトの名無しさん
垢版 |
2019/08/18(日) 08:44:15.16ID:vyOg2WJ0
>あんまり理解してないでしょ?
こっちの台詞だよ
必要とされたときに初めて実体化されるの
必要ないのに全ての型全ての組み合わせ用意してから削ってると思ってたのか
0204デフォルトの名無しさん
垢版 |
2019/08/18(日) 09:58:09.36ID:S9bN8HAf
>>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
0205デフォルトの名無しさん
垢版 |
2019/08/18(日) 12:05:15.42ID:XCKtcmfj
>>203
やっぱ変数評価の問題とマクロの関係を全く理解してないんだな。
>>196
そういう型マッチングシステムに依存しまくったものの危険性を全く理解してないのが
問題なんだよ。
SFINEとか型マッチングシステムのデバッグしずらいものに頼る問題を
全く意識していない輩が多すぎる。
0206デフォルトの名無しさん
垢版 |
2019/08/18(日) 12:24:08.36ID:vyOg2WJ0
変数(というよりテンプレート実引数)を特殊化なりオーバーロードなりで評価した結果コードが生成されない(テンプレートが実体化されない)のは最適化でも何でもない
0207デフォルトの名無しさん
垢版 |
2019/08/18(日) 12:27:17.01ID:vyOg2WJ0
ただし、よくわかりもせずにテンプレートを持て囃したりC++歴数年でテンプレートに首突っ込む(しかも生産性ガン無視で)初心者が増えたのは俺も問題だと思う
0209デフォルトの名無しさん
垢版 |
2019/08/18(日) 12:52:38.69ID:rJ9LPM9I
>>205
君の用語の使い方が独特で、君の思ってることを読み取れるエスパーは少ないって話だと思うよ。

マクロ展開の「実行評価」って何なの?
具体的な問題を挙げずに危険とかいうのは単なるFUDってやつじゃないの?

理解させるために言葉を工夫するつもりが無いなら黙ってくれていい。
0210デフォルトの名無しさん
垢版 |
2019/08/18(日) 18:15:25.68ID:XCKtcmfj
>>209
理解してないならそういえばいい。
とりあえずcommon-lispでも勉強することをオススメする。
少しは見識が広がると思うよ。
0211デフォルトの名無しさん
垢版 |
2019/08/18(日) 22:22:43.25ID:4oEGaRbg
>>210
common lispで実行評価って、evaluationのことを言いたいのだろうか?それなら「評価」と訳されると思うけど、実行評価はググっても見当たらない。PDCAの用語と混同してるのではないかと思えてしまう。
0215デフォルトの名無しさん
垢版 |
2019/08/19(月) 11:27:33.54ID:icNxZHqv
まずはダイナミックとスタティックの違いがある
静的なものは未来永劫不動なので、一度作ったら未来でも一切変わらない
動的なものは「未来は不定である」「未来は誰にも分からない」という哲学あるいは神学から作られたので、未来に挙動が変わる

決定論的な未来の世界観では一度作ったらそれきり、静的なものが出来上がる
ここでいう決定は本当に神学で、全知全能の神を指している
未来の事柄があらかじめ全部分かっていれば、ダイナミックなことはしなくて良くなる、というのが、彼ら西洋人の究極の理想論

今分かることは動かす前に全部決め打ちすりゃーいい、ってのが静的だ
0216◆QZaw55cn4c
垢版 |
2019/08/19(月) 18:55:20.55ID:D6AI5dRa
>>215
>未来の事柄があらかじめ全部分かっていれば、ダイナミックなことはしなくて良くなる、というのが、彼ら西洋人の究極の理想論
ラプラスの悪魔、という語句をご存知ですか?西洋人ですら「未来の事柄をあらかじめ」予測することはできない、と観念しているようですよ…
0217入門
垢版 |
2019/08/19(月) 20:35:59.98ID:aCo9z6Zb
色んなサイトを見てC言語の文法を学習中なのですが構造体の自己参照のやり方がどうも分かりません。
かんたんな短いサンプルコードを使って教えてほしいです
よろしくお願い致します😪
0218蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/08/19(月) 20:40:39.17ID:GYeBbzEk
構造体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を呼ばないといけない。
0219蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/08/19(月) 20:48:42.67ID:GYeBbzEk
ただし、同じ実体に対して2回free関数を呼ぶことはできない。
また、解放した実体のメンバーは参照することができない。
参照すると、不正読み込みでプログラムが異常終了するかもしれない。

ということでパズルのように解放方法のアルゴリズムを考案しないといけない。
C言語というのは、そういうややこしさをはらんでいる。
0220蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/08/19(月) 20:56:19.12ID:GYeBbzEk
1個追加したいときに、このようなコードをいちいち書くのは大変なので、
普通は「1個追加する」という動作を行う関数を用意する。

void add(A *a, int value)
{
A *b = (A *)calloc(1, sizeof(A));
b->next = NULL;
b->value = value;
a->next = b;
}
0221デフォルトの名無しさん
垢版 |
2019/08/19(月) 21:05:52.16ID:thJnfNrr
テンプレートの話題でlispの話題ならマクロの話ってピンとくるもんだと思ったが
結構バカが多いんだな。
0223入門
垢版 |
2019/08/19(月) 22:29:52.38ID:OunjwQY3
>>218
かなりコンパクトに纏めていただきありがとうございます
ただまだcallocとポインタ型のキャストがいまいち分からなくて😪
すいません
0224さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/08/19(月) 22:45:30.60ID:5pda5jNo
calloc(1, sizeof(A))は、1*sizeof(A)バイトのメモリーブロックを確保し、ブロックをゼロでクリアする。そして先頭アドレスとしてvoid*型を返す。リファレンスをちゃんと読もう。全部書いてある。
0225デフォルトの名無しさん
垢版 |
2019/08/20(火) 13:31:20.80ID:iQfxCe91
c++でanimal, dog, catなどのクラスを作ってオブジェクト指向の勉強してます.
dogとcatはanimalを継承するよくある例です.
適当にa[]という配列を切って,a[0]はdogのクラスでa[1]はcatのクラスで…
というようにしたいのですが,この配列a[]の型やaのクラスを指定するやり方が
分かりません.
最終的にはa[i].barkというようなことをやりたいです.
よくある質問だと思うのですが,適切な検索ワードが分からず困っています.
どうやったら良いかor適切なキーワードを教えてください.
0226デフォルトの名無しさん
垢版 |
2019/08/20(火) 13:45:18.40ID:XxGMpj+X
animalの配列にdog, catをアップキャストしてぶち込む
animal, dog, catのunionを作り、そのunionの配列を作る
0228デフォルトの名無しさん
垢版 |
2019/08/20(火) 13:58:30.55ID:J42ZId0L
>>226
さっぱり分かりませんがありがとうございます.これでgoogle先生に質問できます.
0230sage
垢版 |
2019/08/20(火) 15:46:52.82ID:5Gd7p9P4
>>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>());
0231デフォルトの名無しさん
垢版 |
2019/08/20(火) 15:47:51.55ID:KtaU4TpY
基底クラスの実体配列じゃ多分無理で
基底クラスのポインタ配列しかないと思うわー
0232225
垢版 |
2019/08/20(火) 16:04:10.66ID:5Gd7p9P4
ポインタの配列を作ったつもりだったんですが違うんですね....
誰か簡単なコード書いてくれませんか?
0239デフォルトの名無しさん
垢版 |
2019/08/20(火) 20:23:10.77ID:QkieET4w
つか、エラー貼るまでもないだろ

std::unique_ptr

コイツはmovしかできないから、コンテナに格納できる条件に合わない。

スマートポインタをコンテナに入れたかったらsharedポインタを使う

常識じゃなかったのか
0242デフォルトの名無しさん
垢版 |
2019/08/20(火) 23:47:14.68ID:ehCs1rOT
>>239
std::unique_ptrはコンテナに入れられるぞ
std:auto_ptrをコンテナに入れた場合に起きるCOAPという問題は起きないんだぜ
0243230
垢版 |
2019/08/21(水) 20:14:24.97ID:tFOQQ8LH
質問者です。すいません。
コンストラクタのエラーでした。
無事コンパイルできました。
ありがとうございました。
0244デフォルトの名無しさん
垢版 |
2019/08/26(月) 16:42:54.84ID:LypwkFGf
人の書いたプログラム読んでるですが,#includeとclassの定義の間に入ってるclassの意味が分かりません.
下の例で言うとHogeのところです.
これは何ですか?

#include <string>
class Hoge;
class Foo : public Bar
{
protected:
...
0246デフォルトの名無しさん
垢版 |
2019/08/26(月) 17:01:32.76ID:LypwkFGf
ありがとうございます.ググって勉強しまう.
0247デフォルトの名無しさん
垢版 |
2019/08/26(月) 19:18:54.68ID:YVFaeJ51
class TA{
 static public int a;
}
があって、

int b = TA::a ;
のようにするのと、

TA A;
int b = A.a;
のようにするのは、bに読み込む速度は違うんですかね。
0249デフォルトの名無しさん
垢版 |
2019/09/08(日) 17:10:16.42ID:eAq/jxOF
wavファイルなどの外部の別ファイルを読み込んで使いたいのですが、どのようにやればいいのでしょうか…?
バイナリデータにして読み込む、みたいな方法を見かけたのですがファイルのサイズが大きすぎるとヒープの領域を使い果たしました的なエラーが出てしまって行き詰まっています
0250デフォルトの名無しさん
垢版 |
2019/09/08(日) 17:38:17.62ID:46Wp6heU
mallocを使う
まずは音ではなく画像、bmp読み込みから練習する

数百MBの音声ファイルよか数MBのbmp画像読み込みの方が気がラク
0251デフォルトの名無しさん
垢版 |
2019/09/08(日) 19:18:59.59ID:MtO5EQx1
>>249
一度に全データを読み込むのでなく、固定サイズのバッファに、必要な分だけ少しずつ読み込めばいい。
読み込み済みデータを再生するスレッドとは別に、もう一つのスレッドで再生にあわせてデータを先読みで読み込んでいけばいい。途切れなく再生するにはリングバッファとかを使う。
0252デフォルトの名無しさん
垢版 |
2019/09/08(日) 21:28:55.65ID:eAq/jxOF
malloc・リングバッファ、詳しく調べて挑戦してみようと思います!
あとスレッドの概念もちゃんと理解できてない気がするのでそこも勉強しようと思います。
ありがとうございます!
0253デフォルトの名無しさん
垢版 |
2019/09/09(月) 10:46:06.36ID:QoBVzNSJ
>ファイルのサイズが大きすぎると
積んでるメモリぐらいでかいファイルなのかな?
どういった読み込みで失敗してるんだろう?
0254デフォルトの名無しさん
垢版 |
2019/09/09(月) 10:54:14.51ID:MF4WMKe5
> ヒープの領域を使い果たしました的なエラー

これからまず連想したのは、VCで巨大ファイルをリソース化しようとしたときに出るコンパイルエラーだな
どのタイミングで出たエラーか書いてないからわからんけど
0255デフォルトの名無しさん
垢版 |
2019/09/09(月) 11:17:30.78ID:QoBVzNSJ
実行ファイル中にリソースとして埋め込み
リソースからバイナリ列を引き出して(読み出して)
再生コードに渡す

音声を実行ファイルに埋め込みたかったのかな?
0256249
垢版 |
2019/09/09(月) 13:17:02.59ID:4LFzbPos
もう少し詳しく書くと、とあるプラグインを作りたくて、それ用のプロジェクトファイルのジェネレーターとVisual studio 2019 を使っています。

そのジェネレーターを通してwavファイルをバイナリデータ化しているのですが、wavファイルのサイズが一定以上になると「error C1060 ヒープの領域を使い果たしました」っていうエラーが出てビルドが通らない状態です。

10MBぐらいのwavファイルだと普通に通って、18MBぐらいになるとエラーが出ます。
0257デフォルトの名無しさん
垢版 |
2019/09/09(月) 13:19:41.05ID:By40c52C
ソース貼れ
0259デフォルトの名無しさん
垢版 |
2019/09/09(月) 13:27:52.11ID:FLVXg6p/
タレこめ
0260デフォルトの名無しさん
垢版 |
2019/09/09(月) 14:06:32.05ID:QoBVzNSJ
プラグイン本体にバイナリデータ埋めまず、エンドユーザーにはプラグインと音声ファイルを配布
音声ファイルのパスだけうまく帳尻あわせてファイル開いて、メモリ確保して、ファイル読んで、etc
って設計するかな
0263デフォルトの名無しさん
垢版 |
2019/09/12(木) 12:49:41.16ID:J5GPib5U
スレチのような気もするんですが,ここが一番適切な回答がありそうなんで,質問させて下さい.
iPadでc++のコード(複数のファイルでつくられている)を読みたいんですが便利なビューワーありますか?
関数名やクラス名クリックしたら定義してるところまでジャンプしてくれるようなやつを探してます.
emacsで言うetagsみたいな機能のことです.
0265263
垢版 |
2019/09/12(木) 13:56:43.03ID:Ng4JTS7f
>>264
後出しですいません.キーボードは使わないのでemacsはないです.あと,iPadのemacsはけっこうがっかりだった記憶が….
タッチでジャンプできると嬉しいのですが….
便利そうなエディタは何個かあるみたいなんですが,ジャンプ機能がないんですよね.
0266225
垢版 |
2019/09/17(火) 22:40:09.17ID:iQJ8U52u
以前 >>225 で質問させてもらったものです。
>>230 で書いたようなプログラムを作ってるんですが、
DogやCatだけでループを回したいんですがどうしたら良いですか?
Dogだけの配列とCatだけの配列作ってから、Animalのポインタでそれらの配列を
参照すれば出来るのかなと思ってるんですが、考え方はあってますか?
0268蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/17(火) 22:52:04.49ID:vrvr50SL
>>266
ポリモーフィズムがうまくできていればAnimalのポインタの配列にDogやCatのポインタを突っ込めるはず。
0270デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:00:14.32ID:iQJ8U52u
>>268
ポインタ突っ込む方法を具体的に教えてくれませんか?
ポインタがよく分からないです…。
0271蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/17(火) 23:04:06.26ID:vrvr50SL
Animal *array[10] = {NULL};
array[0] = new Cat(2, 3);
array[0]->walk();
delete array[0];
0272デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:08:52.42ID:4Zel//hf
>>270
一旦オブジェクト指向のことは忘れてポインタを先にしっかり学んできた方が近道かもよ。ここで小さなサンプル教えてもらって真似しても近い将来嵌まって行き詰まりそう。
オブジェクト指向の勉強が目的なら他の言語で始めた方が余計なところで躓かないと思う。
0275デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:12:50.50ID:iQJ8U52u
DogやCatのインスタンスも複数あって、
Dog だけでループとかCatだけでループとかしたいんです。
animalだけでループするなら書いていただいたので良さそうなんですが。
0278デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:19:18.73ID:Ps8IF7R/
DogやCatに自身のタイプを返す機能をつけるか、typeidを使ってループをフィルタすればいい
0279蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/17(火) 23:20:21.52ID:vrvr50SL
dynamic_castでダウンキャスト失敗すればNULLが買える。一個800円。
0281デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:20:52.26ID:iQJ8U52u
初心者スレだし、解答欲しいです。
0283デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:22:25.46ID:iQJ8U52u
>>278
何言ってるか不明ですがキーワードありがとうございます。
とりあえずググります。
0286蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/17(火) 23:24:00.17ID:vrvr50SL
dynamic_cast<Cat>(array[0]) == NULLだったらarray[0]はネコではない
0287デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:24:31.61ID:f5N3Fp86
          || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
          ||. =ねらー三原則=  ||
          || 1.助けない      ||
          || 2.教えない 。    ∧_∧  いいですね。
          || 3.関わらない\ (゚Д゚,,)
          ||________⊂⊂ |
  ∧ ∧    ∧ ∧    ∧ ∧    | ̄ ̄ ̄ ̄|
  (  ∧ ∧ (   ∧ ∧ (  ∧ ∧ |      |
〜(_(  ∧ ∧ __(  ∧ ∧__(   ∧ ∧ ̄ ̄ ̄
  〜(_(  ∧ ∧_(  ∧ ∧_(   ∧ ∧  は〜い、先生。
    〜(_(   ,,)〜(_(   ,,)〜(_(   ,,)
      〜(___ノ  〜(___ノ   〜(___ノ
0288蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/17(火) 23:24:40.10ID:vrvr50SL
dynamic_cast<Cat*>(array[0]) == NULLだったらarray[0]はネコではない
0289デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:27:47.60ID:iQJ8U52u
>>284
理解しました。
そのif文つかうとOpenMP使うときにロードが均等に分散されないので、
dogだけの配列欲しいですね。
0290デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:41:03.11ID:4Zel//hf
>>289
それなら条件に該当するエントリのポインタを抜き出した配列を作ってループすればいいんじゃないか?
ループ内の処理が並列化する価値があるくらいコストかかるなら、ポインタを抽出してコピーするコストは無視できるかと思われる。
0291デフォルトの名無しさん
垢版 |
2019/09/18(水) 00:08:00.90ID:yNiXaOMn
>>290
ありがとうございます。
それやってみます。
0292デフォルトの名無しさん
垢版 |
2019/09/18(水) 12:06:57.92ID:L8SHYgAR
>>266
C#スレでマルチしてないかお前
0293デフォルトの名無しさん
垢版 |
2019/09/18(水) 20:26:23.65ID:yNiXaOMn
>>292
してないやでー
0294デフォルトの名無しさん
垢版 |
2019/09/22(日) 11:43:54.30ID:LQCFANDg
> Animal *array[10] = {NULL};

20年以上前に配列要素を一つ以上書かないといけない処理系があったな
タイムスリップでもしてきたか
0295デフォルトの名無しさん
垢版 |
2019/09/22(日) 11:53:00.80ID:y42gsAly
Animal *array[10] = {p0, p1, p2};
だとすると
array[0] 〜 array[2] は p0〜p2 になるが
array[3] 以降は全部 NULL で FA?
0297デフォルトの名無しさん
垢版 |
2019/09/22(日) 16:45:05.27ID:zrmuC8G0
char *array[10] = {p0, p1, p2};
だとすると
array[0] 〜 array[2] は p0〜p2 になるが
array[3] 以降は全部 NULL で FA?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況