[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/22 21:10 / Filesize : 275 KB / Number-of Response : 1017
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part158



1 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 18:49:18.44 ID:I69rZ/Of.net]
前スレ
C++相談室 part157
https://mevius.5ch.net/test/read.cgi/tech/1628474251/

331 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 22:05:57.88 ID:4aSHek6G.net]
>>326
もとはといえオメェが勘違いしたからだろこのヒトモドキが

332 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 22:09:42.92 ID:G7csYfUf.net]
>>327
再現コードをどこかに貼って。伝わらない。
>>328
煽ってるだけじゃんw だから会話にならないんだよw

333 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 22:20:49.71 ID:Yfltgwdt.net]
>>322
普通事前に弾くとかドヤ顔で言われてもそんなの200も承知の助なんだよ
ああいう不測な組み方で死にかねない爆弾抱えるデメリットに比べたら
unsignedなことによるメリットなんて実質ほぼないカスみたいなもんだからsizeがunsignedなのは設計ミスではって話

334 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 22:23:19.44 ID:caXqow3a.net]
申し訳ございません( ✌︎'ω')✌︎
遅れましたがこれです。
プッシュバックでエラーががが

struct Toge{
int a=0;
};
struct hoge {
std::unique_ptr<toge> toge1;
};

int main ()
{
std::vector<hoge> vHoge;
hoge hoge001;
vHoge.push_back(hoge001);
}

335 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 22:24:50.14 ID:caXqow3a.net]
大文字になってしまった……
struct Toge >>> struct toge
と思っていただければ……

336 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 22:34:31.10 ID:iN+TjAqi.net]
vHoge.push_back(std::move(hoge001));

337 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 22:36:13.76 ID:AEk60g9j.net]
vectorに突っ込んだらもうhoge001は使わないんだったらvHoge.push_back(std::move(hoge001));

コピーさせたいならhogeにこんなコピコンとコピop=を定義しとけばいい
hoge(const hoge& other) : toge1(new toge(*other.toge1)){}
基本はmoveだけど時々コピーもしたいくらいなら特殊関数じゃなくてclone()みたいな関数にしておく
どれがいいかは本当の用途と目的で選んで

338 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 22:37:31.61 ID:G7csYfUf.net]
>>332
コンパイルエラーを直してください
https://ideone.com/RxQYii

>>330
承知してるなら弾け
今回の用件はsize_type使えばいいだけなのでunsignedかどうかは関係ない

339 名前:はちみつ餃子 mailto:sage [2021/12/10(金) 22:52:51.98 ID:ogq0Brkp.net]
>>327
> hogeのコピーコンストラクタにmemcpyを使う等の解

これについてはダメ。
設計上の話ではなく言語仕様での保証がない。
そんなのがまかり通ったらスマートポインタの意味がない。

型が trivially copyable の要件を満たすときだけ memcpy でのコピーが許されている。



340 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 23:02:05.91 ID:4aSHek6G.net]
>>335
オメェが直して差し上げろよ
本人それで困ってんだからよ

341 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 23:18:01.33 ID:G7csYfUf.net]
>>337
なんだか煽ってばかりですね。質問内容は明快にしないといけないので。

342 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 23:22:36.91 ID:4aSHek6G.net]
ああ言えば上裕
オメェそっくり

343 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 23:40:14.88 ID:Yfltgwdt.net]
>>335
いや関係大ありだから
ないって言い張るならsizeがunsignedなメリット挙げてみなよ、ないでしょ

344 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 23:41:07.01 ID:caXqow3a.net]
>>333
>>334
お風呂に入っており返信が遅くなりました。
なんてお礼を言ったらいいか、std::moveで解決しました。
自分の知識不足ではありますが、素早い返信に感謝でございます(〃ω〃)
生成したユニークポインタはベクターに移せれば使い捨てのでムーブで良さそうです。
std::moveについて調べてみます!

>>336
ありがとうございます。
メモコピーで解決するというページがあったのですが、正直機序がわからず不安でした(笑)
シェアードポインタかムーブで対応したいと思います。
有難うございました。

345 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 23:49:32.55 ID:aT/chChl.net]
>>308
普通は範囲forじゃないの?
性能とかで差分あったっけ。

346 名前:デフォルトの名無しさん mailto:sage [2021/12/10(金) 23:57:06.57 ID:G7csYfUf.net]
>>340
関係ないでしょw vectorの要素指定に必要な型はsize_typeだからw

347 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 00:02:57.69 ID:3H+eghbz.net]
>>343
ふ〜ん、で?
sizeがunsignedなメリット挙げれるの?挙げれないの?

348 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 00:09:02.31 ID:VVJ2blgW.net]
>>344
同じ人かなw 最初から最後まで関係ないとしか言ってないよw 関係ない話をする意味はないw

349 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 00:11:05.65 ID:3H+eghbz.net]
はい逃げたねお疲れさまー
てかまあこんな頭の固いジジイ追い詰めなくても
>>319-320あたりで結論出てるからもういいんだけどね
sizeも漏れなく頭の固いクソジジイが設計ミスしたんだろうなぁ
間違いを認められるだけコイツよりまだマシだけど



350 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 00:13:11.51 ID:3H+eghbz.net]
わいも寝るんで逃げさせてもらうわ、ほな

351 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 00:13:27.97 ID:VVJ2blgW.net]
>>346
煽るだけで根拠も出せてない無関係な話をしてるのはそっちでしょw 話が終わらなくなるなら普通はしないw
頭が硬いのは君だよw

352 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 02:16:25.58 ID:heMahnZy.net]
>>341
もう見てないだろうけど、>>331のケースだと
わざわざstd::move()で右辺値にキャストしなくても
vHoge.push_back(hoge());
で良いと思う。
hoge hoge001;とするから左辺値になってしまってstd::move()が必要になるけど、
引数で直接hoge()とすれば右辺値だからstd::move()しなくても右辺値参照のpush_backが呼ばれるはず。

353 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 03:09:07.14 ID:fJKHaMXl.net]
emplace_backっていつ使うんだっけ?

354 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 03:48:00.02 ID:heMahnZy.net]
>>350
今でしょ・・・
>>349なんてしなくても
vHoge.emplace_back();
で良い話だった。

355 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 08:31:56.16 ID:iPxJ8RPT.net]
>>349
ありがとうございます!
エンプレイスバックでも確認できました。

本当に根本がわかってなかったにでお恥ずかしい話ですが、ユニークポインタはmove出来ることは知っていても、インスタンスごとmoveするという考えに至りませんでした。
右辺値の言葉だけは知っていた状態です……
moveが引数の領域を右辺値に変換するので、インスタンスのメンバ全てが一時的に右辺地に変換され、その結果ユニークポインタの移動も許可されるという考えで良いのですかね?

皆様ありがとうございます

356 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 08:39:15.08 ID:RT/36Bm9.net]
gccのヘッダファイル見るとpush_backがemplace_backに置き換えられてた

357 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 11:16:33.01 ID:VVJ2blgW.net]
質問する方はそもそも何を知りたいのか、どうしたいのかを明確にせず
回答する方はよく分からずに回答してる感じだな(はちみつ餃子以外)

358 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 11:28:49.13 ID:XUdPn4EW.net]
本人じゃないとありえんようなクソレス

359 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 11:33:31.35 ID:VVJ2blgW.net]
俺ははちみつ餃子じゃないよ
分かってる人は全員そう思うと思う
このスレやばい



360 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 11:40:28.86 ID:2RxEeijy.net]
>>354
おまえさんの対話力が、ここの平均以下ってことだな
僅かなエスパーもできないアスペっぽいやつが
取り残されるのは仕方のないことだ

361 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 11:41:55.96 ID:2RxEeijy.net]
ここをサポセンか何かと勘違いしてね?

362 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 11:43:35.03 ID:2RxEeijy.net]
上司や客に言われたことを自分も誰かに言いたいのかな

363 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 11:53:10.78 ID:VVJ2blgW.net]
>>357-359
3連投しないで1つにまとめてね

伝わらない人がいるのでハッキリ言うと、、、
質問したい人はもう少し明確に質問してほしい
回答する人はもう少し正確な回答をしてほしい

現在このスレのレベルはかなり落ちている

364 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 12:03:14.48 ID:2RxEeijy.net]
>>360
あんたに連投がどうのと指図される筋合いはないし
質問者がどうして欲しい
回答者がどうして欲しい
と、やたら依頼心の強いやつだな

頼み事をする態度を知らんのか

365 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 12:04:22.50 ID:8GY5wY3L.net]
僕だけは特別!

366 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 12:08:44.64 ID:VVJ2blgW.net]
>>361-362
見るに堪えないだけだよ。当たり前のことを要求してるだけだし、ID変えてまで一体何が気に障るのやら・・・

367 名前:デフォルトの名無しさん [2021/12/11(土) 12:14:57.20 ID:fJKHaMXl.net]
簡単なコードが提示できないんだけどコンセプトで以下のようなエラーがでる

> C7608: アトミック制約は定数式である必要があります 。

アトミック制約ってなに?

368 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 12:19:25.86 ID:1jb/pqqq.net]
1つの内容を理由もなく複数のレスに分けて投稿する奴はもれなくバカなのでスルー推奨

369 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 12:23:49.93 ID:VVJ2blgW.net]
>>364
C++20はまだやる気ないので知らないけど、仕様は以下みたい。参考まで。
https://timsong-cpp.github.io/cppwp/n4861/temp.constr.constr#temp.constr.atomic



370 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 13:18:37.47 ID:iDGs+tOs.net]
多分atomic は、OS に割り込まれない、interrupt disable みたいな奴だろ。
割り込み禁止区間

1. 割り込み禁止
2. atomic に処理したいもの
3. 割り込み許可

371 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 13:41:40.82 ID:MUPeoDuy.net]
>>367
それはリアルモードOSでの話
最近の OS ではユーザーが OS の企みを阻止することは不可能

372 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 13:49:58.55 ID:VVJ2blgW.net]
無関係でスレ違いかつ「内容まで間違った」ことを垂れ流し続けるのはやめてくれ

373 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 15:00:10.16 ID:U6KjSVaU.net]
一般にアトミックと割り込み禁止は異なる概念、
マルチコアのアーキテクチャーなら割り込みを禁止したからといって
複数回のバスサイクルをアトミックに遂行できるとは限らない

つなみに割り込み禁止という手段でOSに割り込まれないことは実現はできるが
強力すぎるので普通はそれはしない
やったらリアルタイムOSならリアルタイム性の前提が根底から覆るし、
非リアルタイムOSでも割り込み禁止したタスクAとは本来無関係(独立に実行して良い)なタスクまで
プリエンプション停止によって止まってしまう弊害があるから

374 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 15:12:24.61 ID:U6KjSVaU.net]
リードモディファイライトぐらいなら今日日のCPUが命令を備えているのでOSにも対応するAPIがあり、
それを実行したらリード、ライト、リードの3バスサイクルがアトミックに実行される
もっと凝った処理をアトミックにしたい場合は

1. クリティカルセクション(セマフォとかでも良い)にENTER
2. atomic に処理したいもの
3. クリティカルセクション(セマフォとかでも良い)からLEAVE

となり、1と3はやはりOSにお世話いただく

375 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 15:16:22.95 ID:xxQzv6uY.net]
>>363
出た、当たり前のことを要求だとよ
自分の要求は通って当たり前と思っている真性のやつw

376 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 15:18:53.32 ID:MUPeoDuy.net]
>>371
クリティカルセクションとイベントを使って書いていたことがありましたが、スタベーションに悩まされて止めてしまいました…

377 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 15:26:46.48 ID:U6KjSVaU.net]
>>373
なんでatomicに処理するごときでイベントが出てくるのかわからん……
1で待っているタスクBが居るなら、アトミックな処理を終えたタスクAが3を実行した時点で
OSがタスクBに自動的に通知する(ていうか起こす
不必要に凝りまくった(そして間違った)排他制御をしているのではないか、

378 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 16:00:21.52 ID:9bOVK1ul.net]
セマフォでも大丈夫なん?

379 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 16:48:16.25 ID:VVJ2blgW.net]
U6KjSVaUだけまともだけど、CriticalSectionが同期機構として存在するのはWindowsだけ
アトミック制約と無関係でC++固有でもないのでスレ違いなのは同じだけど…その辺の話をするならせめて↓でしてくれ

標準C++で単にatomicな話なら
https://cpprefjp.github.io/reference.html#atomic-operations
標準C++でスレッドを対象とした話なら
https://cpprefjp.github.io/reference.html#thread-support
プロセスまで含むならboostになるけど
https://www.boost.org/doc/libs/1_78_0/doc/html/interprocess.html



380 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 17:02:39.01 ID:y3N81+jA.net]
>>376
迷惑なんでコテハンにしていただけません?

381 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 17:06:37.77 ID:VVJ2blgW.net]
何が迷惑なのか理由の説明がないが、コテハン付けたいならお前だけ勝手につけとけw

382 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 17:13:56.24 ID:VjmhXzGH.net]
template <typename T, typename Allocator = std::allocator<T>>
using vec = std::vector<T, Allocator>;

auto v = vec(0, 0);

ってgccだと動いてclangだとコンパイル通らないけどclangのバグ?

383 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 17:17:46.16 ID:9bOVK1ul.net]
勘違いしてた
セマフォでも一人に限定すれば問題ないか

384 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 17:36:33.78 ID:gcR9gZtv.n ]
[ここ壊れてます]

385 名前:et mailto: そもそもそもそも

アトミック制約って原子制約のことでしょう
排他制御のatomicとは全く無関係に

単にconstexprじゃないbool値をrequiresしてませんか?
[]
[ここ壊れてます]

386 名前:はちみつ餃子 mailto:sage [2021/12/11(土) 17:38:45.13 ID:kyD4TLbr.net]
>>379
バグというか C++20 対応が不十分なんだと思う。

@ 元々は実引数から型引数にあてはまる型を推論するのは関数テンプレート (メンバ関数テンプレートを含む) でしか出来なかった
A C++17 コンストラクタの実引数からクラスの型引数を推論できるようになった
B C++20 からエイリアステンプレートを挟んでも推論できるようになった ← これがまだ出来ない

387 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 18:22:11.20 ID:fJKHaMXl.net]
>>381
たしかにこれの最初のサンプルのdraw関数みたいな事をrequiresしてる。
https://cpprefjp.github.io/lang/cpp20/concepts.html
ただ上で言うdraw関数はconstexprなんだけどな・・・

388 名前:デフォルトの名無しさん mailto:sage [2021/12/11(土) 20:57:07.56 ID:VjmhXzGH.net]
>>382
わかりやすかったありがとう
まだmake_hogeみたいな不格好なヘルパ関数が役に立つこともあるのね

389 名前:デフォルトの名無しさん [2021/12/12(日) 02:33:53.10 ID:ECuL7aut.net]
NFTアートとNFTゲームとGameFiとブロックチェーンゲームに
提供する側・作る側として参入しよう。
(むりなら参加する側でもいい)
DAOとPlay-to-Earn(遊んで稼ぐ)が世界の未来になる



390 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 09:13:16.08 ID:2ZUu/eca.net]
C#で作成されたDLLってC++で呼び出せないんでしたっけ?

391 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 10:05:57.23 ID:Rei0r571.net]
>>386
やってみれば?何をしてみたの?

392 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 12:59:03.03 ID:kKgLRxlD.net]
>>386
c++cliのラッパdllを挟んでc#dllを呼ぶとかc#dllをcom参照可能にするとか.NET DLLExportを使うとかあるよ

393 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 13:04:02.42 ID:Rei0r571.net]
>>388
そういうのはできるかどうかを含め、どういう環境で何を対象に何をしたいのかによる。
そんなことすら書いてない人にいきなりキーワードをあげる必要はないよ。

394 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 13:10:20.08 ID:tD0M3iYv.net]
べつにキーワードくらいいいじゃん

395 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 13:17:19.51 ID:Rei0r571.net]
技術に関しては不正確な情報を垂れ流すことほどの害悪はない

396 名前:デフォルトの名無しさん [2021/12/12(日) 14:51:29.97 ID:4sEaLykb.net]
めんどくさい奴だなw

397 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 14:55:11.15 ID:0XY4m15b.net]
悪意を持って嘘をつくのはいかんが
信じていたことが後に間違っていたことに気付くことはあり
それへの虞を言い訳に何もしないやつと
自らの誤りに気付いたときに潔くないやつは生ゴミだ

398 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 15:18:45.20 ID:MG1pihlR.net]
そもそも>>391の言う不正確な情報ってなんだ?

399 名前:デフォルトの名無しさん [2021/12/12(日) 16:31:47.95 ID:4sEaLykb.net]
>>394
Linux環境ではC#のCOM相互運用できないとか、かなあ?



400 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 16:41:36.70 ID:2ZUu/eca.net]
>>387
君は役に立たんなw

>>388
ありがとう
やっぱそういう方法になるんだね

401 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 16:45:20.02 ID:Rei0r571.net]
>>394
今回の話で言えば条件によっては動かないのにさも動くかのようにミスリードする情報
相手の勘違いを指摘する機会がないことにより、結果的に回答にならない情報

402 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 17:00:15.53 ID:ooYWiIrJ.net]
>>395,397
ありとあらゆる環境で動く回答しか認めないとかアスペ全開やなw

403 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 17:05:43.60 ID:Rei0r571.net]
>>398
普通ですよ。環境はおろか困っている状況すら何も書いてないのだから。普通に釣りの気配しかありません。

404 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 17:16:30.63 ID:Rei0r571.net]
あと加えて言うならば、一般に・・・という話なのですが、
runtimeでVMを動かすような言語の場合、あまりnative側からキックするような使い方をしません
組み込みなど、そうせざるを得ない特殊な状況のときくらいですね

405 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 17:18:23.27 ID:tD0M3iYv.net]
んで根掘り葉掘り聞くだけ聞いて結局回答しないパターン、ってのはよく見るな。

406 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 17:26:07.41 ID:Rei0r571.net]
>>401
それは分かりもしないのに回答しようとしたケースですね
全条件想定しないで回答しようとするとそうなります

407 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 17:29:25.52 ID:Rei0r571.net]
もちろん聞いたことに答えがない場合も回答する機会は来ませんけどw

408 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 21:03:58.85 ID:A2l5mzZ3.net]
浮動小数点の0.0以外の真偽値って規定されてるんですか?
2.0 == trueが偽になるのにif(2.0)は真のように振舞うのでよく分からなくなりました

409 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 21:11:05.34 ID:LDYHaH+j.net]
それはtrueが1に変換されて比較してるのでは



410 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 21:13:32.32 ID:2ZUu/eca.net]
0は偽でそれ以外は真
if(5) も if(10) も 0 以外だから真
5も10も真だが 5 == 10 は当然等しくないため偽になる

411 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 21:34:12.15 ID:Rei0r571.net]
>>404
>>405が正解
暗黙変換には一定のルールがあってそれに従って変換するとそうなる

2.0 == true
-> 2.0 == 1
-> 2.0 == 1.0
-> false

if (2.0)
-> if (2.0 != 0)
-> if (true)

https://en.cppreference.com/w/cpp/language/implicit_conversion
https://en.cppreference.com/w/cpp/language/operator_comparison

412 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 21:36:42.12 ID:Rei0r571.net]
if (2.0 != 0)はあんまり正確じゃないけどねw

413 名前:デフォルトの名無しさん mailto:sage [2021/12/12(日) 21:40:50.69 ID:f1HMG1tw.net]
当然ながらbool(2.0) == trueとすれば真になるよ

414 名前:デフォルトの名無しさん mailto:sage [2021/12/13(月) 21:50:35.10 ID:GurY6adw.net]
bool(2.0) == true
2.0 == double(true)
で曖昧にならない
こういうのoperatorとctorでは作れないもんかね

415 名前:デフォルトの名無しさん mailto:sage [2021/12/13(月) 21:58:10.81 ID:anT0EydK.net]
>2.0 == double(true)

え?

416 名前:デフォルトの名無しさん mailto:sage [2021/12/13(月) 22:07:54.75 ID:XiOitZFG.net]
最近本当に質問者も回答者も酷いな・・・日本語からやばい
>>410
何が曖昧だと言っていて、こういうのってどういうのなんでしょ?
>>411
え?じゃ何も伝わらない

417 名前:デフォルトの名無しさん mailto:sage [2021/12/13(月) 22:47:49.66 ID:rx7XzRPV.net]
そういうのを求めるなら上級者の相談室でも作ってそこにいればいいじゃない
人のやり取り見て文句いうだけの人なんて居ても邪魔なだけだし

418 名前:デフォルトの名無しさん mailto:sage [2021/12/13(月) 22:54:20.23 ID:XiOitZFG.net]
そんな難しい要求してないんだけどw
一応↓なスレッドもありますよ

0からの、超初心者C++相談室
https://mevius.5ch.net/test/read.cgi/tech/1542002113/

419 名前:デフォルトの名無しさん mailto:sage [2021/12/13(月) 23:35:59.51 ID:GurY6adw.net]
何も言ってないやつとじゃ話にならん
マウント取ったつもりになってろよアホ



420 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 01:10:13.82 ID:4HDQQOQ1.net]
ID:XiOitZFG
またコイツ自分賢いと思ってる例のガイジか

421 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 01:43:40.68 ID:vFkeyZ3D.net]
天に唾するクンじゃないよね?

422 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 04:27:52.83 ID:l53ksWPX.net]
std::array<std::array<int, 2>, 2> a{1, 2, 3, 4};
だとコンパイルできて
std::array<std::array<int, 2>, 2> a{{1, 2}, {3, 4}};
だとコンパイルできないのってなんでですか?
下は内側の初期化子リストの型推論が上手くいかない気はするのですが上がOKな理由が全然分かりません

423 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 09:36:15.02 ID:jz8gmYNu.net]
arrayは設計悪いね
string_viewみたいなラッパーのほうがマシ

424 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 13:08:07.96 ID:64LuYoGR.net]
arrayはそんなに設計の余地ないし別によくね
ラッパークラスは役割が別だし比較する意味がわからん

425 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 13:45:14.16 ID:NTJkXylC.net]
>>418
こうすればいけるね
波括弧が一つ余計に必要なのがなあ

std::array<std::array<int, 2>, 2> a{{{1, 2}, {3, 4}}};

426 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 15:27:55.81 ID:W58I2MTh.net]
>>418
>>420,421 の見解が適切
構造上は以下と等価
struct S1 { struct S2 { int e[2]; } s[2]; };
なので、中括弧を丁寧に書くと↓が正しい
S1 s{{{{1,2},{{3,4}}}};
質問でエラーになったケースは、上の例でメンバsを{1,2}で初期化しようとしため、{3,4}が余ってエラーになる。

https://en.cppreference.com/w/cpp/language/aggregate_initialization

427 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 19:16:16.31 ID:l53ksWPX.net]
>>421
>>422
ありがとうございます
配列をメンバに持ってるので本来は波括弧が二重に必要になるんですね
今までは1次元でなんとなく配列と同様で動いていたので省略しているという認識がありませんでした

428 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 20:13:02.90 ID:kTLKUa7o.net]
a{{1, 2}, {3, 4}}で初期化できるようにしようぜっていう提案もあったけど
初期化ルールがますますカオスになるので却下された

429 名前:デフォルトの名無しさん [2021/12/16(木) 18:55:44.40 ID:Q3qUbeDH.net]
テンプレートで関数の引数を書く方法がわからないんですが

sort(V.begin(), V.end(), ラムダ式)

を自作するにはどうやればいいんでしょうか



430 名前:デフォルトの名無しさん mailto:sage [2021/12/16(木) 18:59:42.63 ID:oxWy3zzs.net]
まず日本語から勉強してください
「テンプレートで関数の引数を書く方法」と「sort(V.begin(), V.end(), ラムダ式)を自作」には何の関連もありません

431 名前:デフォルトの名無しさん mailto:sage [2021/12/16(木) 18:59:43.14 ID:oxWy3zzs.net]
まず日本語から勉強してください
「テンプレートで関数の引数を書く方法」と「sort(V.begin(), V.end(), ラムダ式)を自作」には何の関連もありません

432 名前:デフォルトの名無しさん [2021/12/16(木) 19:10:09.52 ID:Q3qUbeDH.net]
自己解決しました
リンク先みながらこれで出来ました



template<typename FNC>
void usort (FNC&& fuc) { cout<< fuc(2) <<endl; }

int main() {
usort( [](int x) { return x+2; } );
}

https://zenn.dev/rita0222/articles/4bb5023e48c134

433 名前:デフォルトの名無しさん mailto:sage [2021/12/16(木) 19:16:51.92 ID:oxWy3zzs.net]
質問と回答はおろか日本語も覚束ない人の記事の宣伝はどうかと思いますよ

434 名前:デフォルトの名無しさん mailto:sage [2021/12/16(木) 19:28:45.53 ID:/OSP+i6s.net]
ごめん例のアスペじゃないけど俺もこの質問は日本語がひどいと思う

「テンプレートを使って、関数を引数とする関数を書く方法がわからない」でいいんだよね?
「で」も「の」も意味が複数ある助詞だから次から気を付けような

435 名前:デフォルトの名無しさん mailto:sage [2021/12/16(木) 22:08:17.98 ID:oxWy3zzs.net]
自演乙

436 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 22:39:42.44 ID:G+T88tW/.net]
VC++の質問になってしまうかもしれませんがよろしくお願い致します。

void Func() throw (const char*);とした関数で静的に例外の型チェックをしてコンパイルエラーなり吐いてもらうことはできないのでしょうか?
try { Func(); } catch (const wchar_t* ex) {}と書いてしまった場合等にコンパイルエラーを出してもらいたいです

437 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:32:36.81 ID:JPMZsaO2.net]
>>432
合法なものにエラーとかねえわ

438 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:52:05.34 ID:FKQX+MA6.net]
例外指定はもうすぐ消えてなくなる機能だから使うのやめた方がいいよ

439 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 00:05:45.43 ID:5GaBUmyD.net]
例外指定は調べたらC++17で削除されてんだな。
例外指定は実行時のチェックで意味ないと思ってたから一度も使ったことない。



440 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 02:04:19.31 ID:yobIy+EO.net]
throwで投げる例外を指定するのはC++11以降非推奨でC++17で削除された
例外を投げ得ることを示す(空の)throwもC++11以降非推奨でC++20で削除

https://ja.cppreference.com/w/cpp/language/except_spec

結論としては無理

441 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 02: ]
[ここ壊れてます]

442 名前:10:12.31 ID:WdsmvZWK.net mailto: 意味わからんもんなthrow接尾子
投げる例外全部把握出来んのかよって
[]
[ここ壊れてます]

443 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 07:30:27.08 ID:zT9OLvmm.net]
ファイルオープンの失敗をどうやって間違えずに処理させるんだよ

444 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 07:31:31.20 ID:zT9OLvmm.net]
20年ちかくそれがいいことだっつってやってたんだぞ

445 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 07:47:02.08 ID:raeshKom.net]
void aho() throw(std::bad_exception);

446 名前:デフォルトの名無しさん [2021/12/20(月) 09:50:56.71 ID:TszysAyf.net]
ポインタ型変数のスタック消費が4バイト(32bit OS)または8バイト(64bit OS)なのはわかるんだけど、
参照型変数ってスタックを何バイト消費するの?

447 名前:はちみつ餃子 mailto:sage [2021/12/20(月) 11:34:47.56 ID:GbIoN43K.net]
>>441
GCC の資料によれば Itanium C++ ABI に従う。 (Itanium 以外でも ABI は Itanium ということらしい。)
https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.cxx_interface

で、 ABI のほうでの定義では引数・返却値における参照の実態はポインタだし、
POD のレイアウトとしても参照はポインタのように扱われる。
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#reference-parameters
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#reference-return-values
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#pod

内部的には参照はほぼポインタだと思っていいんでないの。
自動でデリファレンスするポインタって感じ。

ちなみに言語仕様的には参照はオブジェクトではなく参照先のオブジェクトの別名のように扱われるので、
sizeof に渡したときには参照先の型の大きさが返ってくることになってる。
sizeof(int&) みたいにしたら sizeof(int) と同じ意味になるってことね。

448 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 11:49:32.57 ID:LVF1I4ij.net]
確認してみた。
$ gcc -x c++ -S - -o - <<EOF | sed -n '/^main:/,$p;/\$2/q'
int main() {
int a = 1;
int& r = a;
r = 2;
return a;
}
EOF
main:
.LFB0:
.cfi_startproc
endbr64
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $32, %rsp
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
movl $1, -20(%rbp)
leaq -20(%rbp), %rax
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
movl $2, (%rax)

449 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 12:07:37.09 ID:IpG9nRdD.net]
参照先が見えてるところでは
参照先へ直にアクセスしてコストゼロだったり
参照引数をとる関数でもインライン化された場合はゼロ
てなことがなければポインタ1個分



450 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 12:13:52.79 ID:LVF1I4ij.net]
そういうのは最適化なので無関係
$ gcc -O3 -x c++ -S - -o - <<EOF | sed -n '/^main:/,$p;/ret/q'
int main() {
int a = 1;
int& r = a;
r = 2;
return a;
}
EOF
main:
.LFB0:
.cfi_startproc
endbr64
movl $2, %eax
ret

451 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 21:41:58.49 ID:c8hM8/Kk.net]
最適化する前の意味合いとして
ポインタ1個分のコストを必ず発生するという規定なんかあったか?

452 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 21:44:15.52 ID:LVF1I4ij.net]
誰もそんな話はしてないので、お前が調べて貼れ

453 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 22:11:35.36 ID:c8hM8/Kk.net]
444へのレスで最適化がどうたらぬかしといて
そんな話はしてない、かよ
アセンブラ貼ってた威勢はどこへ吹っ飛んだんだかw
いいよ、逃げたきゃ逃がしてやるよヘタレ野郎

454 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 22:16:05.29 ID:LVF1I4ij.net]
最初から処理系(gcc)の話しかしてない。規定の話をしてるのはお前だけだ。早く貼れ。逃げるな。

455 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 23:16:36.18 ID:TszysAyf.net]
unique_ptrオブジェクトとそ

456 名前:フ実体を参照する参照型を使えば、
スタック消費を抑えつつスタック変数を使っているかのようなソースコードが書けそうだけど
[]
[ここ壊れてます]

457 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 00:06:02.44 ID:Ug1txKhz.net]
それは全くレイヤーの違う話
アプリのコンテキストを構造体/クラスにしてヒープかスタティックに置くだけで実現できる
実現手段としてunique_ptrを使いたいなら使えばいいというだけ

458 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 00:10:51.14 ID:QziEyx5H.net]
>>451
ひょっとして ID:c8hM8/Kk かな?
無意味な煽り書き込みやめてくれ

459 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 00:20:05.56 ID:Ug1txKhz.net]
煽りではないんだが、俺はID:LVF1I4ij



460 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 00:33:36.24 ID:QziEyx5H.net]
>>453
レイヤーが違うとか、勝手に仕切るな

461 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 00:42:51.31 ID:QziEyx5H.net]
構造体/クラスをヒープに置いたところで、その構造体/クラスのメンバー関数でスタック変数を使ってたら意味がないだろ
何が問題提起されているのか理解してから書き込んでくれ

462 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 01:02:00.74 ID:Ug1txKhz.net]
スタック消費を抑えたいなら静的に確保するかヒープを使えばいいというだけの話でしょ。
struct app_context {int x;};
void func_old() {
int x = 0;
}
void func_new(app_context* ctx) {
ctx->x = 0;
}
int main() {
auto ctx = new app_context();
func_old();
func_new(ctx);
delete ctx;
return 0;
}
各関数/メソッド単位で細かくしたいなら、try〜catchでやってもいいし、スマートポインタを実装・流用してもいい。その際にunique_ptrを使いたいなら使えばいいというだけ。
伝わらないようなので少し細かく書いた。伝わるんだろうか・・・。

463 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 01:16:14.39 ID:QziEyx5H.net]
>>456
君は回答者に向いてない

464 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 01:18:02.55 ID:QziEyx5H.net]
アムロの父親みたいな変な書き込み、リアルに遭遇するとやはり引く

465 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 01:18:43.76 ID:Ug1txKhz.net]
>>457
質問したいレイヤと解決策のレイヤが合ってないだけw

466 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 01:27:03.87 ID:QziEyx5H.net]
自覚なさそうなところがますますテム・レイ感あるわ
お大事に

467 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 01:46:16.28 ID:Ug1txKhz.net]
質問して複数人に回答してもらってるのに、ただ煽るだけの人に「自覚」とやらを問われてもねw
大好きなガンダムのたとえに勝手に満足して病んでてくれ
君にプログラミングは向いてない

468 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 01:50:07.69 ID:QziEyx5H.net]
今時特別な理由もなくnew演算子を使うC++プログラマは間違いなく無能だよ

469 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 01:53:35.52 ID:Ug1txKhz.net]
理由はC++標準ライブラリを使用しない言語/処理系レベルの話をしていたから



470 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 02:05:33.42 ID:QziEyx5H.net]
ガンダムの記憶回路にとりつけるやつ好きなだけ作ってていいぞ

471 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 02:17:40.01 ID:Ug1txKhz.net]
妄想の中でもニュータイプじゃない君にプログラミングは無理w
ガンダムに辿り着けずコロニー内で果てる

472 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 14:30:10.99 ID:bvwR7M/G.net]
テンプレートを引数に取る関数で、
その入力として、vectorと配列を取るような関数で、いい書き方ってないですかね?
// vector向け
template<class T>int sum(const T& v, int size)
{
int acc = 0;
for(int i = 0 ; i < size ; i++){acc+=v[i];}
return acc;
}
内容同じなのに配列向けに
template<class T>int sum(const T* v, int size)
を作ってるけど一緒に表記できないかな、みたいな

473 名前:はちみつ餃子 mailto:sage [2021/12/21(火) 15:12:48.55 ID:f1yxmqA1.net]
>>466
???
その定義で配列も受け取れるけど。
int main(void) {
int x[] = {1, 2, 3};
std::cout << sum(x, 3) << std::endl;
}

474 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 15:20:59.50 ID:Ug1txKhz.net]
vectorならiteratorにしてもいいと思う
#include <vector>
#include <iostream>
using namespace std;
template<class T>int sum(const T begin, const T end) {
int acc = 0;
for(T i = begin; i != end; ++i){acc+=*i;}
return acc;
}
int main() {
int a[] = {1,2,3};
const size_t s = sizeof(a)/sizeof(a[0]);
vector<int> v(a, a + s);
cout << sum(a, a + s - 1) << endl;
cout << sum(v.begin(), v.begin() + (v.size() - 1)) << endl;
return 0;
}

475 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 15:35:03.48 ID:bvwR7M/G.net]
ありがとうございます
>>467 頭のどこかでポインタにしないと取れないと思っていました

>>468
iteratorは馴染みがないのでそのコードで勉強させていただきます

476 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 15:39:21.19 ID:sStr75A4.net]
>>462
ただのサンプルコードに今時とか無能とか・・
中で何が起きるか把握してない無能を量産しようとしないでくれ

477 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 15:47:15.24 ID:msz2/cZB.net]
本来はrangeの出番なんだがな
導入が遅れたばかりに……

478 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 16:45:50.91 ID:fi3Z01x+.net]
#include <iostream>
#include <vector>
#include <array>
#include <string>
using namespace std;
template<typename Iter>
auto sum(Iter a, Iter b) {
using value_type = remove_const_t<remove_reference_t<decltype(*a)>>;
value_type acc {};
while (a != b) acc += *a++;
return acc;
}
int main() {
const int a[] { 1, 2, 3 };
vector<int> v { 4, 5, 6 };
array<double, 3> d { 3.5, 1.2, 0.9 };
const string s[] { "u", "n" "k", "o" };
cout << sum(begin(a), end(a)) << endl;
cout << sum(begin(v), end(v)) << endl;
cout << sum(begin(d), end(d)) << endl;
cout << sum(begin(s), end(s)) << endl;
return 0;
}

479 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 16:51:06.96 ID:msz2/cZB.net]
std::iterator_traits使おうよ



480 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 16:56:11.01 ID:fi3Z01x+.net]
#include <iostream>
#include <vector>
#include <array>
#include <string>
#include <iterator>
using namespace std;
template<typename Iter>
auto sum(Iter a, Iter b) {
using value_type = typename iterator_traits<Iter>::value_type;
value_type acc {};
while (a != b) acc += *a++;
return acc;
}
int main() {
const int a[] { 1, 2, 3 };
vector<int> v { 4, 5, 6 };
array<double, 3> d { 3.5, 1.2, 0.9 };
const string s[] { "u", "n" "k", "o" };
cout << sum(begin(a), end(a)) << endl;
cout << sum(begin(v), end(v)) << endl;
cout << sum(begin(d), end(d)) << endl;
cout << sum(begin(s), end(s)) << endl;
return 0;
}

481 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 17:32:40.16 ID:Ug1txKhz.net]
sumがunkoは独創的だと思うけど、戻り値の型はテンプレート引数でいいかもね

482 名前:sage [2021/12/21(火) 18:15:52.03 ID:qDHWQ1/Y.net]
↓こんなコード書いてるんですが,もっとエレガントに代入できませんか?
a[0]=*ptr;
a[1]=*(ptr+1);
a[2]=*(ptr+2);

483 名前:蟻人間 mailto:sage [2021/12/21(火) 18:28:20.41 ID:NT9maPPc.net]
ptr[1]

484 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 19:09:14.75 ID:qDHWQ1/Y.net]
>>477
エレガントな回答ありがとうございます.
解決しました.

485 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 20:23:30.29 ID:iHW7b2cO.net]
std::copy(ptr, ptr + 3, a);
僕はfor文のほうが好きです

486 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 20:25:38.21 ID:UPYLxpzi.net]
C++98以前の化石

487 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 21:03:47.64 ID:msz2/cZB.net]
std::copy_nもあるぞ

488 名前:デフォルトの名無しさん mailto:sage [2021/12/22(水) 18:49:46.59 ID:ycAkB2VB.net]
>>479
>>481
こんなんもあるんですね.使わせてもらいます.ありがとうございました.
最近c++やり始めたんですが,ポインタが出てくるとギョッとします.

489 名前:デフォルトの名無しさん mailto:sage [2021/12/22(水) 19:44:38.16 ID:VkqlmauA.net]
何に使いたいのか知らないけど、C++やめてRustの方がいいんじゃないの?



490 名前:デフォルトの名無しさん [2021/12/22(水) 20:00:31.77 ID:j6Uulo2p.net]
高速grepツールとして有名なripgrepはRustで作られてるからRustは優れた言語なのだろう、ぐらいなことは察せられるが

491 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 08:08:59.49 ID:zbE03cOE.net]
>>483
rustなんてプログラム初級者に勧めるなよ。
あんなの習熟した上級者向けの言語だわ。c++以上に初級者向け解説が無いのは致命的。

あと、Rustはスレ違いだからな。このコメにもレスするなよ。

492 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 09:13:28.05 ID:cFIeneRn.net]
>>485
C++の方が難しいよ
ポインタでギョッとするレベル=Cに抵抗があるなら、わざわざC++を使うよりはRustでいい
5chはコメとは言わない
お前がレスしなければ良かっただけ

493 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 09:43:11.86 ID:TuHGjVDJ.net]
Rust は良いアプローチだがどうしても記述量が多くなるから敬遠してる

494 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 11:51:22.33 ID:Gjq2t2pD.net]
>>486
ポインタは名札のメタファーを使った説明が確立しているけど、所有権、譲渡、借用、ライフタイムの初心者向け説明はクソみたいのしか無いだろ。そんなもん初級者に紹介するなよ。

スレ違いでわざわざ役立たずを紹介するやつは何を考えているんだろうかね?

495 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:29:11.30 ID:cFIeneRn.net]
>>488
はいはい、ID変えてご苦労さま
同じことだけど、生アドレス使うの得意でない言語の方が向いてるだろってだけ
C++は少なくともCをまともに使えるようになってから習得すべき

496 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:33:21.82 ID:lsirm1I0.net]
.hや.cpp以外からいじられたくない変数に対するインライン関数をパブリックに公開したいのですが、classを利用する以外にこのような事はできないのでしょうか?
staticや無名名前空間を利用するとcppファイルで利用できなくなりますしやはりclassを使えということでしょうか?

extern int value; //これは隠蔽したい
inline bool IsZero() { return value == 0; } //これはグローバルに利用してもらいたい

497 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:43:43.47 ID:N07J633j.net]
namespace {
extern int value; //これは隠蔽したい
}
inline bool IsZero() { return value == 0; } //これはグローバルに利用してもらいたい

498 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:44:08.09 ID:IRDqWaPI.net]
>>489
ならc紹介しろよ。
スレ違いのクソを紹介するな。

499 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:44:27.15 ID:N07J633j.net]
もとい
namespace {
int value; //これは隠蔽したい
}
inline bool IsZero() { return value == 0; } //これはグローバルに利用してもらいたい



500 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:47:57.55 ID:IRDqWaPI.net]
>>493
関数内にstatic変数持てなかったっけ?

501 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:52:37.53 ID:IRDqWaPI.net]
>>494
連投失礼。
自身の関数内にあるstatic変数の参照を返す関数を用意するパターン無かったっけ?

502 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:58:20.57 ID:cFIeneRn.net]
>>492
ポインタに抵抗ある人にCを勧めるくらいならC++に近くて安全なRustを勧めるのが筋
見当違いな話をしてるだけだよ君は

503 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 12:59:07.12 ID:6GqfEn2+.net]
valueの立ち位置が気になるが
extern(実行ファイル内で全部共通)するならinline関数のIsZeroが見えた時点でvalueも見えてないといけない

504 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 13:03:49.15 ID:cFIeneRn.net]
class hoge {
static int value;
public:
static bool IsZero() { return value == 0; }
};
inline bool IsZero() { hoge::IsZero(); }
int main() {
return IsZero();
}

505 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 13:07:02.43 ID:lsirm1I0.net]
>>493
ありがとうございます
ヘッダにそれを書いたとしてcppファイルからvalueを扱えるのでしょうか?

>>497
JavaやC#で言うところのprivate static intとして該当ヘッダ内&cppファイル内からは自由に扱え、それ以外からは見えなくさせたいという値です

506 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 13:20:56.47 ID:cFIeneRn.net]
JavaやC#でもそんなところに可視性の定義はない。

507 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 17:32:16.18 ID:SEEFcByD.net]
>>496
相手がなんでc++を使っているのかのニーズすら確認しないで何を独りよがりなことを言っているんだよ。
相手の目的を無視してスレ違いのツールを薦めるのはアホのやること。
Rustの伝道師はこんな低レベルなのかね。

508 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 17:36:54.99 ID:N07J633j.net]
あーうるせえ
C++スレでRust Rust連呼すんな
寒すぎんだよ

509 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 18:02:45.75 ID:cFIeneRn.net]
>>501
別に俺はRustの伝道師ではないが、>>483で一言Rustを勧めたらIDをコロコロ変えながら文句を言ってくる人がいるだけ
ポインタが不得意でRustも使えない質問者ご本人様だと思ってる



510 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 19:12:55.62 ID:AUfS9hAV.net]
>>493
試してないけどこんなのはどうかね。

#include <iostream>
#include <cstdlib>

class Accesser;

class Wall {
static int & val(){ static int v; return v; };
friend Accesser;
};

class Accesser {
public:
Accesser(){
int &v=Wall::val();
v=1;
}
~Accesser(){
std::cout << Wall::val()<< std::endl;
}
};


int main()
{
Accesser a;
std::cout << "Hello, Wandbox!" << std::endl;
}

511 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 19:32:24.95 ID:3yOXD4ws.net]
inlineで書きたいらしいので、それだとコンパイル単位で値が変わっちゃうのでは?

512 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 19:55:38.05 ID:CLdJLYY1.net]
>>505
インラインはどのみち無理じゃない?
関数内static変数は共通になる保証があったと思う。どこだか忘れたけど。

513 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 20:02:52.87 ID:cFIeneRn.net]
クラス内に実装を書くなどヘッダにあればどの道インラインだと思う

514 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 20:05:51.29 ID:cFIeneRn.net]
staticは静的に確保されるので、インライン展開されても同じシンボルを参照する

515 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 20:30:35.89 ID:cFIeneRn.net]
ちゃんと書いておくと、>>490にもともとクラスを使わない指定があるので、どうかね?
という意味では前提を満たしてないと思う
クラスを使う最も素朴な例は>>498に書いておいた

516 名前:デフォルトの名無しさん [2021/12/23(木) 21:54:27.28 ID:4lOSoN0i.net]
メモリ確保用途でvectorやstringつかい
ポインタアクセスすれば、new で確保するのと速度に大差ないとおもうんですが
実測すると10%〜くらいSTLつかうほうが速度低下するみたいなんですが
直メモリアクセスでも落ちるのはなぜなんでしょうか

517 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 22:14:02.53 ID:6YhOrdG1.net]
その計測コード貼ってみ
多分メモリアクセスとは関係ない所で時間食ってる

518 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 22:16:19.47 ID:lsirm1I0.net]
>>509
ありがとうございます
やはりクラスを利用しないと実現無理そうなので、498のようなC#で言うところのstatic class的な形でやることにします

519 名前:510 [2021/12/23(木) 22:21:06.77 ID:4lOSoN0i.net]
これです・・・


https://ideone.com/NKSCRi


vector : 974.971 ms
new char : 921.191 ms
new int32 : 899.579 ms



520 名前:デフォルトの名無しさん [2021/12/23(木) 22:38:03.27 ID:MjSWMWRR.net]
1秒もかかる?

521 名前:510 [2021/12/23(木) 22:49:58.53 ID:4lOSoN0i.net]
こっちだと大差がついてるんですが
家のPCでもideone.comよりも差が付きます vector確保のほうが遅い


https://paiza.io/projects/9wWo36-bjTCL_S0WcGbaWA

vector : 459.154 ms
new char : 184.758 ms
new int32 : 167.899 ms

522 名前:510 [2021/12/23(木) 22:55:16.12 ID:4lOSoN0i.net]
自己解決しました
メモリ確保と解放部分を含めて計測してたのを
コピー部分のみの測定にしたらほぼ一緒になりました


https://paiza.io/projects/ge5iOWrzGu2E2PjogsRlUw

vector : 219.947 ms
new char : 204.565 ms
new int32 : 214.644 ms

523 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 22:55:24.77 ID:6YhOrdG1.net]
ほとんどメルセンヌツイスタの実行時間じゃね

524 名前:デフォルトの名無しさん [2021/12/23(木) 22:56:40.08 ID:MjSWMWRR.net]
確保にかかってると思う?
一秒はさすがにないと思う。
何かおかしいな。

525 名前:デフォルトの名無しさん [2021/12/23(木) 22:58:15.18 ID:MjSWMWRR.net]
vector云々以前に、newバージョンも遅すぎると思う。
話にならないくらい。
i8008とかじゃないよね?

526 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 23:00:56.66 ID:6GqfEn2+.net]
C++/CLIでstd::mutex使えないのなんでなん?

頑張ってWin32APIで代用する気力はあるけどわざわざ無効化されてる理由が知りたい

527 名前:510 [2021/12/23(木) 23:05:52.89 ID:4lOSoN0i.net]
メモリ確保・解放と、メルセンヌツイスタを外して計測したら
今度はvectorのほうが圧倒的に早

528 名前:「んですが

https://ideone.com/rKv4qv

vector : 237.55 ms
new int32 : 713.82 ms
[]
[ここ壊れてます]

529 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 23:26:56.25 ID:4lOSoN0i.net]
計測時間は、ある程度の長さで、オンライン実行環境のタイムアウトにならないように
ループ回数を変更してるので



530 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 23:54:08.59 ID:58w1xOUi.net]
生ポインタにしたら同じ感じにならない?
unique_ptr<int32_t[]> p(new int32_t[2*size]);
int32_t* A = p.get();
mmcpy(A, size);

531 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 01:54:49.07 ID:T9e6TA98.net]
手動でループ回数変更とか馬鹿らしいからquick-bench.comとか使うのオススメ

532 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:00:08.27 ID:opQHMY4K.net]
overrunがある
std::make_uniqueを使え

533 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:04:03.38 ID:opQHMY4K.net]
https://ideone.com/JupGoY

534 名前:デフォルトの名無しさん [2021/12/24(金) 09:05:00.82 ID:6d0f054m.net]
サンプルコードだからと安易にnew演算子使う風潮やめたほうがいい
コールバックや別スレッドに渡すインスタンスの生成にのみnew演算子を使うべき

535 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:08:39.52 ID:opQHMY4K.net]
そういうことではなくunique_ptrを理解してから使えというだけ

536 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:09:02.65 ID:6d0f054m.net]
バッドノウハウがいつまでたってもなくならない原因は入門者向けのサンプルコード

537 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:09:36.51 ID:opQHMY4K.net]
そもそもサンプルコードの質が悪すぎる

538 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:10:57.45 ID:opQHMY4K.net]
今回のね(>>526)

539 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:11:48.94 ID:6d0f054m.net]
>>528
むしろ「理解してなくても使え」だよ
ナマポだってそうだ
サティアンとか金目とかじゃなくてな
実際に使って痛い目にあわないと



540 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:12:11.50 ID:opQHMY4K.net]
>>462は壮大な勘違い

541 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:13:48.09 ID:opQHMY4K.net]
>>532
何でもそうだが、理解しないで使うからこういう問題が跡を絶たない
「理解してなくても使え」が何よりも悪い

542 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:21:12.05 ID:6d0f054m.net]
>>534
それは違う
使わなければ理解できないよ
自身が初心者だった頃を思い出せないくらい耄碌したの?
お大事に

543 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:22:45.08 ID:opQHMY4K.net]
>>535
俺は初心者の頃から理解できていないものを何となく使うとかはしていない
それが何よりも悪いことを教わってきてるから

544 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:25:48.61 ID:ZnDQBfvC.net]
練習と本番を一緒くたにしてるな
まさに現場の癌だったと自白してるようなものだ

545 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:28:20.47 ID:opQHMY4K.net]
まさにお前がな

546 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:30:24.34 ID:opQHMY4K.net]
コロコロID変わる質問者兼劣悪回答者の荒らしで、そもそも勤務経験なさそう、と思ってるよ

547 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:31:16.13 ID:6d0f054m.net]
>>536
現役離れてずいぶん経つの?
実務やってれば仕様書の文章があいまいで実際に動かさないと理解できないってことがいくらでもあるでしょ
「仕様書はない、ソースのみ(キリッ」という状況なんて普通なはずだが

548 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:32:13.38 ID:6d0f054m.net]
教わるとか受け身かよ、アホかと
学ぶんだろ

549 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:35:00.51 ID:6d0f054m.net]
上司が「お前は触るな」と言いたいのをオブラートに包んで「理解してから触れ」と言われたクチだろう
できないPGだった証拠



550 名前:デフォルトの名無しさん [2021/12/24(金) 09:36:56.46 ID:6d0f054m.net]
「理解してから使え」なんて、危なっかしい無能な人を開発現場から穏便に排除する時に使う言葉だよ

551 名前:デフォルトの名無しさん [2021/12/24(金) 09:42:48.15 ID:6d0f054m.net]
肩叩きされていたことに気づけないくらいに読解力が低い

552 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 09:48:44.26 ID:ZnDQBfvC.net]
「理解してから使え」
「はい、理解してきます」
「理解しました!今度こそ大丈夫です」←わかった気になってるが自分が何を分かっていないのかがわからない

553 名前:デフォルトの名無しさん [2021/12/24(金) 09:54:19.02 ID:6d0f054m.net]
普通は他人に迷惑かけることなく作業しろ、って言えば良いいんだけど、
察するに上司はそれまでの積み重ねで追放する気満々だったんじゃないかな

554 名前:デフォルトの名無しさん [2021/12/24(金) 10:05:26.45 ID:6d0f054m.net]
unique_ptrやshared_ptrは初心者でもコンパイラのエラーや警告に従うだけで安全にコードを書けるようになるからおススメだと思うよ
もちろん頓珍漢な警告メッセージを出力する不親切なコンパイラだとそうはいかないが

555 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 12:58:00.18 ID:a16a8gMY.net]
下らない煽りを何回にも分けて書くな無能

556 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 15:17:39.58 ID:miWR5HNI.net]
コールバックや別スレッドに渡すインスタンスの生成であっても
new演算子を使わねばならない必然性は無いので

ていうかnewしたブツを渡した先でdeteteさせる設計のは
newしたコードとdeleteするコードが同じCRTでないと危険なので
異なるプロジェクトの間でやるのは一般にアンチパターンなので
 1. そもそも渡さない(利用するスレッドに生成させる
 2. (どうしても渡したい場合は)コピーして渡す
 3. オブジェクトの所有権を渡す側のスレッドが握って生存期間が利用期間を包含することを保証する
のどれかなので

557 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 15:18:01.17 ID:miWR5HNI.net]
少なくともウィンドーズのDLLはDllMain()を有する1本のプログラム同然なので
Ver.0.1のCRTをスタティックリンクしたDLLというものが作れてしまうので
Ver.0.2のCRTとリンクされるコードで生成したオブジェクトのポインタを渡せてしまうので

558 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 15:49:34.78 ID:/YMztZoD.net]
のでので言ってるだけで結論がない
頭悪そう

559 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 21:39:56.11 ID:0AIK3bm0.net]
ActiveX系使ったことないんだろうなって容易に推測でける



560 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 23:47:20.34 ID:miWR5HNI.net]
しらそん
COMオブジェクトの中で異なるバージョンのCRTの混在が起きたら
同じことなんじゃないの

561 名前:デフォルトの名無しさん [2021/12/26(日) 01:42:46.74 ID:Fmrpdwj0.net]
アウトプロセス

562 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 02:08:50.44 ID:rFpP4pcL.net]
しらそん
アウトプロセスサーバが生成する
COMオブジェクトの中で異なるバージョンのCRTの混在が起きたら
同じことなんじゃないの
なので

563 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 02:10:54.75 ID:P9feSsDc.net]
自演って見苦しいな

564 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 05:25:00.76 ID:0FjCQ3kx.net]
>>549
そういうのをスマポでやれって話?
ヘッダで提供されるライブラリだからスマポもダメだと思うんだけど

565 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 05:43:12.94 ID:a8PAglQ+.net]
>>552
急にCOM持ち出すのはおかしいだろ

>>553
ふつーCoTaskMemAllocじゃねえかな

566 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 07:28:31.98 ID:z66Mwoku.net]
sin関数に入れる時間変数の値が大きくなるにつれ誤差が増えていって困ってます
fmod関数を使ってもあまり効果が見られませんでした
処理時間をそれほどかけずに解決出来る良い案何かありますか?

sin関数に入れる値の目安は100万くらいです

567 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 09:18:24.17 ID:6eMF2SNy.net]
100万をsin()しても、sin()は2π周期
doubleの精度15桁中の5桁以上を無駄にしている

sin()する用変数で毎回fmod(,2π)してもそこで誤差が貯まりそう

boost::multiprecisionとか?

568 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 09:35:40.45 ID:/woV9P1D.net]
出来るなら入れる数を作る時点で[0,2pi)に収まるように工夫する
それが無理なら多倍長浮動小数点数のライブラリ使うか自作するか

569 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 10:28:27.14 ID:a8PAglQ+.net]
>>559
sinの引数に入れる値を浮動小数点数で少しずつ足しこむような処理をしているなら、やめて別の方法を考えろ



570 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 11:32:37.05 ID:SV9DgXqP.net]
sinに時間を入れるのは次元がおかしい

っていうのは冗談で、質問者が何を問うてるのかわからん
sinにdoubleに収まるどんなデカい数を入れても精度は15桁くらい保証されるでしょ


>>560
> 100万をsin()しても、sin()は2π周期
> doubleの精度15桁中の5桁以上を無駄にしている
これもわけわかんねー
100万近いある数 x をsin()に入れるんでしょ?
x も sin(x) も上から15桁全部有効な桁でしょ
何が無駄になってるん?


>>562
こういう話ならわかる

571 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 12:03:23.64 ID:/woV9P1D.net]
sinのテイラー展開にxの大きな累乗が現れるからだよ
100万をバンバン累乗した級数で値域[-1,1]の関数計算してたら誤差まみれになるのは直感的に分かるだろ

572 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 12:47:17.91 ID:6eMF2SNy.net]
>>563
318310 * pi が100万に近い2piの倍数
https://keisan.casio.jp/calculator で、14桁で計算する

2 * pi = 6.2831853071796
sin(6.2831853071796) = 1.3523E-14

318310 * pi = 1000000.3575642
sin(1000000.3575642) = 3.291426496E-8

わかった?
桁数同じだから、でかい数は細かい所が消えるのよ

573 名前:デフォルトの名無しさん [2021/12/26(日) 15:05:31.07 ID:N3NYq5+A.net]
わかんない。

574 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 15:55:33.50 ID:SV9DgXqP.net]
>>565
現象としては確認できたが、理屈が分からない
>>564の言ってるようにテイラー展開の各項が激しくキャンセルし合って桁落ちするってこと?

575 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 16:03:55.94 ID:6s7ujcJo.net]
>>564
のテイラー展開は疑問なんだけど
関数が[0,pi/2.)への押し込みもやってくれるんじゃないの

576 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 17:28:50.32 ID:6eMF2SNy.net]
「桁数同じだから、でかい数は細かい所が消える」が理屈のつもりなんだけど…
sin(6.2831853) = -7.179586477E-9 だし、
sin(1000000.3575641670857) = -3.5E-14 だよ

577 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 17:52:52.66 ID:6eMF2SNy.net]
sin()の結果に13桁の精度が欲しいなら、入力値に小数点以下13桁の精度が要るのよ
sin()は2piの周期関数だから
1000000の所に7桁も使っちゃうのはもったいないのよ

578 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 19:17:02.92 ID:P9feSsDc.net]
まだ小学校の算数で分かる誤差の話してんの?
>>560で話終わらん奴は小学校からやり直せよ

579 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 19:41:54.46 ID:qnixUQRF.net]
桁に関する誤差とかどこの世界の小学校で習うんだよ



580 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 22:29:03.39 ID:Ep2AbKxF.net]
お前は小学校の国語からやり直せw

>> まだ「小学校の算数で分かる」誤差の話してんの?
誰も小学校で習うなんて言ってないぞ

581 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 22:43:40.78 ID:RjefXsAR.net]
log1pの存在理由も似たような話だね

582 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 23:16:02.57 ID:P9feSsDc.net]
俺小学4年生で級数展開したπの計算してたけど・・・
6年生でアセンブラと実数使ってたけど・・・

583 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 08:46:39.54 ID:B/I2o19O.net]
教える奴もよく分かってないからめちゃくちゃになってる

基本的には大きい数についても>>563の考え「x も sin(x) も上から15桁全部有効な桁」で合ってる
sin() が 0 になるケースを考えてるからややこしいんだよ
sin() が 1 になるケース、つまり pi/2 の奇数倍で 100 万に近い数を入れてみろ
そしたらちゃんと 15 桁くらい 1 になるから

0 がややこしい理由は、仮数部が何であっても良いから
例えば 1e-20 は仮数部には1桁目からゴミが入っているが、倍精度ではゼロと見なす

584 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 10:35:52.12 ID:wn+BpFxZ.net]
>>576
お前は>>560様の爪の垢を煎じて飲んでから、小学校をやり直せ

585 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 18:35:09.36 ID:osgcVgi4.net]
uniform_real_distribution の範囲を可変にしたいときってどうしたら良いでしょうか
0 から 1 までの実数を生成するようにしてそれを変数変換するべきですか

586 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 19:02:31.64 ID:DQqD3vMw.net]
っparam

587 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 20:26:27.31 ID:7ufKNB24.net]
>>576
1になるケースでほぼ1になるのは、そこでの微分が0だからだよ
入力値がちょっとずれても結果への影響が小さいのよ

588 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 20:45:16.64 ID:7ufKNB24.net]
「x も上から15桁全部有効な桁」だからこそ、
1000000の所に7桁も使っちゃうのはもったいないのよ

sin(x)=0の所は微分が1または-1、入力のずれがそのまま出力に出る所

589 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 01:04:16.62 ID:OVEU2JJm.net]
厳密な2πnと、doubleで表した有効桁数15桁の大体2πnに近い数字の差を計算すると、nが大きくなるほど差がデカくなってくるってだけの話じゃないの?
浮動小数点数は0から離れれば離れるほど目盛りが大きくなっていくのだから。
sinの実装がマクローリン級数展開でなくても起こる問題だと思うが。



590 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 01:43:08.31 ID:NIM0c1vY.net]
小学生多すぎじゃないか?

591 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 09:17:10.46 ID:p+qHklGW.net]
おまえさん1人だろ
中学以後、いつ何を習うか知らないようだが

592 名前:デフォルトの名無しさん mailto:sage [2021/12/29(水) 21:49:37.03 ID:+eZ32Uo6.net]
>1e-20 は仮数部には1桁目からゴミが入っているが、倍精度ではゼロと見なす
mjk、

IEEE754の2進数形式の倍精度浮動小数点表示は
仮数部がケチ表現の52 bit(実質53 bit)で
指数部は-1022〜+1023なのやぞ
1e-20とか1×2^(-60)かそこらなので無問題で53 bit(=15.9桁)の精度ェ、

593 名前:デフォルトの名無しさん mailto:sage [2021/12/29(水) 21:55:43.45 ID:+eZ32Uo6.net]
>sin(x)=0の所は微分が1または-1、入力のずれがそのまま出力に出る所
x << 1のとき
sin(x) ≒ x
であることの見事な工学的応用、

594 名前:デフォルトの名無しさん mailto:sage [2021/12/29(水) 21:57:34.77 ID:+eZ32Uo6.net]
まつがえた |x| << 1 やったorz

595 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 01:48:03.91 ID:L6Vpkxay.net]
よっしゃ、よっしゃ、おっちゃんがいいもん作ったろう
https://ideone.com/fjxKtS

n=0,10000, 20000, 30000, ...,1000000 (とりあえず10000刻み)として、
2分探索でsin(x)=0となるxを、2π*n付近について調べてやった

そうやって求めたxをM_PIで割った結果はきっちり2*nになるから
sin(x)がxの周期関数だからといって必ずしもxの増大につれ誤差が増えるわけではないことがワカル

sin_valの値(=sin(x))が0に対して増えたり減ったりするのはマクローリン展開の近似多項式の係数を
結果があたりさわりのない誤差範囲でうろうろするように調整してあるんだろJK、

596 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 01:51:27.40 ID:L6Vpkxay.net]
やっぱ>>562というものが>>559の誤差の真相なのではな
いか

597 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 02:32:05.49 ID:7UdZ08Kf.net]
>>588
結果見たけど、sin_valの値は、きっちり0から10000になったときに5桁精度悪化してるし、100000で6桁精度悪化してるのでは…?

598 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 07:31:31.40 ID:xtSEOuqd.net]
>>589
パッと見だけど>>565が答えじゃねえの
浮動小数点てのは文字通り小数点位置が異なる
数値が1付近と100万付近じゃ精度が異なるのは当たり前
精度を保つなら固定小数点使わないと

599 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 11:37:53.79 ID:ZhVAaRAF.net]
まだやってたのか小学生・・・ID変えてご苦労様



600 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 11:39:17.39 ID:ZhVAaRAF.net]
何度も言ってるが>>560でこの話は終了している

601 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 12:38:33.70 ID:A3EHubzP.net]
質問主が現れないからもう何議論しても無駄な気がする
ソースコードがあるわけでもないし

100万程度で誤差ヤバい言うぐらいだからfloatで計算してないか疑たくもなる

602 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 14:43:33.58 ID:Wt/MKF34.net]
誰も計算機上のゼロについて理解できてない

603 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 16:49:59.36 ID:uaiyfMI5.net]
もまいら、浮動小数点のゼロ判定どうしてる?

604 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 00:22:01.38 ID:kcosmPcn.net]
vectorでクラスへのポインタを持ってて、それを参照で受け取る関数を作るとき、クラスの変更を禁止したいんですが、どうすればいいですか?

例えば、
struct testclass{
int member;
};
というクラスがあって、
vector<testclass*>
を参照渡しで受け取る関数を作るとき、引数をconst vector<testclass*>& vecとしてもvec[0]->member =0みたいなクラスのメンバ変数の変更は関数の中で出来てしまうと思うのですが、そういうのをできないようにしたいです(testclassの変更が無いことを関数宣言で保証したいです)
何か良い方法ありますか?

vectorが1重であればtestclass const*const*を引数にすればいいとは思うのですが、vector<vector<testclass*>>のように多重vectorみたいな場合も作りたくて、そのときは関数を呼ぶ側で多重vectorから多重配列に変換するのは面倒なので、できればvectorではなく配列を使うというのはしたくないです

605 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 00:36:47.69 ID:ysmsTKqS.net]
>>597
禁止しない
もしくはメンバ変数を非publicにしてgetter/setter

606 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 05:02:18.38 ID:zF3P5q1E.net]
だから絶対値が1e-14とかより小さいかどうかだって

>>585なんかは全く理解してないようだが

607 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 05:10:34.66 ID:zF3P5q1E.net]
ちなみにsinがゼロのとこは微分が1か-1でsinが1のとこは微分がゼロだから違うってのは、事実だが今回の事象の説明としては感覚的に過ぎるね

なぜならf(x) = xなる関数は微分は1だが f(1000000.3575642) は14桁正しいw

sinの挙動について理解したいなら実装に踏み込むしかないよ
あるいは>>576あたりで思考停止しとくか

608 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 06:37:46.15 ID:qJZ2APUI.net]
>>597
アクセスを厳密に禁止したいなら、配列操作のみ定義したラッパークラスを用意して渡したほうが良い。

609 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 08:06:29.68 ID:FnYy2lty.net]
んだね



610 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 08:45:47.76 ID:FPee+d5o.net]
クラス T のメンバ関数で自身のコピーを返す(つまり返り値の型が T)ものを考える
メンバ関数の修飾が && のときは std::move(*this) とかしたいけどこれはいちいち書かないとダメ?
普通は std::forward で統一できるが

611 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 09:05:22.16 ID:FnYy2lty.net]
*thisはxvalueではないからムブコンに渡したければstd::move()か(T&&)がいるね

612 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 11:52:30.35 ID:kcosmPcn.net]
>>598
ありがとうございます
ただ、
>メンバ変数を非publicにしてgetter/setter
これだと結局setterでメンバ変数を変更できてしまいますよね?

>>601
ありがとうございます、検討してみます

613 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 14:47:55.66 ID:fEOKhR13.net]
instance.field; が暗黙のうちに書き変わらないだけでも効果あるんだよ

void f(T&t){ t.clear();}
f(instance.field);
うっかりこんなことしたらヤバいし

const T& get_field() const;
を使っとけばコンパイル時エラーにしてくれる

>>597 冒頭の質問なら、参照渡し引数に
void f(const T&);
のようにconstつけとけばいい

614 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 15:16:00.18 ID:7kXupeFa.net]
>>597
まだ標準に入ってないけど、propagate_const使うとか
https://ideone.com/O8a0hn

615 名前:デフォルトの名無しさん [2022/01/04(火) 07:21:58.04 ID:5hvio7Nh.net]
Packtpubが不安定になってるんだけど。
見れますか?

616 名前:デフォルトの名無しさん mailto:sage [2022/01/05(水) 21:49:37.99 ID:2R8vvmqQ.net]
クラステンプレートについて、明示的実体化しておけば実装を.cppでもできるというのを知ったのですが、その場合、テンプレートでない普通のクラスと同じように
部分的にヘッダに実装を書いて、残りを.cppに書く、というのは正式な書き方として許されるでしょうか?

617 名前:デフォルトの名無しさん mailto:sage [2022/01/05(水) 22:24:10.67 ID:tiBxT68+.net]
許される。

618 名前:デフォルトの名無しさん mailto:sage [2022/01/05(水) 22:48:02.56 ID:2R8vvmqQ.net]
>>610
ありがとうございます!

619 名前:デフォルトの名無しさん mailto:sage [2022/01/06(木) 15:12:35.27 ID:C9LB+2SX.net]
その昔、exportテンプレートというのがあってだな



620 名前:デフォルトの名無しさん mailto:sage [2022/01/07(金) 00:07:55.52 ID:UgPywUlD.net]
class T;

class C {
public:
T t;
};

とあったとき

C c{T()};

と集成体初期化を行うと T のコンストラクタが1回だけ呼ばれます
メンバ t をカプセル化してコンストラクタを自分で用意するとどうやっても T のムーヴコンストラクタが余計に1回呼ばれてしまうと思ったのですが回避する方法はありますか?

621 名前:デフォルトの名無しさん mailto:sage [2022/01/07(金) 02:01:17.79 ID:uUhimsKL.net]
>>613
直接的にはないけど
optionalとかvariantにあるin_placeコンストラクタと同じことをすればTのコンストラクタ呼び出しは一回で済みそう

622 名前:デフォルトの名無しさん mailto:sage [2022/01/07(金) 20:51:50.26 ID:UgPywUlD.net]
>>614
ありがとうございます!

623 名前:デフォルトの名無しさん mailto:sage [2022/01/09(日) 10:55:01.80 ID:7BGFeByJ.net]
>>597
配列の定義を vector<const testclass*> にすればよくない?

624 名前:デフォルトの名無しさん mailto:sage [2022/01/09(日) 11:30:20.08 ID:BcvcYHng.net]
外では変更するけど関数内では変更しないことを明示したいんでしょ

625 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 09:32:50.44 ID:kvnPCGqB.net]
関数の定義で
auto foo() -> void{}
みたいに書くの見かけたけどこのやり方何かメリットありますか?

626 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 12:16:01.64 ID:SK9+pElf.net]
あるね
auto s = std::string{"test"};
みたいな宣言とかも

627 名前:デフォルトの名無しさん [2022/01/12(水) 12:26:17.78 ID:Z0p/7uhd.net]
>>618は型推論効いてないやん

628 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 12:28:40.33 ID:VUzGdiiG.net]
戻り値の型を->の先に書いてあるだけだよ。
だからこれはvoid型の戻り値ね。

利点は引数からdecltype使って戻り値の型を指定できるくらいじゃない?

629 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 13:45:01.07 ID:uq5/9jO3.net]
https://www.fluentcpp.com/2018/09/28/auto-stick-changing-style/

この記事で論じられているね



630 名前:はちみつ餃子 mailto:sage [2022/01/12(水) 13:59:43.98 ID:7Sv8jpqL.net]
ラムダ式で返却値の型をどう書くかというのが後置スタイルを導入した直接の動機だと思う。

普通の関数で後置にするメリットがない場合であっても、
メリットがある場合とない場合で区別して使い分けるよりは全部を後置で一貫させたほうが綺麗だと思うこともあるだろ。

631 名前:デフォルトの名無しさん [2022/01/12(水) 17:10:39.04 ID:VRtGvzgV.net]
みずほが復旧をあきらめるとかどうみてもfukkyu

632 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 18:43:03.08 ID:NICGWYWs.net]
人がつくったものネットから持ってきて何個も組み合わせて合体させるとみずほみたいになるんだろうな
自分で作ってない部分はメンテしようがないからな

633 名前:デフォルトの名無しさん [2022/01/12(水) 19:53:35.19 ID:UH3nST5b.net]
Windows serverにしたのが最大の間違い。

634 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 20:51:55.49 ID:VUzGdiiG.net]
std::stringの大文字を全て小文字に変換するのってstd::transformより良いものあるの?

635 名前:デフォルトの名無しさん [2022/01/12(水) 22:50:55.12 ID:VRtGvzgV.net]
Windowsで文字列中の大文字を小文字に変換する_mbslwr()って今やランタイムで使えなくなってんだね、知らんかったわ

636 名前:蟻人間 mailto:sage [2022/01/12(水) 23:14:22.56 ID:htST1fFk.net]
CharLower
CharLowerBuff

637 名前:デフォルトの名無しさん mailto:sage [2022/01/13(木) 21:50:13.52 ID:bN4t5i1e.net]
c++のexe → ライブラリA(c++のdll)

c++のcリンケージのdll → ライブラリA(c++のdll)

同じライブラリの同じ関数を呼び出してるのに
呼び出し元の形態によって挙動が変わるなんてこと有り得ますか?

638 名前:デフォルトの名無しさん mailto:sage [2022/01/13(木) 22:14:06.74 ID:+PFReeTS.net]
ライブラリも呼び出し元も外部の同名のdllをリンクしているけれども
呼び出し元が参照しているdllの実体が別だったとか。

639 名前:デフォルトの名無しさん mailto:sage [2022/01/14(金) 09:16:33.28 ID:ovvIshUS.net]
struct Vector2 { float x, y; };のような64bitで済んでしまうものの計算にSSE命令を使っても高速化は見込めないのでしょうか?
上記に対して_mm_mul_psを行うと上位2float分を余計に計算させることになってしまいますよね



640 名前:デフォルトの名無しさん mailto:sage [2022/01/15(土) 05:56:06.60 ID:ps658RNN.net]
>>603
deducing thisがC++23で入るね

641 名前:デフォルトの名無しさん mailto:sage [2022/01/15(土) 16:29:52.27 ID:fx8S/FAM.net]
>>632
余計に計算させるけど一命令で済むよ
ただし速度以外のデメリット出てくるけど

642 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 12:31:04.34 ID:20f7Ghpo.net]
>>630
同じ関数というのが関数名と引数の数が同じというだけなら
extern "C" double sqrt(double x);
extern float sqrt(float x);
とから有り得る

643 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 15:18:31.08 ID:sD13NBSV.net]
pair<int, int> の first と second に、例えば座標と向きのような意味をもたせてるとします
このとき、using なんかを使って pair<int, int> x の第一要素と第二要素に x.pos、x.dir のようにアクセスする方法ってありますか?

644 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 15:34:47.07 ID:jU2WrI4n.net]
>>636
C++ ではメンバ (のように見えるもの) を後から生やすことは出来ない。

645 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 16:04:32.58 ID:+6BKuldY.net]
auto& [x, y] = obj;
x = 100;
y = 100;

動くかは試してない

646 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 16:07:55.78 ID:h5bglXe3.net]
>>636
そういうあちこちで使う用途の、はっきり意味が決まった構造体は
pairやtupleに頼らない方が(大抵の場面では)便利だよ
その一箇所でしか使わないならpairでいいと思うけど

647 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 16:18:00.13 ID:jU2WrI4n.net]
いくつかの要件を満たして "Tuple-like" であるようなクラスはタプルのように扱える仕組みがある。
タプルを多用途に使うよりは個別のクラスを作った上でタプルのインターフェイスを持たせるほうが
使いやすくなると思う。

648 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 16:55:14.33 ID:aOF99LGB.net]
>>636
まず構造体を勉強しよう

649 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 17:09:52.53 ID:bBHBfELI.net]
struct だと困るんですか?



650 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 17:35:43.45 ID:AdXHrviP.net]
みなさん御機嫌よう
このスレには何度も助けられているものです
再度お知恵を拝借したいです

任意のユーザー定義型のインスタンスhogeが、基底クラスbaseを継承しているか調べたいです。
この一例のみならtypeidで合致させればいいと思うのですが、実際は派生クラスが200くらいある予定です。
type-traitでインクルード出来るstd::is_base_ofで、RTTIを使い判定しようとしたのですが、typeidで取得できる型で合致させようとしたところ型情報が合いません……orz
どんな方法でもいいので何かいい方法がございましたらご教授いただければと思います。

class base{};
class driv:public base{};
class foo{};

//もしhogeがfoo型のインスタンスなら偽を、drivのインスタンスなら真を返したい関数
bool exHantei(){}

651 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 17:43:03.78 ID:jU2WrI4n.net]
老眼なので Hantei が Hentai に見えた。

652 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 17:49:59.30 ID:jU2WrI4n.net]
>>643
静的な型を判定するならこういうのでいけると思うが、
RTTI が出てくるってことは状況が違うのかな?

#include <iostream>
#include <type_traits>

class base{};
class driv : public base{};
class foo{};

template<class T>
bool exHantei(const T&){
return std::is_base_of<base, T>::value;
}

int main(void) {
driv hoge;
foo huga;
std::cout << exHantei(hoge) << std::endl;
std::cout << exHantei(huga) << std::endl;
}

653 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:3 ]
[ここ壊れてます]

654 名前:6:31.89 ID:PMmhhAT1.net mailto: dynamic_cast<base*>(hoge)がnullptrかどうかを見ろ []
[ここ壊れてます]

655 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:47:22.64 ID:6BYLlYWJ.net]
>>643
bool exHentai(){
return std::is_base_of_v<base, std::remove_reference_t<decltype(hoge)>>;
}

656 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:49:09.31 ID:AdXHrviP.net]
>>645
ありがとうございます。
ただ今これで動作確認はしました。

が本来は基底クラスのポインタに格納されているのです……
書き込む時に蛇足と思って省いてしまったのですが、実際は
class base{};
class driv:public base{};
class WantToFind:public driv{}
std::vector<base*> VecBasePtr;
void pusbak()
{
WantToFind f1;
VecBasePtr.push_back(&f1);
}
というようにベースポインタに押し込んで使っていて、exHantei()を使用する時にはベースとこのポインタを比較することになります。
今はちみつ餃子様のコードで動作確認をした後、自分のコード用に書き直したところ、ポインタから型を取得させる動作ができません(泣)
てっきりtypeidと同じ様に、exHantei(*VecBasePtr[0]);と*を付けてポインタの中身を外に出せば生のWantToFind型が出てくるかと思ったのですが……
思い通りの動作が出来ませんでした。
どうしてなんですかね、、、
デバッグモードで確認してもわからない
もちろんbaseに仮想関数は置いてあるので、RTTIで動作してくれるものと思っていましたが。
Templateの機序が違うのかな……?

657 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:03:17.46 ID:PMmhhAT1.net]
だからdynamic_castで調べろって
そのための機能だから

658 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:36:21.92 ID:AdXHrviP.net]
>>649
ありがとうございます!!!
確認しましたところ自分の思っている動作が得られました☆*:.。. o(≧▽≦)o .。.:*☆
こんなに簡単に出来るとは、is_base_ofの使い所さんはどうなってしまうんだ。。。

レスへの返信を書きながら、自分でもコード確認やリファレンスを検索していたため、スレの確認が遅くなってしまい、多くの型と行き違いになってまいました。
返信をくださった方々には重ね重ねお礼申し上

659 名前:げます。
まだまだ弱輩者ですが、これからも生暖かい目で返信くださると幸いです。
皆さんありがとうございます!
[]
[ここ壊れてます]



660 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 21:36:54.84 ID:jU2WrI4n.net]
>>648
動的型で継承関係を確かめるなら >>646 が述べている通り dynamic_cast で実際に変換してみるのは手っ取り早い方法だと思う。

> 生のWantToFind型が出てくるかと思ったのですが……

「生の」ってなんやねん。
その場合の *VecBasePtr[0] の静的型はあくまで base だよ。
オブジェクトの base である部分 (サブオブジェクト) が取り出される。
いわゆるスライシング。

661 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:37:50.95 ID:AdXHrviP.net]
dynamic_castは知ってたはずなのに思い出さなかったというか思いつかなかった……

662 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:46:56.12 ID:AdXHrviP.net]
>>651
ありがとうございます。

自分はスライシングもちゃんと理解してないですね……
ポインタのメモリ確保サイズが一様に8バイト(4バイト)なので、基底型が派生型の型を丸ごと格納している(派生型のポインタを確保している)と理解していました。。。(*を付けると派生型が出てくる)
悪魔でも基底型なのですね?
キャストで受けるまでは基底型として扱われるので、型情報が合致しなかったのかな。
type_infoは、全く別の型を型合致に使うから*baseが有効なのかな。

663 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:55:40.15 ID:h5bglXe3.net]
dynamic_castって仮想関数テーブル必要じゃなかったっけ?
まぁいずれにせよ仮想関数テーブルでぐぐればそこらへんの理解が進むと思う
多分

664 名前:デフォルトの名無しさん mailto:sage [2022/01/19(水) 17:29:06.73 ID:u/w202Yd.net]
スライシングとか知らない単語使わないで

665 名前:デフォルトの名無しさん mailto:sage [2022/01/19(水) 18:16:17.94 ID:oZ05fVjC.net]
用語って大事だよな
言葉遣いがおかしいの指摘されると逆ギレする
DQN気質なやつが残念ながら後を経たない

666 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 05:34:44.25 ID:tJtJ60TC.net]
https://cpplover.blogspot.com/2018/07/c20.html?m=1
汎用エイリアス宣言の提案ってどうなったんだろう

667 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 09:07:39.69 ID:PFfSIkf2.net]
#include <cctype>
//#include <string>

template <typename F>
void test(F&& f){}

int main(){
test(std::isprint);
}
これ<string>を有効にするとcouldn't deduceになるんだけど
なんで?

コンパイラはMSYS2 g++ 10.3.0

668 名前:デフォルトの名無しさん [2022/01/20(木) 09:24:47.83 ID:MuVW7weO.net]
名前衝突してんじゃないの?

669 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 09:37:40.24 ID:PFfSIkf2.net]
<locale>のテンプレートが干渉してるっぽいことはわかった
これ、俺の落ち度なの?



670 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 13:32:22.34 ID:NzUGMacM.net]
>>660
オーバーロードやデフォルト引数が追加される可能性があるから、
一般的に標準ライブラリ関数のアドレスは取れないと思ったほうがいい。
https://isocpp.org/std/standing-documents/sd-8-standard-library-compatibility

671 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 18:29:19.36 ID:PFfSIkf2.net]
ぐぶー・・・

672 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 22:37:24.73 ID:Df2OyNH0.net]
ランタイムサポートが必要なC++言語機能ってRTTIやdynamic_cast、例外くらい?

673 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 23:29:32.85 ID:a5eQ4sV9.net]
そもそもランタイムサポートの定義をちゃんとしないとな・・・

674 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 00:00:01.47 ID:/d5tBos9.net]
RTTIも例外も標準C++の一部
それが使えないような設定は厳密には規格違反だし、それで高速化や効率化しますってのは各コンパイラの独自機能に過ぎない

675 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 01:04:31.52 ID:VVQk5y8F.net]
アホすぎるw

676 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:18:18.80 ID:j/G12RQ8.net]
dynamic initializationも裏で色々やってるね

677 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:28:47.34 ID:VVQk5y8F.net]
とりあえずOSないところか、簡単な仕組みしかないところでC++で何か書いてみればいいよ
処理系が何をしてくれているのか分かる

678 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:43:11.40 ID:j/G12RQ8.net]
ベアメタルはオモロイ

679 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:59:33.55 ID:j/G12RQ8.net]
658だけど、自己解決の報告。
テンプレートにしないで
void test(int(*f)(int)){}
にしたら<locale>のisprintが干渉しなくなった
最初の発想がいかんかった



680 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 08:26:30.46 ID:VVQk5y8F.net]
isprintのテンプレート引数が決まらないからだろ
test(std::isprint<int>);
とかなら通ると思う

681 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 08:32:03.82 ID:VVQk5y8F.net]
compiler explorerのarm g++ 10.3で確認した。ヘッダはlocaleにした。
#include <locale>
template <typename F>
void test(F&& f){}
int main(){
//test(std::isprint);
test(std::isprint<int>);
}

682 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 08:47:07.93 ID:VVQk5y8F.net]
元のコードをなるべく変えずにだと
#include <string>
#include <cctype>
template <typename F>
void test(F&& f){}
int main(){
test(static_cast<int (*)(int)>(std::isprint));
}
※オーバーロードを選択させるべくキャストする

683 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 09:54:53.25 ID:j/G12RQ8.net]
conceptでテンプレートテンプレート引数を弾いたりできないかとも思ったけど
SFINAEは関数の除外なので引数の候補を絞るのは無理だった

684 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 10:28:58.52 ID:om6KWGu4.net]
class A { static inline struct SubStruct { int value; } Field1; } //通常の構造体のスタティックメンバ変数はヘッダファイル、cppファイル共に実体は同じ
class A { static inline struct { int value; } Field1; } //無名構造体のスタティックメンバ変数はヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる

この挙動は仕様なのでしょうか?

685 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 10:57:07.60 ID:OQdcFc3P.net]
名前書き忘れて0点取ったことないのか

686 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 11:38:04.16 ID:+VFNw8nk.net]
今だと仮想関数とvariantとどっち使うのが主流ですか?

687 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 11:49:22.43 ID:XNgWTOyh.net]
>>675
名前のない構造体には実体がなく外部リンケージを持たないのでそこに対するinline指定は無視されるってことでは?
分かりにくいけど仕様として矛盾してはいないと思う

688 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 13:06:33.51 ID:BllOBQpy.net]
>>675
「ヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる」という状態をどうやって観測しているの?
そんな挙動しないと思うんで、観測方法に間違いがありそう。

>>678
名前のない構造体もクラス型としては存在するし、それとは別に変数 A::Field1 は外部リンケージを持つよ。
https://timsong-cpp.github.io/cppwp/n4861/basic.link#5
> In addition, a member function, static data member, ..., has the same linkage, if any, as the name of the class of which it is a member.

689 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 13:08:52.36 ID:BllOBQpy.net]
>>678
あと仮にinline指定が無視されたとしても「別の実体が生成される」というような動作には繋がらないね。



690 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 13:59:06.18 ID:0LC8SyT+.net]
>>599
アーハン?
doubleで表現可能な最小の数と1e-14の大小関係もわかんない人なんですかね、、、

691 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 14:05:40.45 ID:0LC8SyT+.net]
>>593
その2π周期というのが厳密に2*M_PI周期であることの根拠は?
>>560の時点ではそれは示されていなかった
>>588で2*M_PI周期と言う実験結果がデタ

692 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 14:11:22.71 ID:0LC8SyT+.net]
>>596
万能の一般論は無い(キリ
なぜなら、f(x)が0かどうかの判定をしたいとして、±|處を0とみなすべきなのかは
f(x)の精度に依存するから
ただし、>>560式に f(x1) と f(x2) の等値判定なら >>560式にやりうる
これは f(x1) - f(x2) のゼロ判定として>>560式にやればよろっし

693 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 14:15:01.32 ID:0LC8SyT+.net]
アンカーミスった;;;orz
s/>>560/>>588/g

694 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 16:12:55.51 ID:13b+4FON.net]
>>681
O(1) の数値を使って計算してたら例えば 1e-15 以下の数値をゼロと見なすとかするより他ないでしょ
バカ?

695 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 16:30:03.25 ID:OQdcFc3P.net]
sedかよ

696 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 16:59:40.11 ID:gWLf+Bka.net]
知らなくて驚くかもしれないけどdoubleは1e-324も表せちまうんだ

697 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 17:34:26.32 ID:UJcbhjLZ.net]
>>681-687
まだやってたのか小学生・・・ID変えてご苦労様
何度も言ってるが>>560でこの話は終了している

698 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 17:48:02.61 ID:vZsc1PCZ.net]
>>687
そこまで拗らせてる事に驚いたわw

699 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 19:34:50.12 ID:DSkywrpw.net]
>>560
>100万をsin()しても、sin()は2π周期
>doubleの精度15桁中の5桁以上を無駄にしている

これよくわからん。



700 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 20:03:51.19 ID:0LC8SyT+.net]
言ってる当人もわかってないんだろJK

701 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 20:37:14.45 ID:0LC8SyT+.net]
double sin(double x)の精度が±10E-10程度らしいことは>>588の結果が示しているが
こっれはxが100万かどうかによらないことも結果が示してゐる
実装を見ないとわからんが、多分マクローリン展開の打ち切りによる誤差とみるべき

702 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 21:05:23.18 ID:yfbq4hUz.net]
>>692
実装見てから言った方がいいよ。マクローリン展開というが、0を基準にマクローリン展開してるわけないだろ。

703 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 21:18:55.93 ID:0LC8SyT+.net]
>>685
その方法は等値判定として一貫性が無いからNG
double x = 2.0;
double y = 2.0 + (10E-15) / 2.0;
assert(fabs(x - y) <= 10E-15); // pass. 10E-15基準で x == y とみなされる
assert(fabs(100 * x - 100.0 * y) <= 10E-15); // fail。 10E-15基準の下で 100 * x と 100.0 * y はイコールにならにあ

704 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 21:22:04.30 ID:0LC8SyT+.net]
>>693
sin(x)の場合は|x|<<1においてsin(x) ≒ xなのでsin(x+a)を展開をする際のaを0にするのが妥当に思えまっする、

705 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 04:16:28.14 ID:QgynSmAQ.net]
>>689-695
まだやってたのか小学生・・・ID変えてご苦労様
何度も言ってるが>>560でこの話は終了している

706 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 09:39:04.54 ID:CWW/bMN0.net]
>>678
挙動としては正にそんな感じですね

>>679
test.hにあるinline void 内でprintf("%p\n", Field1)、test.cppのvoid Func1内で同様の事をして確認しました
出力のみならず、そもそもヘッダのinline void内でField1に値をセットしたはずなのにソース内ではデフォルト値のままで動作が狂ったので上記のテストをして発覚した次第です
structを名前付きにするかしないかの一点だけで上記の結果が変わります

707 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 09:40:35.92 ID:CWW/bMN0.net]
>>697
printf("%p\n", Field1)はレス間違いでprintf("%p\n", &Field1)で実験しています

708 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:41:30.96 ID:QgynSmAQ.net]
#include<iostream>
struct A{static struct SubStruct{int value;} Field1;};
A::SubStruct A::Field1;
int main() {
std::cout << std::hex << &A::Field1 << std::endl;
return 0;
}
無名で実体の定義なんてできんのか?

709 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:43:19.72 ID:vZkrAotW.net]
キャストやconst&でできるな



710 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:47:03.39 ID:QgynSmAQ.net]
>>700
どうやんの?上の例でやってみてよ

711 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:48:14.26 ID:QgynSmAQ.net]
ちなみに上の例は無名でない構造体で、実体の定義は
A::SubStruct A::Field1;


712 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:51:00.92 ID:CWW/bMN0.net]
>>699
C++20だか17だかからはinlineをつける事で出来ます

713 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:51:47.13 ID:QgynSmAQ.net]
#include<iostream>
struct A{static struct {int value;} Field1;};
decltype(A::Field1) A::Field1;
int main() {
std::cout << std::hex << &A::Field1 << std::endl;
return 0;
}
意外とやってみたら出来たw

714 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:55:02.08 ID:vZkrAotW.net]
>>700

A::SubStruct{}
で実体の「定義」ができる

&A::SubStruct{}
は実体がprvalueという理由でエラーだが
実体を定義できるか否かとは別問題だ

715 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:57:42.35 ID:QgynSmAQ.net]
>>705
根本的に意思疎通できてないみたいだな
staticメンバA::Field1の実体定義だって

716 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:59:48.93 ID:vZkrAotW.net]
>>706
そのようだな
なぜstaticメンバが出てくるのか不明だ

717 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 11:04:13.16 ID:QgynSmAQ.net]
>>703
確かに出来た
-std=c++17
付けたら実体定義なくても通った

718 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 11:05:12.08 ID:QgynSmAQ.net]
コードはこんなのね(with -std=c++17)
#include<iostream>
struct A{static inline struct {int value;} Field1;};
int main() {
std::cout << std::hex << &A::Field1 << std::endl;
return 0;
}

719 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 11:25:38.49 ID:QgynSmAQ.net]
実体は同じのを指すようで再現しなかったな。MakefileはちゃんとTAB入れてな。
cat >Makefile <<EOF
CXXFLAGS += -std=c++17
sample: main.o sub1.o sub2.o
\$(LINK.cc) \$? -o \$@
EOF
cat >main.cpp <<EOF
void sub1();
void sub2();
int main() {
sub1();
sub2();
return 0;
}
EOF
cat >sub1.cpp <<EOF
#include<iostream>
struct A{static inline struct {int value;} Field1;};
void sub1() {
std::cout << std::hex << &A::Field1 << std::endl;
}
EOF
cat >sub2.cpp <<EOF
#include<iostream>
struct A{static inline struct {int value;} Field1;};
void sub2() {
std::cout << std::hex << &A::Field1 << std::endl;
}
EOF
make



720 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 15:40:28.67 ID:K/S7vg9Z.net]
>>697-698
wandbox の gcc 11.1.0 でもやってみたけど、再現せず同じアドレスが出た。
https://wandbox.org/permlink/SSg6OZD97wmgR8kq
コンパイラやバージョンやコンパイルオプションを合わせれば再現するのかね?

721 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 15:53:41.49 ID:QgynSmAQ.net]
>>711
複数のオブジェクトファイルにしないと検証できないと思うよ

722 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 16:09:46.74 ID:K/S7vg9Z.net]
>>712
>>697の説明にあるtest.cppはtest.hをインクルードしてるんだろうからこの形でいいだろうと思った。

まぁやってみたけど、変わらないね。
https://wandbox.org/permlink/hfbakWmCF1i5stqr

723 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 16:31:20.27 ID:QgynSmAQ.net]
>>713
流石にヘッダファイルから何かが生成されることはないw
wandboxで複数オブジェクトファイルって処理系内部の作り次第になるし、>>710でもやってみようかと思ったけど、3つは無理そうだね

724 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 17:20:50.76 ID:hHkcGLX7.net]
ヘッダに実装書くと管理が楽だよね

725 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 17:32:20.44 ID:CWW/bMN0.net]
>>711
検証頂いてるところ環境を明記しておらず申し訳ありません
Visual Studio 2022、C++20で発生している現象です

#include "test.h"
int main() //main.cpp
{
A::Initialize(); //printf("%p\n", &A::Field1);をするだけのstatic inline関数
A::Func1(); //printf("%p\n", &A::Field1);をするだけのstatic関数(__declspec(noinline)をし実装はtest.cpp)
}

struct名をつければInitializeの出力とFunc1の出力は一致、無名structにしたら不一致
本当に他は一切いじらずに名前の有無だけで変わります

726 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 17:54:11.09 ID:QgynSmAQ.net]
現象を再現させる最小限のコードを全セット載せないと先には進まんて
始めからそうしてればこんなにいろいろ書かずに済んでいる

727 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 18:17:03.90 ID:K/S7vg9Z.net]
>>714 wandbox でも -v 追加で as が2つ test.cpp と prog.cc と別で走ってるのまでは見た。

728 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 18:18:38.46 ID:K/S7vg9Z.net]
>>716
MSVC のバグっぽいね。おとなしく名前つけて回避しつつ、できればバグ報告しとくのがいいんじゃない。

729 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:02:54.49 ID:QgynSmAQ.net]
>>715
>>675で「無名構造体のスタティックメンバ変数はヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる」
と書いてあるが、ヘッダファイルから直接実体は生成されないよってこと
.cppなどのソースファイルからincludeされないとコンパイルしないから
(もちろんただのファイル名なのでコンパイラに



730 名前:直接ヘッダファイルをコンパイルせよと指定する事はできる)

つまりA::Field1に該当するシンボルが複数の.objに含まれた場合、同じになっているか=アドレスが同じになるか?
の検証でないと意味がない
[]
[ここ壊れてます]

731 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:09:37.28 ID:QgynSmAQ.net]
>>718
それは昔からgccを使ってる人は知ってるけど、そういう話じゃない
明らかに不自然な位置にソースファイルを指定して無理矢理2個同時にコンパイルする上に、引用されて3個はできない
つまり想定された使い方ではないということ
おまけに処理系やそのバージョンを複数変えられることが比較的便利なwandboxで、処理系を変えると確認が必要になるやり方はどうかと言っただけ
まあ、分かってるとは思うんだが

732 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:24:03.88 ID:QgynSmAQ.net]
とりあえず、710のコードでVS2019を調べた結果、再現は確認できた。
ただし、コンパイルオプション次第で現象が出たり出なかったりする。
VS2022でもないし、VSはコンパイルリンクオプションがデフォルトで大量に指定されてて確認が面倒なのでそれ以上は放棄した。
以下のコードではpermissive-オプションの有無で現象が再現したりしなかったりするが、デフォルト時だとその切替えで現象は変わらないので、一次原因ではないと思う。

733 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:24:36.31 ID:hHkcGLX7.net]
保守できないような書き方して自分の仕事を守る。PGの当然の権利ですよね。

734 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:25:06.27 ID:QgynSmAQ.net]
> main.cpp (
@echo void sub1^(^);
@echo void sub2^(^);
@echo int main^(^) {
@echo sub1^(^);
@echo sub2^(^);
@echo return 0;
@echo }
)
> sub1.cpp (
@echo #include^<iostream^>
@echo struct A { static inline struct { int value; } Field1; };
@echo void sub1^(^) {
@echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl;
@echo }
)
> sub2.cpp (
@echo #include^<iostream^>
@echo struct A { static inline struct { int value; } Field1; };
@echo void sub2^(^) {
@echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl;
@echo }
)
> sample.mak (
@echo CXXFLAGS = /MDd /EHsc /std:c^+^+17 /permissive-
@echo .cpp.obj:
@echo $^(CXX^) $^(CXXFLAGS^) /c $^<
@echo sample.exe: main.obj sub1.obj sub2.obj
@echo link /OUT:$@ $^*^*
)
nmake /f sample.mak
rem バッチファイルもnmakeもよく知りません。

735 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:34:19.55 ID:K/S7vg9Z.net]
>>721 ソース3つ以上もできるよ。 https://wandbox.org/permlink/UgIc9mFrs59059jq

736 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:40:05.18 ID:QgynSmAQ.net]
>>723
そういうのはプロジェクトの方針だと思うので、ここで話す内容ではないと思うよ

737 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:45:20.80 ID:QgynSmAQ.net]
>>725
改行と空白で違うのかよw b烽、知るかってャ激xルだけど、bりがと
bニりあえず>>710を載っけとく
https://wandbox.org/permlink/e8khwggKe00rtekJ

738 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:49:22.51 ID:QgynSmAQ.net]
>>723
>>727は何故だか文字が化けてたので一応書き直しとく。

改行と空白で違うのかよw もう知るかってレベルだけど、ありがと
とりあえず>>710を載っけとく
https://wandbox.org/permlink/e8khwggKe00rtekJ

739 名前:デフォルトの名無しさん [2022/01/24(月) 19:27:55.24 ID:WxnVLAIm.net]
C++11から、C++20までの変更点を解説した入門書を年末に買ったのだが(C++は書けるよ)、まだ読む気になれないw
「今更C++か、pythonでいいだろ」と悪魔が囁くw



740 名前:デフォルトの名無しさん mailto:sage [2022/01/24(月) 19:42:15.63 ID:nLfFXIoN.net]
c++cliについてネットに解説している情報あまり無いですが、まとまってるサイトとかないですかね。

741 名前:デフォルトの名無しさん mailto:sage [2022/01/24(月) 20:29:40.39 ID:kghIRcG8.net]
https://docs.microsoft.com/ja-jp/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=msvc-170

742 名前:デフォルトの名無しさん mailto:sage [2022/01/25(火) 08:07:34.25 ID:m+e4/QVD.net]
めずらしい
変態に興味あるとは
VisualJ++とかワケ

743 名前:ワカだったぜw []
[ここ壊れてます]

744 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 05:15:43.56 ID:DGJ/MazB.net]
1秒おきのタイマーでtmDraw()を呼んで右に伸びる四角を描くプログラムです。VSCでMFC未使用。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
OnPaint(hWnd);
break;
case WM_CREATE:
SetTimer(hWnd,1,1000,(TIMERPROC)NULL); //タイマー定義
break;
case WM_TIMER: //タイマー
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
tmDraw(hdc); //これを呼んで描画
EndPaint(hWnd, &ps);
}
break;
return 0;
}
static VOID tmDraw(HDC hDC)
{
SetDCPenColor(hDC, RGB(0x99, 0x66, 0x00)); //ここが呼ばれてるのは確認
SetDCBrushColor(hDC, RGB(0xFF, 0xCC, 0x00));
Rectangle(hDC, SIZE16(0, 0, cx++, 6)); //伸びる描画
}
最初の1回の描画はされます。タイマーでtmDraw()が呼ばれてるのは確認しています。
呼ばれて描画されてるはずなのですが、実際の画面は更新されず四角は伸びません。
windowサイズを手動で変えていくと四角は右に伸びていき更新されます。
タイマーでtmDraw()が呼ばれた時に描画だけでなく画面の更新もされるようにするにはどうすればよいですか?

745 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 06:35:00.77 ID:R08bxH5q.net]
WM_TIMERでBeginPaintはおかしいぞ
WM_PAINT専用なんだから
無効領域ないのにBeginPaintしたらあかん

[誘導] 続きはこっちでな
Win32API質問箱 Build127
https://mevius.5ch.net/test/read.cgi/tech/1639053176/

746 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 07:17:52.16 ID:T9eKedNN.net]
InvalidateRectとかGetDC〜ReleaseDCだっけ?

747 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 07:50:18.18 ID:td9ayUMw.net]
アップデートはマイクロソフトがやりたい時にやる
という基本理念を理解していないようだね

748 名前:デフォルトの名無しさん [2022/01/26(水) 09:14:18.23 ID:m89Xdimf.net]
WM_TIMERでInvalidateRectしておくとWindowsがWM_PAINT呼んでくれるからそこで描画するんだっけ

749 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:17:55.57 ID:qvNTvCwo.net]
そもそもこれCだろ…
WinMainから書く超基礎的コードをここで聞く頭がもうね



750 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:26:13.12 ID:WR8doP3S.net]
べつにアイドルループで描画してもいいんだよ
メッセージの処理さえ忘れずにピークしてこなせば

751 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:32:54.79 ID:g/1zEXcm.net]
>>738
スレチなのは確かだが、いちいち見下して何がしたいんだお前

752 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:36:18.65 ID:dkXO6/An.net]
どこにでもいるんだよ
自分より下の者をいたぶることで
安心しようとするチンピラ気質なやつは

753 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 10:21:44.17 ID:qvNTvCwo.net]
だってココ定期的に湧くじゃん
Windows使っててWin32APIの使い方聞いてくるC++ほとんど知らない自称天才のバカ
同じやつだよきっと
毎回Win32APIに誘導されてるってのにな

754 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 10:46:25.17 ID:g/1zEXcm.net]
あー、言われれば確かにそんなの居たっけ・・
でもまぁ同一人物とは限らないんだし誘導して終わりでいんじゃね
たまに見当違いの初心者は入ってくるし(DirectXスレにDirectXランタイムのインスコの仕方聞きにきた猛者が居た

755 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 10:59:27.08 ID:vhiSf69I.net]
733 すいません、そっちのスレは知りませんでした
そちらで聞き直します

756 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 11:06:01.05 ID:qvNTvCwo.net]
DirectXスレにDirectXランタイムのインスコの仕方聞くのはまだ仕方ない話
ドライバ固有の問題に当たっているなら専門家に聞いた方がいいだろう

自称天才のバカである確率の方が高いと思うし、高確率で単発IDで荒らすバカも同じだろうし、わざわざレスしてくるやつも同じだろうから、バカにはバカと言ってあげた方が親切

757 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 12:02:29.99 ID:dkXO6/An.net]
誘導ももう済んでるのに
どうしても喧嘩言葉を使いたくて沸いてくる
三下のそのまた下の家畜はいいのか

758 名前:デフォルトの名無しさん [2022/01/26(水) 13:23:53.73 ID:m89Xdimf.net]
DirectXランタイムが許されるならWin32 APIだって許してあげなよ
製品名はVisual C++だし、既定の拡張子 .cpp なんだから Win32はC++ではなくCだって言ってもしょうがない

759 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 23:06:08.50 ID:UuxYD5f6.net]
いかにも漏れは天才だが
さすがにWinMain()から書くようなバリバリWindowsアプリの質問はしないかなあ、、、
漏れの言ってることがまるで理解できない低レヴェル凡人の反発を招くことはあってもな



760 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 10:59:27.25 ID:Z+Vqme3O.net]
天才でも質問することあるんですね
回答者は超天才?

761 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 11:49:44.22 ID:avZQ9Wm7.net]
いかにも
私が超天才だが
ってどっかのハンコ貰いにいく人事のCMみたい

762 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 15:04:46.13 ID:mo0R2qbj.net]
大学の課題でコンパイルエラーになるので教えてもらいないでしょうか
main.cppで、B<A> b; b.display(); のようにAを使っています。
g++ -Wall -std=c++17 -g -o test a.cpp main.cpp
undefined reference to `operator<<(ostream&, A const&)'
※コンストラクタなどの関数定義は省略してます。
■ a.h
class A {
public:
  string m_str;
  friend ostream & operator << (ostream &os, const A &a);
};
■ a.cpp
ostream & operator << (ostream &os, const A &a)
{
  os << a.m_str << endl;
  return os;
}
■ b.h
template <typename T>
class B
{
public:
  void display(ostream &os = cout) const;
  T m_dummy;
};
template <typename T>
void B<T>::display(ostream &os) const
{
  os << m_dummy << endl; // ここが undefined referenceエラー
}

763 名前:751 mailto:sage [2022/01/29(土) 15:50:41.96 ID:mo0R2qbj.net]
失礼、自己解決しました。
namespaceをa.hだけ括って、a.cppに入れ忘れましたw

764 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 02:23:38.98 ID:iz74n4+D.net]
下の★1を★2のように書きたいんだけど、どうやって書けばいいのか
教えてぇ

#include <iostream>

template <typename T>
auto Sum(T h)
{
  return h;
}

template <typename Head,typename... Rests>
auto Sum(Head head,Rests... rests)
{
  return head + Sum(rests...);
}

template<class F,class... Args>
auto
foo(F&& f,Args... args)
{
  return f(args...);
}

int main( int argc, char *argv[] )
{
  std::cout << foo(Sum<int,int,int>,1,2,3) << "\n";//★1
  //std::cout << foo(Sum,1,2,3) << "\n"; //★2

}

765 名前:はちみつ餃子 mailto:sage [2022/01/31(月) 04:05:32.34 ID:y6tOo2ii.net]
>>753
そのようには書けない。 C++ では高階多相を許していない。

766 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 04:18:19.49 ID:o5RGUewZ.net]
なんでも適当に済ますクセ
高級言語に慣れすぎの弊害

767 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 14:49:02.61 ID:y2HjUy1l.net]
>>753
・まず、Sumを多重定義にする必要性は特にないはず
・次に、fooが関数でSumが関数テンプレートの場合、
 関数の実引数として具現しないテンプレートは渡せない

だからfooの代わりにstd::bindを使っても解決しない

・テンプレートテンプレート仮引数を使っても
 クラステンプレートしか渡せず関数テンプレートは不可

こうなるとマクロくらいしか手がない
#define foo(func, ...) func(__VA_ARGS__)

768 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 16:24:09.60 ID:4mzN2AL1.net]
戻り値のautoが決まらないってことでしょ?autoをdouble固定にしてReturnをなくせば通る
#include <iostream>
auto sum() {return 0;}
template<typename Head> auto sum(Head head) {return head;}
template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);}
template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
int main( int argc, char *argv[] ) {
std::cout << sum(1,2.1) << std::endl;
std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << wrap(sum<int,double>, 1,2.1) << std::endl;
std::cout << wrap(sum, 1,2.1) << std::endl;
return 0;
}
// /usr/bin/g++ -fdiagnostics-color=always -g /home/user/cpp/autoreturn/sample.cpp -o /home/user/cpp/autoreturn/sample
// /home/user/cpp/autoreturn/sample.cpp: In function ‘int main(int, char**)’:
// /home/user/cpp/autoreturn/sample.cpp:10:29: error: no matching function for call to ‘wrap(<unresolved overloaded function type>, int, double)’
// 10 | std::cout << wrap(sum, 1,2.1) << std::endl;
// | ^
// /home/user/cpp/autoreturn/sample.cpp:5:52: note: candidate: ‘template<class Return, class ... Args> Return wrap(Return (*)(Args ...), Args ...)’
// 5 | template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
// | ^~~~
// /home/user/cpp/autoreturn/sample.cpp:5:52: note: template argument deduction/substitution failed:
// /home/user/cpp/autoreturn/sample.cpp:10:29: note: couldn’t deduce template parameter ‘Return’
// 10 | std::cout << wrap(sum, 1,2.1) << std::endl;
// | ^

769 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 20:55:29.83 ID:ExACmeMg.net]
>>753
auto Sum = [](auto head, auto... rests) { return (head + ... + rests); };



770 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 22:50:37.06 ID:67CF9RIT.net]
ラッパークラスを通せば似たようなことはできそう。

struct Wrapper_ {
constexpr static auto doit = [](auto... args) { return Sum(args...); };
} wrapper;

int main( int, char ** )
{
std::cout << foo(wrapper.doit,1,2,3) << "\n";
}

771 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 04:38:50.89 ID:X9o0BiPI.net]
クラスは不要だった。
ラムダなら通るみたいだから、 >>758 みたいに元の関数をラムダで書くか、

auto wrapper = [](auto... args) { return Sum(args...); };

みたいなラッパー関数オブジェクト通すかってあたりで足りそう。

// 最初実験してたとき、ラムダ式にしただけだとエラー出てた気がしたんだけど、今やると問題なく通る…

772 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 05:38:09.33 ID:wGiSz27Y.net]
おお、auto... なんてできたのか

773 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 07:53:40.48 ID:vPA4cgbg.net]
>>757にラムダ入れた。
ラムダはオーバーロードできずC++17の畳み込み式が必須で引数なしが表現できないが、選択の手間がない。
#include <iostream>
auto sum() {return 0;}
template<typename Head> auto sum(Head head) {return head;}
template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);}
template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
auto lambda_sum = [](auto head, auto ...tails) {return (head + ... + tails);}; // 追加
auto lambda_wrap = [](auto f, auto ...args) {return f(args...);}; // 追加
int main( int argc, char *argv[] ) {
std::cout << sum() << std::endl; // 追加
std::cout << sum(1) << std::endl; // 追加
std::cout << sum(1,2.1) << std::endl;
std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << wrap(sum<int,double>, 1,2.1) << std::endl;
// std::cout << wrap(sum, 1,2.1) << std::endl; // エラー
// lambda版追加
// std::cout << lambda_sum() << std::endl; // エラー
std::cout << lambda_sum(1) << std::endl; // 追加
std::cout << lambda_sum(1,2.1) << std::endl;
std::cout << lambda_wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << lambda_wrap(static_cast<double(*)(int,double)>(lambda_sum), 1,2.1) << std::endl;
std::cout << lambda_wrap(sum<int,double>, 1,2.1) << std::endl;
// std::cout << lambda_wrap(lambda_sum<int,double>, 1,2.1) << std::endl; // not template
// std::cout << lambda_wrap(sum, 1,2.1) << std::endl; // エラー
std::cout << lambda_wrap(lambda_sum, 1,2.1) << std::endl;
return 0;
}

774 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 22:23:26.64 ID:rdLB3H0G.net]
c++では
sz=120;
char dt[sz];
このように配列のサイズを変数の可変サイズで指定することはできないんですか?
これを実現する方法は何かありませんか?

775 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 22:43:02.67 ID:rdLB3H0G.net]
自己解決しました
しかし dt[10][d] のように2次元以上はjavaのような動的変動はできないんですね

776 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 23:27:31.22 ID:fhOfpvRh.net]
vector使わんの?

777 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 23:28:28.99 ID:hJiWfYJV.net]
配列使わんし

778 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 23:30:45.06 ID:Sh1zYLGa.net]
>>763
arrayという似たようなやつはあるが
基本的に作法が違う

779 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 10:03:42.12 ID:pPu7Tazo.net]
コンストラクタ・テンプレートでテンプレート実引数を推定させず明示的に与えるのはどう書く?

struct some_class
{
template <class A> some_class(int) {}
};

int main()
{
some_class obj<void>(1); //error
}



780 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 12:11:02.47 ID:ryNE78sg.net]
>>768
コンストラクタには明示的に型引数を渡せない

781 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 12:36:54.65 ID:pPu7Tazo.net]
そっか。。。残念
thx >>769

782 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 12:56:51.10 ID:X/91R13x.net]
ファイルサイズを取得しようとしていろいろサイトを参考にして次のようにしたのですが
std::filesystem::file_size(path)
filesystemのところに赤線が出て使用できません
これらは記述しています
#include <iostream>
#include <fstream>
#include <filesystem>
使っているのはCommunity 2019です
filesystemが使えないのはなぜでしょう?

783 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 13:02:34.63 ID:ryNE78sg.net]
>>771
filesystemが使えるのはC++17以降

プロジェクトの設定から言語バージョンをC++14(既定)->C++17に

784 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 13:34:32.24 ID:pPu7Tazo.net]
>>771
/std:c++17は指定してる?

785 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 13:43:30.57 ID:X/91R13x.net]
ありがとうございます C++17指定できました

786 名前:デフォルトの名無しさん mailto:sage [2022/02/03(木) 12:49:10.84 ID:d1XPVqCl.net]
filesystemは、できればC++20モードで使いたい
file_clockまわりがC++17ではgdgdだから

787 名前:デフォルトの名無しさん mailto:sage [2022/02/04(金) 13:06:35.94 ID:ovGR74Kw.net]
小文字に変換するプログラムです
string toLowerCase(const string& str)
{
string lower = str;
std::transform(lower.begin(), lower.end(), lower.begin(), std::tolower);
return lower;
}
実行するとstd::transform 一致するオーバーロードする関数が見つかりません、とか
6引数が必要です 4が設定されてます、とか出て
実行できません
これは何が問題なのでしょうか?

788 名前:デフォルトの名無しさん mailto:sage [2022/02/04(金) 13:07:58.25 ID:N/NFryku.net]
tolowerが多重定義関数だからじゃね?

789 名前:デフォルトの名無しさん mailto:sage [2022/02/04(金) 13:22:13.60 ID:ovGR74Kw.net]
自分では他に定義してないんですがどこで定義されてるんでしょう



790 名前:はちみつ餃子 mailto:sage [2022/02/04(金) 13:28:07.50 ID:RpLWwySn.net]
>>776
ちょうど >>658 で同じような事例が出ている。
std::tolower は cctype ヘッダと locale ヘッダにそれぞれあって
locale ヘッダのほうが関数テンプレートだし二引数なのでこの場の都合に合わない。
なんらかの方法でどれを使うのか選択する必要があり、
たとえば static_cast などが使える。
ただ、 >>661 が提示しているようにデフォルト引数が追加される可能性があったりもするので
static_cast よりはラムダ式を経由するほうが安心できるスタイルかもね。

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

std::string toLowerCase(const std::string& str)
{
std::string lower;
std::transform(std::begin(str), std::end(str), std::back_inserter(lower), static_cast<int(*)(int)>(std::tolower));
return lower;
}

int main(void) {
std::cout << toLowerCase("abcDEfgHi") << std::endl;
}

791 名前:デフォルトの名無しさん mailto:sage [2022/02/04(金) 13:35:40.02 ID:ovGR74Kw.net]
ありがとうございます ビルド通ったみたいです

792 名前:デフォルトの名無しさん mailto:sage [2022/02/04(金) 13:55:24.36 ID:3M0ClPfa.net]
最近のはptr_funやんなくても通んだな

793 名前:デフォルトの名無しさん mailto:sage [2022/02/05(土) 11:50:25.88 ID:DOE5sh/+.net]
template<yyy T>//yyyはコンセプト
requires !xxx<T>//xxxはコンセプト
void test(const T& a);//yyyのコンセプトを満たしxxxのコンセプトを満たさないものについて処理したい

C++20のコンセプトのrequires節って!使うと警告出るのでわざわざ否定用のコンセプト作成して対応してるんだけど、もっと簡単な仕組みない?

794 名前:デフォルトの名無しさん mailto:sage [2022/02/05(土) 11:52:48.48 ID:vpksE3yJ.net]
requires (!xxx<T>)

795 名前:デフォルトの名無しさん mailto:sage [2022/02/05(土) 12:04:00.17 ID:DOE5sh/+.net]
解決した!ありがとう!

796 名前:デフォルトの名無しさん mailto:sage [2022/02/05(土) 20:23:31.04 ID:Irrrknzv.net]
#define FOO() 1

#if FOO
...
#endif

と書いた場合FOOの後ろに()付けるの忘れてるのでコンパイルエラーになって欲しいんですが
実際はFOOは偽に評価されてるみたいです
何が起きてるんでしょうか?

797 名前:はちみつ餃子 mailto:sage [2022/02/05(土) 20:31:08.99 ID:NEwj3nV7.net]
>>785
#if の条件の部分ではマクロ展開できるものを全部展開したあとに知らない識別子が残ったら 0 と解釈する。

798 名前:デフォルトの名無しさん mailto:sage [2022/02/05(土) 20:32:57.42 ID:BHACckaU.net]
>>785
FOO に () が無いことで展開されず、マクロ展開後に残った識別子として 0 に置き換わってる。
https://timsong-cpp.github.io/cppwp/n4868/cpp.cond#11.sentence-1
> After all replacements ..., all remaining identifiers and keywords,
> except for true and false, are replaced with the pp-number 0, ...

799 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 01:29:50.60 ID:Yc7Iwiyd.net]
>>785
バカですか?



800 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 01:32:54.82 ID:3BxbnhGH.net]
#if defined(FOO)
...
#endif

801 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 01:34:05.59 ID:Yc7Iwiyd.net]
Cの基本が出来てないくせにC++を使いこなせると思うなよ

802 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 01:35:00.88 ID:H2F64OwB.net]
横からだけど知らなかった

803 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 03:28:00.08 ID:XnD7OQcd.net]
>>786
>>787
ありがとうございます
このルールは知りませんでした

804 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 06:46:34.29 ID:qvD4QsX7.net]
こういう馬鹿のためにコンパイラに無駄なルールが必要になるんだなと実感

805 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 06:55:06.64 ID:usxBX4wT.net]
エラーにならないのは理不尽だな

806 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 08:23:12.41 ID:qvD4QsX7.net]
馬鹿のためにわざわざプリプロセスで構文解析エラーを要求するとか馬鹿の極み

807 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 08:30:29.95 ID:usxBX4wT.net]
FOOが0になる根拠を与えていないだろ
関連付けられていないものが出てくるのがおかしいと思わないとしたらPG適性低いぞ

808 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 08:53:46.75 ID:2YxKeDPZ.net]
唐突に0がどうとか言い出すのはセンス無いわ

809 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:07:44.45 ID:HE5J2RYG.net]
初めて知った



810 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:24:54.74 ID:usxBX4wT.net]
>>797
>>786

811 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:35:58.81 ID:qvD4QsX7.net]
馬鹿は当たり前のように英語も読めない

812 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:36:22.76 ID:vWDceL4H.net]
なんじゃそりゃ>>799はC++規格委員会が死ね言うたら死ぬんか、

813 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:57:50.12 ID:vWDceL4H.net]
規格書にはなんでそうなっているのか(置換されずに残ったFOOをエラーではなく0にするのか)の理由が書かれていないが
#ifdef defined(FOO) && FOO
として現れる論理式「defined(FOO) && FOO」の解釈を簡単にやりたい(FOOが未定義の場合でも通常の式の解釈ルーチンで処理したい
的なしょーもない理由だったりして……

814 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:59:13.49 ID:vWDceL4H.net]
まつがえたorz
×: #ifdef defined(FOO) && FOO
○: #if defined(FOO) && FOO

815 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 10:11:26.46 ID:usxBX4wT.net]
>>801
唐突じゃないことを示したまで
事実関係をよく確認してからセンス無いとかドヤれってこと

816 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 10:16:43.48 ID:a0g451d/.net]
理由はたぶん、規格化以前に存在した実装の動作を規格違反とするのはマズいとか、
その動作に依存して #if FOO としてる既存ソースをエラーとするわけにはいかなかったとか、
そんなところだろうと思う。

マズい動作として検出したければ警告は出せるんだし。

817 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 11:57:03.48 ID:qvD4QsX7.net]
馬鹿がまだ騒いでるのかw
こういう変なコードとの対比w
$ g++ -x c++ - <<EOF
auto f = [](){return 2;};
#define f() 1
int main() {
auto i = f();
auto j = f;
return i + j();
}
EOF
$ ./a.out
$ echo $?
3
$

818 名前:はちみつ餃子 mailto:sage [2022/02/06(日) 12:12:45.00 ID:u7K67HUJ.net]
残った識別子を 0 に解釈する挙動は C89 からの仕様だから C89 の Rationale (根拠) を見たんだけど直接的な言及は見つからない。
https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BxVCLS4f8Sg5NWZmM2NjZWEtYmExMS00Y2EzLWE3ZTMtNzFmYjYwYzBiOTIw&hl=en_US
ただ、既存のコードに差し障りがないようにということは明記してある (3.8.3) ので、
その時点でそういう挙動が支配的 (かつそれに依存するコードが多かった) のだろうとは察せられる。

規格ってのは統一を図るってのが第一の目的だけど無理な仕様でまとめちゃうと誰もその規格に従わないだけなんで、
現実にそれでやっているってのも (たとえ不格好でも) 十分な理由になるんだよ。

819 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 12:26:28.98 ID:qvD4QsX7.net]
そう書かれるとC89っぽく書かないといかんのか?w
変更部分のみw
$ gcc -x c -std=c89 - <<EOF
int f(void){return 2;}
#define f() 1
int main(void) {
int i;
int (*j)();
i = f();
j = &f;
return i + (*j)();
}
EOF



820 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 12:53:10.29 ID:FF40fIFl.net]
CとC++の規格は既存コードへの忖度の塊で出来てるからな
万人の敵だったgets()を削除するのにどんだけ苦労してるのやら

821 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 13:16:26.39 ID:vWDceL4H.net]
>>806>>808
スレに乗っかったつもりにしては
#if f

#endif
というのが含まれて無いようだが?

822 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 13:22:45.35 ID:vWDceL4H.net]
>>807
C++規格委員会は無罪なのかもしれんがじゃあなんでC89以前からそうで
そういう挙動が支配的になってしまう事態になってしまったのか、と考えると
やっぱプリプロセッサの最初の設計者がサボって
プリプロセッサ式の途中でのFOOの定義/未定義判定を
define(FOO)を導入する代わりに仕様の方を弄って簡単ハックしてしまったから
のでは……

823 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 13:33:49.71 ID:qvD4QsX7.net]
コードを示しても馬鹿には伝わらない悲しみw

824 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 13:37:12.22 ID:vWDceL4H.net]
>>812
天才にもわかるようにkwsk

825 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 13:39:17.55 ID:qvD4QsX7.net]
天才は自力でなんとか出来るし、他人を信用しないことも多いから、基本的に質問とかする機会がない
アイデアレベルの話のみ

826 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 14:11:31.07 ID:Yc7Iwiyd.net]
(σ゚ω゚)σゲッツ
stdioのバッファ使うヤツ殆ど失敗作

827 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 14:22:31.03 ID:yFNvdNoT.net]
#define マクロは単純置換のやつと関数形式のやつがある

#define A(a,b)
A();A(1);A(1,2,3);A(1,);A(,2);A;

結構めちゃくちゃなことやってもプリプロセスはエラー吐かない

引数足りないとか関数形式マクロの括弧がないのは意図しない使い方だろうからエラーにしてもらいたい気持ちはわかるが

というか<<802で言及されてるけど#if UNDEFINEDも非推奨にしてほしいわ
#define DEBUG
#define DEBUG 1
#define DEBUG 0
//#define DEBUG (undefined)
これらの全部のケースに対応できてねーし
#if DEBUG+0 とか書けとでも?

828 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 15:06:24.27 ID:qvD4QsX7.net]
俺のコードのg++やgccをcppに変えればプリプロセスの結果が出るよw オプション引数に-Eを付けても可w
別に不思議でも何でもない結果が表示されるw
$ cpp -x c++ - <<EOF
#define A(a,b) expanded
A();
A(1);
A(1,2,3);
A(1,);
A(,2);
A;
EOF
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"

<stdin>:2:3: error: macro "A" requires 2 arguments, but only 1 given
<stdin>:1: note: macro "A" defined here
A;
<stdin>:3:4: error: macro "A" requires 2 arguments, but only 1 given
<stdin>:1: note: macro "A" defined here
A;
<stdin>:4:8: error: macro "A" passed 3 arguments, but takes just 2
<stdin>:1: note: macro "A" defined here
A;
expanded;
expanded;
A;
$

829 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 16:46:37.28 ID:XnD7OQcd.net]
インクルードガード書くときも単に
#define FOO_HPP
とするのと
#define FOO_HPP 1
と1にするのがあるがどちらが良いとかあるんだろうか

後者の方がconstexpr if文などのC++の言語機能と組み合わせて使えるというメリットがありそうだが



830 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 16:54:43.06 ID:W01LuusE.net]
今から新規に書くなら #pragma once 一択

831 名前:はちみつ餃子 mailto:sage [2022/02/06(日) 17:09:14.27 ID:u7K67HUJ.net]
>>818
私自身は前者にしてる。
インクルードしたことを示すためのフラグとしてのマクロが必要なら
(そういう事例に遭遇したことはないが) ガード用とは別にマクロ定義すると思う。

ガードのために定義したものをガード以外の目的で使うというのがちょっと汚く感じるから。
だけど分けちゃうと管理が二重になるのが嫌だと思う人もいるだろうし、
思想によるんじゃないの。

私は規格厨なので #pragma once は使わない。
まあ gcc と clang と msvc で使えるから事実上は問題にならないけど。

832 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 17:25:15.43 ID:XnD7OQcd.net]
>>820
ありがとう
納得できる理由です

インクルードガード以外のフラグも同様にしてますか?
標準のNDEBUGのように

833 名前:はちみつ餃子 mailto:sage [2022/02/06(日) 17:46:04.51 ID:u7K67HUJ.net]
>>821
NDEBUG は「デバッグモードとそうでないモードを切り替える」というのがその用途なので
それに沿うと思ったら分けずに NDEBUG を使うことはあるよ。
でも「NDEBUG の用途は assert の有効・無効の切り替えなので他に使うべきでない」と認識している人がいてもおかしくない。

規格に書いてあるのはこの場合はこうだという規則だけなので
抽象的な部分での意味の捉え方は人によってかなり幅がある。
そのあたりは文脈を察して常識的判断でやっていくしかないし、
チームでやってるなら話し合うしかしょうがない。

このへんはそんなにスッパリと判断基準を設けられるようなもんではないと思う。

834 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 19:09:51.99 ID:qvD4QsX7.net]
MS発祥のモノが嫌われてるだけとも思うw

835 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 19:46:48.16 ID:XnD7OQcd.net]
>>822
質問の意図がわかりにくくてすみません
自前でフラグ書くなら
>>818の前者と後者どちらを使うのかが知りたかった

836 名前:はちみつ餃子 mailto:sage [2022/02/06(日) 20:08:36.06 ID:u7K67HUJ.net]
>>824
基本的には前者。
フラグとしてのマクロで分岐するときは #if よりも #ifdef (または defined) を使うようにしてる。
マクロは型を付けられないからそうすることで ON/OFF のどちらかであって内容に意味はない
ことを明示してる感じを出したいと思ってる。

837 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 20:55:43.12 ID:XnD7OQcd.net]
>>825
改めての回答ありがとうございます

こういう一見どちらでも良いものであっても裏の考えや意図が聞けて面白かったです

838 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 06:01:51.26 ID:a2THiWt1.net]
#pragma onceを標準に採用すればええのに
これだけ需要あるのに長年ずっと放置状態
何がそん

839 名前:なに問題なんだろう []
[ここ壊れてます]



840 名前:はちみつ餃子 mailto:sage [2022/02/07(月) 09:54:39.71 ID:T4nofIq4.net]
現行仕様での理屈の立て方としては #include の効果でコードに一体化してから内容の解釈が始まるので
インクルードに干渉する余地がない。
現実にやってるんだから出来るのは間違いないんだけど理屈を根本から変えることになるし、
モジュールが上手くいけばどうでもよくなることに手間をかけたくないんじゃないかな。

841 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 11:19:39.20 ID:3u4X3WRg.net]
シンボリックリンクで別のパスになってたりとか、同じ内容の別ファイルとか、ファイル名違う中身同じファイルとか、日付だけ違う別ディレクトリの同じ内容のファイルとか
そんなの考えたくないよなーw

842 名前:はちみつ餃子 mailto:sage [2022/02/07(月) 11:53:54.22 ID:T4nofIq4.net]
名前と実体をどう対応付けるかは今でも処理系定義なのでそこらへんはあまり問題にならないと思う。

843 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 11:56:53.41 ID:XrnUHtPA.net]
そこで#pragma onceはヘッダファイルそのものをインクルード済とみなすのではなくて
定義されている内容を定義済みと記憶するのが妥当な動作
なんだけど以下のような場合に困るという、
"a.h"
struct Foo {

"b.h"
  int m_x;
  double m_y;
};

"c.cpp"
#include "a.h"
#include "b.h"

やっぱモジュールにしたら同じような実装で完全な解決になるのだから待った方が、

844 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 12:22:03.46 ID:XrnUHtPA.net]
現行の
#ifdef _FOO_H_
#define _FOO_H_
....
#endif
はヘッダファイルをインクルード済みか否かではなく
マクロ_FOO_H_が定義済みか否かを問題にしているのである意味モジュールに近い
#pragma onceは現行のマイクロソフトのやつはヘッダファイルをインクルード済みか否かを問題にしているので
何をもって同一のヘッダファイルとみなすのかという解釈の揺らぎの影響を受けてしまうまインクルードの挙動が、

845 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 12:25:19.77 ID:3u4X3WRg.net]
>>830
だからどう転ぼうと中身で決められる昔ながらの方法の方が結果が明確ということw

ちなみにgccは
シンボリックリンク→ガード
同じ内容・日付・名前、別ディレクトリの別ファイル→ガード
同じ内容・名前、別日付、ディレクトリの別ファイル→インクルード
同じ内容・日付、別名前、ディレクトリの別ファイル→インクルード
みたい

846 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 12:42:43.58 ID:OoGLA1C8.net]
MSの手抜き仕様まで合わせる必要なし

847 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 12:56:32.61 ID:3qCWHTEM.net]
でもCに代わってC++が広まったのはMSのおかげじゃん

848 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 13:10:46.99 ID:a2THiWt1.net]
ビット数多めのハッシュにしとけば
例えば衝突確率340澗分の1とかにできるよな

849 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 12:59:20.15 ID:ioLTStxt.net]
64bit osでポインタ型を4byteにするにはどうすればいいんですか?
8byteだとちょっと大きすぎる気がします



850 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:03:37.90 ID:IwR5waiE.net]
なぜ大きすぎると思ったのかが分からないが、64bitのアドレス空間を表すのに8 byteは必要だよ

851 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:08:06.15 ID:PzVUb2uc.net]
>>837
貧乏くさすぎ

852 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:19:23.53 ID:eAgudC7+.net]
64bit WindowsOSなら32bitアプリにすればok

853 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:40:55.45 ID:ioLTStxt.net]
例えば64bitの場合アドレスの上位4byteを一意に決めといて下位4byteを4byteの変数に格納しておくってやり方なんてはどうですか?
それで復元時には
(上位4byte << 32) & 下位4byteっていうふうに変換するってふうになると思うんですが
まず最初に上位4byteが一致した連続したメモリ領域から決まってメモリを確保するなんてことはできるのでしょうか?

854 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:52:00.55 ID:USCqmiY8.net]
必要なメモリをvector<X>で確保しておいて32bit以下のindex値でアクセスすることにすれば?

ポインタのサイズが大きすぎるなんて理由でやる人はいないと思うけど

855 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:52:47.57 ID:E/6u1YW1.net]
long long ago... タイニー、スモール、コンパクト、ミディアム、ラージ、ヒュージつーのがあってだな

856 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 14:26:32.14 ID:ioLTStxt.net]
>>842
そうすることにします
ありがとうございました

857 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 14:34:15.15 ID:PzVUb2uc.net]
関数ポインタかなんかが8バイトに収まってなくて混乱したことがあったっけ

858 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 14:37:12.22 ID:Jq7h8mT9.net]
昔は16bitポインタと32bitポインタをLPとPで使い分けてたって戦争で死んだおじいちゃんに聞いた

859 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 17:17:57.87 ID:SS+/CtsS.net]
segment:offset時代か・・・



860 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 18:17:45.02 ID:t2vkJvVR.net]
アセンブラの相対ショートジャンプは8ビット

861 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 22:34:51.11 ID:9agulkW+.net]
ウィンドーズならINT_PTR使っとけばおkオール無問題
C++の標準規格でどうなっているのかわ知らん

862 名前:はちみつ餃子 mailto:sage [2022/02/09(水) 23:19:57.51 ID:9Cj+df9g.net]
規格上は std::intptr_t というものがある。
ただし関数ポインタやメンバ関数ポインタを格納できるとは限らない。
また、省略可能 (optional) であると明記されているので無くても規格準拠たりうる。

関数ポインタ同士 (メンバ関数ポインタは含まない) はお互いに変換可能であり
元の型にキャストしたら元の値と等しくなることは保証されるので
任意の型の関数ポインタを格納したいのであれば void* や intptr_t を使うよりは
適当な型の関数ポインタに入れるほうが規格に沿う。

メンバ関数ポインタは型通りに扱う以外はほとんど何の保証もないのだけれど
無理に変換して扱いたい場合も特に思いつかないのでどうでもいい。

863 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 02:00:13.27 ID:vaE+JZMI.net]
>>843
far/near を直接指定すれはすむ話、メモリモデルなんてどうでもいい

864 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 19:32:52.48 ID:OsDlZl05.net]
effective C++って現行のC++と比べてどのあたりが古いんですか?
代表的なところとかだけでも教えてくれると嬉しいです

865 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 19:38:59.22 ID:NUzD8R/O.net]
全て

866 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 20:00:39.81 ID:qtJUe0L+.net]
出版1998年やんけ
こんなもん使うぐらいならC言語やった方がマシなレベル

867 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 20:11:39.77 ID:OsDlZl05.net]
>>854
一応第3版は原書が2005年に書かれています…

868 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 20:20:25.92 ID:ZkLGowhi.net]
続編のeffective modern c++も古いけど、
こっちは隕石落下後の本だから読んでおいたほうがいいよ

869 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 21:18:10.31 ID:OsDlZl05.net]
隕石落下後ってなんすか?
あとC++の勉強するならこの本読め、みたいなのって他にもありますか?



870 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 21:38:32.90 ID:ty8Wss5J.net]
2005年でも古いなあ
C++98, 03, 11(0x), 14, 17, 20 と5回バージョンアップあるし
そのたびに標準ライブラリが更新されてる

古い本で古い書き方しか知らないと慣れてきたころにイラつくことになるから最低でもC++11対応のやつがいい

871 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 21:44:00.87 ID:Qcxer4Pv.net]
今更auto_ptr使うなとか言われても何の役にも立たないからな

872 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 23:48:22.57 ID:jkDJeeU1.net]
べつに使ってもいいんだよ
使い方さえ間違えなければ

873 名前:デフォルトの名無しさん mailto:sage [2022/02/11(金) 00:26:40.18 ID:3fYQCkDW.net]
使うことが間違いでは?

874 名前:デフォルトの名無しさん mailto:sage [2022/02/11(金) 04:33:24.42 ID:ajov4Ad8.net]
左辺値参照で無理やりムーブ作ったやつね

875 名前:デフォルトの名無しさん mailto:sage [2022/02/11(金) 06:13:41.97 ID:ycfpInN1.net]
仕様のバージョンは普通自分で選ぶもんじゃないので、古いことを知るのだって意味はある
逆にどの辺が古い、というのが分かってもあまり意味ない

876 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 06:29:47.80 ID:DI/GcuLa.net]
いろんな範囲で一様乱数を次々と生成したいときってどうしますか?
uniform_int_distribution の範囲を次々と param で変える?
あるいは、妥協して剰余をとる形で範囲を変える?

877 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 06:32:11.91 ID:DI/GcuLa.net]
あるいは、uniform_int_distribution を次々と生成して使い捨てる?

実測するべきなんでしょうが、どれがオーバーヘッドが少ないかというカンがありません

878 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 06:51:44.09 ID:rfXE6dHR.net]
色々手はあるね
「いろんな範囲」の個数が決まっているならuniform_int_distributionの配列にするもよし
ランダムならparamもよし

次々と生成して使い捨て、つまりコンストラクタとデストラクタを都度実行するのは
俺はあんまりやりたくないが止めもしない

879 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 07:21:47.95 ID:JnTPIF3C.net]
>>865
同じ範囲を何回も使うならその分distributionを用意する、そうでないならparamを変えていくのが良さそうに思います。が、たぶん実行時の差はほぼ無いです。
いちおう関数の定数を書き換えていくかメモリ上に予めたくさん用意するかの違いとして判断しました。
計算重いのは大抵は乱数生成の方だと思うので、速くしたいならそっちをとりかえたほうがいいと思います。



880 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 07:48:28.31 ID:rfXE6dHR.net]
メルセンヌツイスターの売りの1つが速度がそんなに遅くない点だね

881 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 10:06:40.11 ID:+NRIy/Ul.net]
なんで剰余を取るのが妥協なん?

882 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 10:33:38.50 ID:SeV3jiEK.net]
一様性が一般に崩れるから

883 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 10:37:30.83 ID:SeV3jiEK.net]
個人的にはこうやってみたりしてゐる、

/// 閉区間[0, ub]を値域とする一様乱数を生成する。
unsigned long genrand_int32_with_ub(unsigned long ub)
{
assert(0 < ub && ub < (unsigned long)UINT32_MAX);
const uint64_t F = (uint64_t)UINT32_MAX;
const uint64_t W = (uint64_t)ub + (uint64_t)1;
const uint64_t Q = F / W;
#ifndef NDEBUG
const uint64_t R = F - W * Q;
assert(Q > 0 && 0 <= R && R < W);
#endif
// 半開区間[0, (W+1)*Q)を値域とする一様乱数取得
const uint64_t WQ = W * Q;
uint64_t rndLTWQ;
do {
rndLTWQ = (uint64_t)genrand_int32();
//print

884 名前:f("rndLTWQ=0x%08x, Q=0x%016llu\n", rndLTWQ, Q);
} while (rndLTWQ >= WQ);

// Qで割る。
const uint64_t r = rndLTWQ / Q;
assert(0 <= r && r <= ub);
return (unsigned long)r;
}
[]
[ここ壊れてます]

885 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 10:52:20.14 ID:cIrOgCom.net]
標準ライブラリ使わんの?

886 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 11:12:52.07 ID:nD0XyBZB.net]
>>869
分かり易い例として 0 から 9 の一様な乱数列を生成するものを考えてみればいい。
このとき 0 から 7 の値が必要だからといって 8 の余剰を取ったらどうなる?
8, 9 が 0, 1 になるから 0 と 1 の出現確率が他の倍になってしまうだろ。

生成される値の幅が必要な値の幅よりも十分に大きいなら
許容可能な誤差として無視できる場合も多いとは思うが
様々なパラメータが有りうる状況では検証しづらい。

887 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 11:15:35.52 ID:nD0XyBZB.net]
>>872
呼出しのたびに必要な範囲が違うような Distribution が標準に無いという文脈

888 名前:ハノン mailto:sage [2022/02/13(日) 12:39:58.09 ID:1UprWsoO.net]
>>873
それもあるけれども、昔の擬似乱数列は絶望的なまでに下位桁がランダムではない、という事情をひきずっているのでは?まあ MT はそうじゃないけどね

889 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 13:09:41.79 ID:+NRIy/Ul.net]
>>873
そらもちろん、元がそんな狭い範囲ならだめでしょ
あとまあ昔のrand的には割ってかけるのが正しいというのはあるけどそれは別の話で



890 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 13:37:58.02 ID:PyRRUUG6.net]
C++何の関係もない話で草
検証が必要ならすればいいだけ
要件すら不明で何もしてないのに質問するやつが馬鹿

891 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 14:27:27.60 ID:nD0XyBZB.net]
>>876
> 元がそんな狭い範囲ならだめでしょ

逆に欲しい範囲が大きい場合でも同様。
この場合は様々な範囲が有りうるという想定なので、都合の悪い状況も考慮する必要がある。

892 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 15:14:31.28 ID:GfZrXG+U.net]
任意の区間の乱数って、どうせはみ出した分をちょん切るんでしょ?

893 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 15:18:24.06 ID:nD0XyBZB.net]
せやで。

894 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 15:25:43.89 ID:CS3pmCmc.net]
そんな短い周期の疑似乱数使ってないんじゃない?
端っこは気にしないと思うなあ

895 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 16:00:39.64 ID:yoBtg/nD.net]
>>876
> そらもちろん、元がそんな狭い範囲ならだめでしょ
「分かり易い例」って書いてあるのも理解できないの?

896 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 16:06:17.09 ID:CS3pmCmc.net]
一般論でいうと周期に余裕がない様な疑似乱数使うのが間違いなんだと思うけどね

897 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 16:19:57.08 ID:kSk9XozZ.net]
そういうのを乱数知識ない奴が触らずに済むようにパッケージにしたのが<random>のdistributionなんだから素直に頼っとけよ

898 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 16:42:35.21 ID:JnTPIF3C.net]
周期と値域は別では

899 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 16:56:02.36 ID:KditTIA5.net]
>>885
内部的にはおおむね同じです



900 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 17:04:20.08 ID:nD0XyBZB.net]
線形合同法とかなら値の範囲と周期が一致することもあるが、乱数の一般的性質というわけではない。

901 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 17:59:20.78 ID:av/6iEu7.net]
周期と値域は別だろ
たとえばマイナス一億と、プラス一億の2値をとる乱数とか

902 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:15:27.44 ID:AOBvb97v.net]
疑似乱数なんて今の値で次の値が決まるんだから周期も値も同じだろう
その値の一部を使ったらまあ見た目は減るだろうけど

903 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:32:37.88 ID:3OIdnfKh.net]
値域: 出力される値の範囲
周期: そのまんま乱数の出力が1周するステップ数

内部状態かなんかとごちゃ混ぜになってない?

904 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 18:34:40.46 ID:nD0XyBZB.net]
>>889
内部状態と結果を分離する方式だって当然あるよ。
メルセンヌツイスタのどでかい内部状態を毎回値として利用するわけないし、
乱数として利用できる性質になってない。

905 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:34:49.25 ID:AOBvb97v.net]
さすがにマジの最大値と最小値なんて誰も問題にしとらんやろ

906 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:38:19.35 ID:mUIDTArd.net]
>>892
その思い込みで「値域」と「内部状態の大きさ」をごっちゃにしてるから話がこじれてたんでしょ。
区別して。

907 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:55:00.53 ID:RJAwRgrO.net]
端っこにゴミがあるよりは歯抜けが散らばってる方がいいというのは一理あるね

908 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 10:33:59.04 ID:14KvXXq2.net]
メンバー関数をテンプレートに出来たりしませんかね?

struct Sample{void func1(int i); void func2(int i);...}
template<typename T> void SampFunc(Sample& sample, int i){sample.T(i);}

みたいな

エラーはNo member named 'T' in ホゲホゲって感じですが

909 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 10:38:23.09 ID:14KvXXq2.net]
書き込んでから思いつきましたが直接やらずに
struct Caller1{void operator()(Sample& sample, int i){sample.func1(int i);}};
...
みたいなのを挟むべきですかねぇ



910 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 10:52:52.11 ID:Z549+Tcq.net]
structの{}内にテンプレートの文全部入れてみ?

911 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:13:25.35 ID:o9A3FVGP.net]
毎回 uniform_int_distribution のインスタンスを一時的に生成しては破壊するのを繰り返すのだけはありえんだろ
無意味なメモリのアロケーションありすぎ

912 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:16:30.38 ID:lu0CYRrt.net]
#include <iostream>
using namespace std;
struct Sample{
void func1(int i) {cout << i << "," << __PRETTY_FUNCTION__ << endl;}
void func2(int i) {cout << i << "," << __PRETTY_FUNCTION__ << endl;}
};
template<typename T> void SampFunc(Sample& sample, int i, T member_func){
(sample.*member_func)(i);
}
int main() {
Sample s;
SampFunc(s, 1, &Sample::func1);
SampFunc(s, 2, &Sample::func2);
return 0;
}

913 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:28:15.31 ID:s3l2ZTMb.net]
doubleとfloatの配列を同じように関数の引数に渡して扱う方法ってありますか?
・処理部が複雑なので引数の型が違う関数2個は作りたくない
・IF関数として両方版を作ってそこから処理部を呼び出すみたいな構造は可能、ただし別型版の実体コピー配列などは作りたくない(配列が巨大な為)

考えてみたのが、
配列の値部分をvoid*配列で指したものと、type_infoを持ったクラスなり構造体なりを用意して、
処理部でtype_infoに応じてvoid*をキャスティング、という方法ですが、
どうにも汚いのでもっと綺麗なやり方あれば教えてください。

914 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:34:29.03 ID:lu0CYRrt.net]
コードがないので0点

915 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:51:48.64 ID:MNwZvUCy.net]
テンプレートでいいだろ

916 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:54:11.63 ID:L8LvhIeL.net]
>>900
ふつーにテンプレートじゃね?
template <typename T> requires std::is_floating_point_v<T>
void func(T&& arg)
{
}

あとanyなんて手もあるけど
void func(std::any arg)
{
if(arg.type() == typeid(double)) { }
if(arg.type() == typeid(float)) { }
}

917 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:57:58.78 ID:81yRYH7R.net]
>>900
template<typename T, size_t size>
void f(T(&a)[size]){
}

918 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 12:04:39.18 ID:Z549+Tcq.net]
>>903に便乗してC++20で以下のような書き方も
#include <concept>
template<std::floating_point T>
void func(T && a){}

919 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 12:12:47.83 ID:L8LvhIeL.net]
>>900
まさかとは思うが
float f[2];
std::fill(std::begin(f), std::end(f), 0);

double d[2];
std::fill(std::begin(d), std::end(d), 0);
こんな基本はわかるんだよな?



920 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 13:46:37.17 ID:nlxkZZlr.net]
>>899
ありがとう、採用します 895

921 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 14:17:59.24 ID:s3l2ZTMb.net]
ありがとうございます、テンプレート便利ですね。使わせていただきます。900

922 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 14:33:14.26 ID:HFyH6Ayv.net]
あるクラスのメンバ関数のデフォルト引数を同クラスのメンバ変数にすることって可能でしょうか

923 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 14:51:26.37 ID:lu0CYRrt.net]
可能

924 名前:はちみつ餃子 mailto:sage [2022/02/14(月) 14:51:35.72 ID:eI8f6/6+.net]
もっとわかりやすく説明して……。

925 名前:はちみつ餃子 mailto:sage [2022/02/14(月) 14:55:09.41 ID:eI8f6/6+.net]
デフォルト引数をデータメンバにするってのは単にデフォルト引数の値をデータメンバに入れるって意味?
↓ こういうの?

struct foo {
int x;
void bar(int y=1) {
x=y;
}
};

こんな単純なことがわからないとも思えんし、なんか隠れた要件がありそうな気がするんやが

926 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 15:03:33.70 ID:JdXPqUHi.net]
>>912
逆だろ文網

927 名前:デフォルトの名無しさん [2022/02/14(月) 15:13:09.50 ID:9KgBPGkB.net]
>>912
こいつJ民だったの?

928 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 15:13:51.43 ID:M1yCctPq.net]
たぶん
struct S{
int field;
void f(int x=field){...}
};
ってのをやりたいんだろうけどな

あいにくC++のデフォルト引数は関数定義を見ただけで定数に決まるものしか受け付けられない

どうしても同等の処理をしたいならオーバーロードして転送するのが一番楽
void f(){f(field);}

929 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 15:17:25.95 ID:L8LvhIeL.net]
> デフォルト引数は関数定義を見ただけで定数に決まるものしか受け付けられない

そうか?
int func()
{
int a;
std::cin >> a; //絶対に定数になり得ない
return a;
}

void test(int arg = func())
{
}

int main()
{
test(); //OK. もちろん入力待ちをする
}



930 名前:はちみつ餃子 mailto:sage [2022/02/14(月) 15:21:08.20 ID:eI8f6/6+.net]
>>915
デフォルト引数は関数を呼び出すときに補われたかのように動作する。
関数呼出しのたびに評価されるよ。

931 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 15:33:51.02 ID:lu0CYRrt.net]
コードがないし状況不明で困ってる文面にも見えないからアレで十分

932 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 17:52:44.50 ID:m3z01MvF.net]
uniform_int_distributionって本質はIntTypeのペアを持った関数オブジェクトだから毎回生成したところで遅くはないはず

933 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 20:03:27.39 ID:vE8mmwyH.net]
乱数ってだいたい静的になんか持ってるよね

934 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 20:44:52.17 ID:UkhMLhRO.net]
マルチスレッド環境用にジャンプって機能が疑似乱数にあるよな
「疑似乱数 ジャンプ」でぐぐると出てくる

935 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 21:33:11.13 ID:CqI2HZWm.net]
状態持ってるのはエンジンの方
分布ごときにどんな怪獣ブラックボックスのイメージ持ってんだ

936 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 21:37:34.26 ID:zjXK/l5x.net]
エンジン以外に何があんの?

937 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 22:08:14.48 ID:2E5iBc/D.net]
例外処理で、catchした後、どのクラスがthrowしたのかってわかりますか?

938 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 22:35:41.44 ID:jOONNl+N.net]
初心者質問ですみません。
ヘッダで定義したテンプレート特殊化の非推奨属性がヘッダ外で効いてないっぽいんですけど、
ヘッダ外でも非推奨としたい場合何か特殊な事をしないといけないとかありましたっけ?

例えば
.h
```
template <std::integral INT_TYPE>
struct int_auto
{
using type = auto_int_detail<std::is_signed_v<INT_TYPE>, sizeof(INT_TYPE)>::type;
};

template <>
struct [[deprecated("char type is not allowed")]] int_auto<char>
{
using type = auto_int_detail<std::is_signed_v<char>, sizeof(char)>::type;
};

template <std::integral T>
using int_auto_t = int_auto<T>::type;

int_auto_t<char> i_header; // これは非推奨
```

.cpp
```
int_auto_t<char> i_cpp; // これは非推奨じゃない
```


939 名前:ネっています。
MSVC++(v142)で言語標準準拠はstd:c++20です。
[]
[ここ壊れてます]



940 名前:はちみつ餃子 mailto:sage [2022/02/14(月) 22:41:31.68 ID:eI8f6/6+.net]
>>924
それ自体には発生元を特定する情報を持たないけど……。
どういう状況?

・ 例外的な状況から回復する必要があって発生源によって処理の切り替えが要る
・ プログラムの正常系が動くはずなのに何故か出てくる例外の元を特定したい (つまりデバッグ用途)

どちら?

941 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 23:02:44.91 ID:2E5iBc/D.net]
>>926
大学でこういう課題を出されたのですが、全然いい方法がわからないです。
「あるクラスの例外だけをレポートするためにはどのような実装方法があるか」

942 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 23:08:22.30 ID:BDOt87Dq.net]
>>927
ヒント。例外はクラス等なんでも投げられる。そしてクラスは継承できる。

943 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 23:11:22.86 ID:R5SapkSQ.net]
それはどのクラスがthrowした、じゃなくて、どのクラスがthrowされた、の間違いだな

例外 c++で検索すれば答えはすぐ出てくるよ

944 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 23:29:00.15 ID:a+DIA8ij.net]
>>916
>>917
嘘やんと思って試してみたらマジでいけるやんけ知らんかった

インスタンスフィールドまでは触れんかったが

945 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 00:14:19.75 ID:VnfLS+lO.net]
>>928
なるほど。std::exceptionを継承した自作クラスを定義して、
それを投げるというこですね?

946 名前:蟻人間 mailto:sage [2022/02/15(火) 00:23:09.85 ID:vbEMbnXt.net]
throw this;

947 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 14:33:45.24 ID:StNRh9X/.net]
クラスメンバをforで回す方法はありますか?

例えばintのaとdoubleのbという2つのメンバを持つクラスがあったとして、
forループでクラス内のメンバ変数を全部加算したい、など。

イメージはこんな感じです。
double all = 0.0;
for (T member : this->allMember)
{
all += member;
}

948 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 14:55:33.51 ID:aaenmMxg.net]
for で回さないといけないほど多数のメンバー変数がある設計をまず見直すべき

949 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 14:59:14.95 ID:0rNaChGh.net]
リフレクションは無いというのが回答か



950 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 15:15:26.06 ID:AWN50YIA.net]
動的にロードするのでなければ、自分で登録するか、ソースから解析するタイプのリフレクションライブラリを書くか探せばいい

951 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 15:16:41.63 ID:g9Gn9R1H.net]
配列じゃあかんのか

952 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 15:22:08.66 ID:3zKYAjvH.net]
数学のベクトルクラスでも作成してるのかい?

953 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 17:13:44.36 ID:QbgtcDS7.net]
>>933
あるよ。おすすめするわけじゃないけど。
https://www.google.com/search?q=boost+fusion+for_each+struct

こんな奇怪なライブラリ使わなくても済むようにするための言語側サポートはいずれも提案中。先は長い。
P1306 Expansion statements
https://github.com/cplusplus/papers/issues/156
P1240 Scalable Reflection in C++
https://github.com/cplusplus/papers/issues/545

954 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 17:28:44.20 ID:AWN50YIA.net]
じゃあこれもオススメではないがリフレクションベースで
https://www.rttr.org/
を使った例でも...
#include <iostream>
#include <rttr/registration>
using namespace rttr;
struct s{
int m1;
double m2;
};
RTTR_REGISTRATION {
registration::class_<s>("s").constructor<>()
.property("m1", &s::m1)
.property("m2", &s::m2);
}
template<typename T>
double sum(const T& o) {
type t = type::get<s>();
double sum = 0.;
for (auto& prop : t.get_properties()) {
sum += prop.get_value(o).to_double();
}
return sum;
}
int main() {
s o{1,1.1};
std::cout << sum(o) << std::endl;
return 0;
}
// 思いつきで聞いてるだけな気もするけどw

955 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 17:31:44.80 ID:AWN50YIA.net]
ちょっと修正
#include <iostream>
#include <rttr/registration>
using namespace rttr;
struct s{
int m1;
double m2;
};
RTTR_REGISTRATION {
registration::class_<s>("s").constructor<>()
.property("m1", &s::m1)
.property("m2", &s::m2);
}
template<typename T>
double sum(const T& o) {
double sum = 0.;
for (auto& prop : type::get<T>().get_properties()) {
sum += prop.get_value(o).to_double();
}
return sum;
}
int main() {
s o{1,1.1};
std::cout << sum(o) << std::endl;
return 0;
}

956 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 18:59:32.62 ID:bHlhY+TU.net]
std::unique_ptr</*見切れる程長いクラス名*/> looongPtr{ std::make_unique</*見切れる程長いクラス名*/>(/*見切れる程多い引数*/) };
unique_ptrをメンバ変数にするときに最初のとこをautoに出来ないんですか?

957 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 19:17:57.96 ID:9tUnWmYs.net]
make関数使えば?

958 名前:蟻人間 mailto:sage [2022/02/17(木) 19:30:29.28 ID:sNGWbyyl.net]
typedef longlonglongtypename shorttypename;
auto ptr = std::make_unique<shorttypename>...

959 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 20:09:06.95 ID:TNf7BdQD.net]
>>942
できないですね。
https://cor3ntin.github.io/posts/auto_nsdmi/#so-why-are-auto-nsdmi-not-in-the-standard



960 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 20:26:37.89 ID:wIu//gsc.net]
>>942
設計を見直せ

961 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 21:57:39.99 ID:d4bhbZak.net]
単なる○○できますか?に対して設計見直せとだけ言ってくるガイジなんなん
まず質問に答えた上でなら分からんでもないが

962 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 22:12:03.03 ID:wIu//gsc.net]
うるせぇ雑魚が

963 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 23:04:10.74 ID:wrwPyddf.net]
ざーこざーこw

964 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 23:56:12.71 ID:bHlhY+TU.net]
🤔

965 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 00:20:49.11 ID:q/M7jrOo.net]
C++の業務ってことで入ったんだけどC++とは名ばかりのC言語バリバリのコードだった
C++11、いやせめてCじゃなくてC++を書こうとしようぜと思うんだけど世の中こんなんばっかなん?こういうケースほんっとに多くてさぁ
40代↑の人が書いてるC++の言語って大体ほぼCでうんざりする

966 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 00:25:14.77 ID:qZSzRw8s.net]
偏見だけど同名の関数が並んでる以外Cとしてコンパイルできそうなイメージある

967 名前:はちみつ餃子 mailto:sage [2022/02/18(金) 00:25:30.70 ID:fowo2HBL.net]
>>951
なんでそんなことになるんだろうな?
コンパイラを信用してないからか?
ワイは40代以上やけど C++ を使える状況であえて C 的なスタイルで書く気はしないわ。
だって単純に面倒くさいもの。

968 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 00:26:19.39 ID:VWFgwWIW.net]
で、相談は?

969 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 01:20:21.17 ID:x3azmRP7.net]
Cの文法が覚えられる限界なんでしょうな



970 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 02:48:20.56 ID:y/CjghL0.net]
人事部の人がCとC++の見分けがつかなくて
会計上コンパイラ代に「C++」と書いてあったから
C++で募集かけてたんじゃね?

971 名前:ハノン mailto:sage [2022/02/18(金) 03:23:56.08 ID:AKyBDynF.net]
>>953
C++で通らないCは書きたくない、とは思いますね

972 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 13:34:17.22 ID:NqXxszTV.net]
>>951 ←こういう初心者にじゃあすべて作り直していいよ、と言うと何もできない。

無職の妄想からは何も生まれないのだよ。

973 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 14:23:13.29 ID:y/CjghL0.net]
自分は何かできるとでも言いたげだな
すべて作り直すということがどのくらいの工数かわかってないんだろ

974 名前:デフォルトの名無しさん [2022/02/18(金) 15:06:16.89 ID:tL/18rdC.net]
>>958
俺もそう思う

現場の不平不満ばかりの意識高い系エンジニアさん多いよね
その現場を改善するわけでもなく文句いうだけ
高いスキルあるならそんな現場やめれば?
単価150万超えるようなとこなら周りにも高スキルな人がたくさんいるよ?

現場の文句言うだけの奴は結局その現場がお似合いのレベルなんだよ、っていつも思ってる

975 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 15:32:05.24 ID:dD/fDJ+w.net]
>>951
普通の職場ならコーディングスタンダードあるから勝手はできないだろ。

コーダーとライブラリアンで許可されている範囲も違うだろうし。

976 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 15:57:07.65 ID:NqXxszTV.net]
>>955
無職が言いそうなことだ。無能なブロジェクトリーダーはCプロジェクトをあっさりとC++化できる、
存在しないスーパープログラマを探し続けるがそんな奴はどこにもいない。
そんなスーパーPGがいたらATMはバグで止まらない。C++書ける奴はCをバカにしないよ。

977 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 16:33:00.65 ID:xb2lszF9.net]
バグ出たまま放置してるヤツはバカにするけど

978 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 17:01:46.61 ID:1bc1nI/9.net]
正当な理由もなくスマポやSTLを嫌がった結果
生ポインタをガチャガチャいじくり回したスパゲティコード書いて
それが遅くて非効率でバグまみれリークだらけというのは非常によくあるけど
そういうCプログラマ様も敬わなきゃダメ?

979 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 17:04:32.95 ID:y/CjghL0.net]
バイアス満載だな
落ち着けよw



980 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 17:19:05.78 ID:xb2lszF9.net]
そういうどうしょうもないのはヒソカに心の奥でバカにしていいし反面教示にすべし

981 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 18:15:33.32 ID:jeS+/hUn.net]
マ板かここ?

982 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 20:06:32.33 ID:z2RoOtDN.net]
80対20の法則は大事だし、動くコードを作ってから最適化をした方がいいって偉い人も言ってた気がする

リソース管理はとりあえずスマポを使うのが吉だと思ってます

983 名前:デフォルトの名無しさん [2022/02/18(金) 20:12:42.95 ID:N0FOn5a0.net]
自分で責任もって結合テストする覚悟があるんならいくらでもCからC++に置き換えていいと思うよ

984 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 20:34:30.32 ID:y/CjghL0.net]
とテストの基本がわかってないやつが言う
C++に動的な型宣言はないからな

985 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 20:38:01.63 ID:NqXxszTV.net]
効率ガーと言うが、CをC++に書き換えて高速化、省メモリ化するなんてむしろレアケース。

986 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 20:44:21.03 ID:y/CjghL0.net]
C++の隠れたコードが何をしてるか解ってないやつが
C++にしたら高速化した低速化したって言語のせいにするんだよ

987 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 21:35:17.98 ID:UZsjZs7N.net]
こういうとき悲しいのはね
CもC++もたいして知りもしねえド素人のアマチュアが
想像と思い込みでもっていろいろレスつけてくること
噴飯ものだぞ?

988 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 23:03:13.88 ID:k8EYArXJ.net]
c++書いてたとき何ちゃらストリームやらのファイル操作遅すぎてムリすぎて結局fopen使ったような…
まあ便利は便利なんだけど利便さ求めるならそもそもpythonとかに逃げますし
C++17未満?だとfilesystem使えなくてこんな簡単なことも出来ないのかと絶望した気もする

989 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 23:08:29.98 ID:qZSzRw8s.net]
std::endlがフラッシュ兼ねてるのを知らずに使うとクソ遅くなる



990 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 00:57:04.84 ID:kSnJ/KwP.net]
初心者にC++は早い
C++は人類に対する挑戦

991 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 01:05:13.77 ID:Sb0QDKc0.net]
みんな最初は初心者

992 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 01:28:32.55 ID:MLwzxLgZ.net]
Appleのcopland、Googleのandroid、MSのEdgeの失敗を見れば
予算と開発期間が十分にあれば解決すると思ってるならそれは間違いだと理解するだろう。
生ポインタをこねくり回す程度で脳みそのキャパが越えてるようじゃC++使ってもまともな実装なんてできない。
隠れたコードも何もC、C++はアセンブラの知識は必須だ。バイナリを読めるようになってから文句言え。

993 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 03:09:27.37 ID:kSnJ/KwP.net]
フムフムアセンブラが必須か…
https://godbolt.org/z/jq16j83We
#include<vector>
using namespace std;
void f(char* dst, const char* src_start, const char* src_end) {
const char*s = src_start;
char*p = dst;
while (s != src_end) *p++ = *s++;
}
template<typename Dst, typename Src>
void f2(Dst dst, Src src_start, Src src_end) {
auto s = src_start;
auto p = dst;
while (s != src_end) *p++ = *s++;
}
void hoge() {
vector<char> dst(1024), src(1024);
f(dst.data(), src.data(), src.data() + src.size());
f2(src.begin(), dst.begin(), dst.end());
}
これってどうしてhoge側だとSIMD使わないの?
C++コードでSIMD使わせるにはどうしたらいい?

994 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 04:43:40.93 ID:2+bZAOZm.net]
valarray

995 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 04:46:13.97 ID:kSnJ/KwP.net]
不正解

996 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 06:01:38.84 ID:2+bZAOZm.net]
hoge側でどうSIMD使えって言いたいの?
inlineとかだったらしばくぞ

997 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 06:20:48.76 ID:ZqDn11YK.net]
イントリンシック、でしょう?

998 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 08:45:24.25 ID:0ANF/iVA.net]
Intelのコンパイラに任せ

999 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 09:52:14.21 ID:kSnJ/KwP.net]
1024 -> 1024 * 16にすると...



1000 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 09:57:47.91 ID:kSnJ/KwP.net]
intrinsicは(inline)assemblerとほぼ同じなので、C#でしか使ったことないな

1001 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 10:03:29.25 ID:mDQ0X8WX.net]
アセンブラなどの理解は「低レイヤを知りたい人向けのCコンパイラ作成入門」が結構勉強になったんですが、バイナリは何で勉強すればいいですかね?

1002 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 10:34:54.00 ID:0ANF/iVA.net]
>>985
キャッシュメモリのアレで遅くなるやつか?

1003 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 10:44:00.07 ID:kSnJ/KwP.net]
さぁ?・・・callしたり判定用コードやサイズ計算とかオーバーヘッドがあるからじゃね?知らんw

1004 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 11:57:14.27 ID:kSnJ/KwP.net]
次スレ立ててきた
C++相談室 part159
https://mevius.5ch.net/test/read.cgi/tech/1645239402/

1005 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 12:08:36.38 ID:2h4SA+VW.net]
CADソフトCANDYの作者の発言。
>数年前に,私の会社で組み込み機器向けのプロジェクトで,C++コンパイラが安定して動かないので
>Cでプログラムを書くように私が指示したケースがあったのだが,
>何人かのエンジニアが「今さらCなんかでプログラムを書けませんよ。
>クラスを使えなければスパゲッティコードになってしまいます」と猛反対をしてきた。
■ 第4回 オブジェクト指向の本質
https://gihyo.jp/lifestyle/serial/01/software_is_beautiful/0004

別のインタビューと補完すると、そのときC++の標準ライブラリ的なブツを著者が
C言語でババーっと書いて仕事させたという話だったはず(記憶モード

ちょっどこの昭和カヨ?!

1006 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 12:18:20.98 ID:kSnJ/KwP.net]
組み込み機器用のCPUって特殊なんで、コンパイラが安定しないなんてよくある話
オブジェクト指向のメリットの本質についての話なので、可能/不可能が実装言語に依存しないというのもよくある話(楽かどうかは別)
別に昭和でも平成でも令和でも変わってないけど、>>991に伝わってないのは確か

1007 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 12:50:13.00 ID:gFosEVVi.net]
GTKのGObjectはCでオブジェクト指向を実現している訳だけど
(ただし学習コストが低いとは言えないと思う)

1008 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 12:53:15.56 ID:2h4SA+VW.net]
そんなん言ったらX Window SystemもC言語でオブジェクト指向しているらしい
らしい(伝聞

1009 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:05:47.37 ID:x/upE6G9.net]
当たり前だけどアセンブラでもオブジェクト指向はできるし還暦の爺さん(とは言ってもなかなかの人ではある)が10年以上前に書いた記事だしまじで何を言いたいのかよくわからん



1010 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:20:12.26 ID:kSnJ/KwP.net]
分からん分からん言うのは誰でも出来るし、どんな初心者でも何に対してもそう言える
なので、具体的に分からん部分を指摘できない人は初心者か、荒らしだと思ってる

1011 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:22:03.79 ID:kSnJ/KwP.net]
athenaくらいつかったことあるよね

1012 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:28:47.19 ID:2h4SA+VW.net]
>当たり前だけどアセンブラでもオブジェクト指向はできるし
ちょっカプセル化(シンボルの隠蔽)にやや手間がかかるし
オブジェクトをスタックにのコピーして返すのにもさらに手間がかかるし、
コンストラやデストラの呼び出しの保証や継承関係のチェックについて処理系のサポートが一切無いし、
やんけ;;;
そういうオブジェクト指向のプログラミングパラダイムにおいて裏で当然働くべき処理が
プログラマーが手間をかけ注意を振り向け続けないと実現されないというのはオブジェクト指向しているうちに入らないのでは……

1013 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:31:35.88 ID:6TS2kFRN.net]
brainfuckでもオブジェクト指向でプログラミングできるんやで

1014 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:31:55.84 ID:6TS2kFRN.net]
>>1000なら次スレでちんこ貼る

1015 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 95日 18時間 42分 38秒

1016 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<275KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef