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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2020/07/13(月) 13:51:48.09 ID:WBkWHxcT.net]
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

700 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:37:06.08 ID:u7NjNSbC.net]
>>674
2048 * 2048 ドットの画像だとベタデータにしたとき16MBになってしまうので、
それを沢山読み込むとメモリー不足になり仮想記憶が働いてしまっている可能性も
有るかも知れない。どれくらいの枚数読んでいるか知らないのでなんとも
言えないけど。

701 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:39:54.17 ID:u7NjNSbC.net]
>>677
使ってるのはVisualStudioのようだけど、速度を測定する時には、ちゃんと
Release版にして最適化は有効にしてる?
DebugPrintを使っているなら最適化はOFFになってるのでは?

702 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:43:34.12 ID:0cli3R6k.net]
>>678
でも>>677の修正で速度が劇的に変化するのはなんでなんだろう?
>>679
Releaseで調べてるよ。OutputDebugStringはReleaseモードでも使えるので。

703 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:46:30.17 ID:0cli3R6k.net]
>>677の修正をしたあと、>>636のダミーコードを
追加したらなんと今度は遅くなったwwなんでだ?w

>>636のダミーコードだけ追加したら速くなって
ダミーコードを削除すると遅くなる
その遅くなった状態で>>677の修正をすると速くなる
その速くなった状態で>>636のダミーコードを入れると
今度は遅くなるww

704 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 02:43:12.80 ID:qV+SOSDm.net]
状況から察するに、おそらく君が見ている部分じゃない
どこかに根本的な問題がある、という気がする
なんとなくだけど、バッファオーバラン系のような気がする

705 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 05:25:14.56 ID:Vf/GSwOl.net]
>>682
どこかに問題がありそうですよね。
バッファオーバラン系は問題あっても動いてしまう事があるから怖いですね。
地道に調べて行くことにします。

706 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 11:47:32.64 ID:V9b4VlmB.net]
それより、12秒間も大量のメモリーを使う状態でCPUがフル

707 名前:パワー状態になっている
とすれば、フル・キャッシュ汚染してる可能性がある。
フル・キャッシュ汚染すると、その後しばらくの間、キャッシュを取り戻すために
速度が不安定になるから、説明可能。
[]
[ここ壊れてます]

708 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 12:52:21.01 ID:cPrICHbO.net]
Meltdowm や Spector 対策のパッチの影響とか?
特定のパターンのメモリアクセスに対して例えばなんかのトラップが働いてキャッシュをクリアし、ダミーコード入れるとそのパターンが崩れてそういう処理が入らないとか。



709 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 02:54:54.42 ID:XgRH6ChF.net]
>>684-685
みなさんありがとうございます。
色々な問題が考えられそうですね。参考になります。
もう少しコード弄りながら挙動を調べて行きたいと思います。

710 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 04:32:07.96 ID:v8E9sca8.net]
>>686
なお、y方向に関して、メモリーを上下逆さまに読んでいっているところがあるが、
本当はそういうのはDDR-Memoryやキャッシュと余り相性が良くない。
しょうがないけれども。
それでも、x方向には「順方向」に読んでいるからまだなんとかなっている。
完全にメモリーを逆方向に読んだりすると、低速化の原因になる。
この場合には難しいが、なるべくならメモリーは順方向にアクセスした方が
速くなる。DDR-MemoryはBurst転送が基本なので。
キャッシュに乗っていれば、逆方向でもなんとかなるが、キャッシュから
外れると、DDR-MemoryのBurst転送とは逆方向にアクセスするのは
速度低下の原因になる可能性が出てくる。絶対ではないが。

711 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 10:42:03.12 ID:XgRH6ChF.net]
>>687
そういう問題もあるんですね。とても詳しくて勉強になります。
ありがとうございます!

712 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 11:32:29.48 ID:oswWyFbg.net]
>>687
読み書き方向が逆になるなら、読む方を順方向にすると良さそうだと思うけどどう思う?

713 名前:デフォルトの名無しさん [2021/04/28(水) 13:14:16.90 ID:WdoV9Bq9.net]
>>689
コンパイラのくせに生意気だぞ

714 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 13:16:59.82 ID:jQpDsyge.net]
>>689
実は昨日の夜から、俺もそう思ってた。
今は、
読む方が逆方向で、書く方が順方向になってしまっているが
読む方を順方向に、書く方を逆方向にした方が DDR-SDRAM や キャッシュの
仕組みから行って速くなる可能性が高い。

715 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 14:04:09.00 ID:4fcF+gv5.net]
Windows の bitmap で ファイル中の配置や CreateDIBSection() で戻ってくるメモリの配置だな
デフォで bottom - up の方向 カメラのフレームとかは top - down な方向

ん?メモリ操作なコードだけど実はメモリマップドファイルだったりして

716 名前:デフォルトの名無しさん [2021/04/28(水) 15:30:36.23 ID:WdoV9Bq9.net]
走査線と描画が重なったらチラツキが激しくなるから下から描いていくんだよ

717 名前:デフォルトの名無しさん [2021/06/14(月) 15:32:51.34 ID:TE2ntQhj.net]
for(int a=0; ...; ...){...} とかはループ内だけのスコープで int a が使えるのに

int a;
while(a){...}
とか
int a;
do{...}while(a);
とかは
while(int a=...){...} ←これだけはOK?
とか
do{...}while(int a=...);
とか
do{int a; ...}while(a);
みたいに書けないのはなぜ?

718 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 15:40:36.46 ID:peg/OyGg.net]
do{...}while(int a=...);  宣言より前に変数を使用する
do{int a; ...}while(a);  スコープの外に変数を持ち出す



719 名前:はちみつ餃子 mailto:sage [2021/06/14(月) 17:56:57.54 ID:fvxG9/iR.net]
>>694
C/C++ の理屈では波括弧の部分は繰り返しの構文 (do や while) の一部ではない。
たとえば while の文法は
while ( expression ) statement
というように定義されていて、 statement ってのは要するに文をひとつ書けるってことね。
で、 statement として複文 (波括弧によって複数の文をひとつにまとめたブロック) もありうるってことになってる。
そんでもってブロックの先頭で宣言された変数のスコープに関するルールはブロックのほうに書かれていて、
繰り返しの構文のときだけ特別扱いということは出来んのだわ。

> while(int a=...){...} ←これだけはOK?

これは C++ では良いけど C では駄目

720 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 18:58:23.47 ID:HtMoZ8Hn.net]
小さいスコープの中だけで使う自動変数だってんで
特に if や for 等なく いきなりカラス括弧開いて変数宣言することがままある

721 名前:デフォルトの名無しさん [2021/06/14(月) 21:48:16.36 ID:OzvaLd6A.net]
C++ってOSレイヤで差異が有るファイルシステムの事を考慮せずにプログラムを書ける済む仕組みって組み込まれてるの?

722 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 21:53:52.73 ID:VOy4fGQR.net]
標準ライブラリに含まれるファイルシステムライブラリでできる範囲の操作なら差異は出にくいと思うけど

723 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 22:00:33.63 ID:eQ9/Z+Eb.net]
>>694,696
C++でもwhileの判定式中の宣言は毎回新しくなるんで、使いみち思いつかん。
while(int i=10) { i--; } は、無限ループになる。

できるとしたら、処理が終わったらすぐに始末したいobjに対して、
{ myclass obj(); while(obj) { obj.some_op(); } }
(obj は operator bool() とか実装してる前提)
が、
while(auto obj = myclass()) { obj.some_op(); }
こんな風にかけてちょっと{}がスッキリするくらい?(実際はobjが毎度構築される)

724 名前:デフォルトの名無しさん [2021/06/14(月) 23:04:55.36 ID:wv1U8ajF.net]
カラス括弧!
初めて見た!

725 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 08:13:38.32 ID:4rRZmg7L.net]
>>700
まあ while(...){} は for(; ...;){} で書けるしメリットないかな
ただ
do{ int a = …; }while(a); の方は書けたら嬉しいな
使用頻度は低いけど

726 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 10:57:08.11 ID:5dh+WKsO.net]
do は do .. while(0) のパターンしか使わないな。

727 名前:デフォルトの名無しさん mailto:sage [2021/06/17(木) 23:23:03.28 ID:Gx3mnqFH.net]
break用なら switch(0)default:{...} っしょ?

728 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 08:43:02.57 ID:R4m5mk7U.net]
それdoよりどういうメリットある?
わざわざdefault:書かないとならないしインデント深くなりそうだし。



729 名前:デフォルトの名無しさん [2021/06/18(金) 11:21:27.64 ID:FZUuAAIq.net]
マクロで展開するならインデントは無視できる

730 名前:デフォルトの名無しさん [2021/06/18(金) 11:50:10.76 ID:7Huy+AZL.net]
do{}while(0) は最後に ; 書く前提だし矛盾ないけど
switch(0)default:{...} は ; の扱いの困らない?

731 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 11:55:35.37 ID:AVf6Ht59.net]
for (int i = 0; i < 1; i++)

732 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 12:32:57.03 ID:6AzE04jr.net]
{ } 内スコープからの脱出で break; 使いたいってのと
マクロで見た目関数向けな #define foo(arg) do { なんちゃらかんちゃら } while(0)

do { } while(0) は両立できるけど switch(0)default:{} で後者は怪しげ

if (<condition>) foo(arg); else <elsecase>; とかが

733 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 13:25:48.49 ID:7Huy+AZL.net]
while(1){
...
break; // } の直前
}
で良いと思う

734 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 14:27:23.16 ID:tn5JYHw4.net]
それどういう意図があんの?
処理は結局1回
スコープだけじゃダメなん?

735 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 14:44:41.04 ID:tzOvIsZE.net]
>>710
お前が良いと思うなら使えばいいと思うが俺には無駄なbreakが必要なのはダ

736 名前:Tいと思うから do { ... } while(0); にするわ []
[ここ壊れてます]

737 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 20:29:59.97 ID:R4m5mk7U.net]
>>706
マクロはフォーマッタでの扱いが定まらんから制御構造では使いたくないのよな。
セミコロンで終端しておかないとインデントがおかしくなるとか、後続に開きブレースを置くと
やっぱりインデントが変になるとか。

738 名前:デフォルトの名無しさん [2021/06/19(土) 12:53:56.96 ID:EDF+B3Dq.net]
#define breakblock switch(0)defalut:
でいいやん
できないとか怪しげとか意味不明
マクロ化する必然性がそもそもわかんないけど



739 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 13:08:34.87 ID:AhXAE8oj.net]
そこまでして switch(0) 使う理由がよくわからん。
do while(0) と比べてどういうところが良いの?

740 名前:デフォルトの名無しさん [2021/06/19(土) 13:21:09.67 ID:ylfkd6bV.net]
マクロの例でもわかるように波括弧を単独で使える
変な処理が始まってんの一目瞭然
continueもgotoで(goto使わない別ルーチン探せよw

#define breakblock(a) uniqelonglongprefix##a:switch(0)default:
#define bbcontinue(a) goto uniqlonglongprefix##a

741 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 14:04:38.18 ID:AhXAE8oj.net]
>マクロの例でもわかるように波括弧を単独で使える

ようは末尾に while(0); を書かなきゃならないのが嫌ってことかな。
わからんでもないが、自分はマクロや default: より気にならないからいいや。

742 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 16:30:22.52 ID:8gjebq3e.net]
#define foo(arg) switch(0)default:{ なんとかかんとか }

これはキモイ

743 名前:デフォルトの名無しさん [2021/06/20(日) 18:26:02.94 ID:3hmKhJNO.net]
でもその構文はdefineで置き換え前提で使ってるとしか思えない

744 名前:デフォルトの名無しさん mailto:sage [2021/06/20(日) 19:15:11.97 ID:XoXh1cqB.net]
goto書くと死んじゃう人は大変だなぁ
Dijkstraもそこまでは言ってないらしいぞ

745 名前:デフォルトの名無しさん mailto:sage [2021/06/20(日) 22:56:11.58 ID:R7oo70Ox.net]
ナンチャラカンチャラの人のdefine使用意図が無意味すぎてどうもc言語エアプなんじゃないかと疑う

746 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 16:42:57.66 ID:iJjBc6fp.net]
switchのやつは最後にbreakかfall throughってコメント書いとかないと文句言うチェッカとかありそう

747 名前:デフォルトの名無しさん mailto:sage [2021/06/29(火) 11:07:55.25 ID:HA4DrIsJ.net]
do {
int a;
:
} while(a);



for(int a;;) {
:
if(!a) break;
}

でいいんじゃない?

748 名前:デフォルトの名無しさん mailto:sage [2021/07/05(月) 16:13:31.07 ID:3/iVgePD.net]
別のところで質問したのですが、初心者歓迎スレのほうがいいと思いこちらで質問し直します。

Macのclang++でコンパイルしています。
cstdlibをインクルードしなくてもrand()が使えてしまうのですが、これはなぜでしょうか?



749 名前:デフォルトの名無しさん mailto:sage [2021/07/06(火) 01:49:57.37 ID:w3zU8vH7.net]
>>724
手元のM1のでやったら普通にエラーになるけど?
printf("%d",rand());
だけ書いたやつ。

clangでもデフォはエラーだったような。C言語の方はコンパイルオプションで通せる。暗黙の関数宣言。

すまん、役に立てなくて。

750 名前:はちみつ餃子 mailto:sage [2021/07/06(火) 05:58:16.49 ID:kwaneL8R.net]
>>724
ヘッダファイルが他のヘッダファイルを内部で include している場合は有りうる。
たとえば iostream を include したら自動的に ios や istream なども include されることは保証された動作。
ただ、 cstdlib を (間接的に) include すると仕様で明言している標準ヘッダはないと思うので
rand がどこかで勝手に宣言されているのだとしたら処理系の固有の動作だと思う。

-M オプションで (間接的に include されているものも含めて) 依存関係があるヘッダファイルを
抽出できるからそれで確認できるよ。

751 名前:724 mailto:sage [2021/07/06(火) 08:23:42. ]
[ここ壊れてます]

752 名前:24 ID:9fUGxcs8.net mailto: >>725
ありがとうございます。M1のclangではエラーが返るのですか…。コンパイラのバージョンの問題ですかね?
>>726
ありがとうございます。-M試してみました。
インクルードはiostreamだけにしていたのですが、ぞろぞろヘッダーファイル出てきまして、その中にcstdlibもstdlib.hもありました。
iostreamのインクルードを外すと当たり前でしょうが、それらのヘッダーファイルは表示されなくなりました。
つまり、iostream以下のヘッダファイルの依存関係にcstdlibがいたということですよね?
これは処理系依存なのでしょうか?
[]
[ここ壊れてます]

753 名前:はちみつ餃子 mailto:sage [2021/07/06(火) 08:56:08.30 ID:kwaneL8R.net]
>>727
処理系依存だと思う。
iostream が暗黙に include すると仕様に明記しているのは
ios, streambuf, istream, ostream の 4 つ。
https://timsong-cpp.github.io/cppwp/n3337/iostream.objects.overview

あえていうなら cstdio の機能と結び付けるのが役割であるようにほのめかされている
ので普通の実装なら cstdio も include することになると考えてもいいと思うけど、
それ以上のことについてはっきりしたことは書かれてない。

rand が必要なら (たとえ実態として間接的に cstdlib が include されていても)
プログラマは明示的に cstdlib を include するほうがいい。

というか、そもそも論としてはいまどき rand を使うのは避けるほうが賢明な考えだと思うけどね。

754 名前:724 mailto:sage [2021/07/07(水) 08:49:49.95 ID:O+5oUfAp.net]
>>728
なるほど、そもそも論まで含めてよくわかりました!
ありがとうございました!

755 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 19:37:14.99 ID:We+HIKc2.net]
C言語にpthreadを使ってマルチスレッドにするときの初歩的な質問をしたいのですが、
大域変数を複数のスレッドが読み書きする部分はミューテックスでロックしないとマズい、という
説明はわかった気がします。
では読むだけの部分はどうでしょうか。単にスレッドが変数の値を読みに行った瞬間の値を
知りたいだけならば、別にロックはしなくても害はないような気もしますが.... プログラム内の
別の箇所で書き込む部分はロックして、おかしなことが起こらないようにするとして。
それとも読むだけの場合もロック(書き込む場合に使うじミューテックスでロック)は必要でしょうか。

756 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 19:46:28.14 ID:TIX9j1Dy.net]
必要ないぞ

757 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 21:27:55.69 ID:wrMb4YqN.net]
必要だぞ

758 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 21:31:49.00 ID:RRTM5Oms.net]
>>730
スレッド実行中に書き換わる可能性があるなら必要。
変数を読むといってもCPUは一度内部のレジスタに読み込まないと処理できないので、
スレッド1でレジスタに読み込む→スレッド2で変数を書き換える→スレッド1に結果が反映されない
という事態が発生する可能性がある。



759 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 22:32:02.32 ID:eGF9BJZ0.net]
>>733
それ反映する必要ないだろ
単にスレッド1が先に読んだだけだし
それより読み書きがアトミックでないなら読み出し時にも排他しないと書き換え中の変な値を読んじゃうかと

760 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 01:06:02.19 ID:iVyIfxP9.net]
書き換え後に古い値を取得してもええの?

761 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 04:35:16.68 ID:jD2ZKaD3.net]
ええ場合もある
「単にスレッドが変数の値を読みに行った瞬間の値を知りたいだけ」はそれでええ場合のように聞こえるな

762 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 05:28:04.15 ID:TJHT9gxK.net]
ええ場合も何も読んだ後で書き換えられたのをどうやって反映させるつもりなんだよ…

763 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 05:33:10.76 ID:Tru2G6zE.net]
関連する操作すべてを優先順付きキュー経由にし
巻き戻し必要な操作にはジャーナル機能も入れ
やり直し再キューすんのよ

764 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 05:36:14.97 ID:N1Z7W ]
[ここ壊れてます]

765 名前:Bqy.net mailto: 別スレッドからflgをいじって停止できるように

while (flg) {...}

と書いても、{...}の内部でflgをいじってないなら、
最適化で単なる無限ループに書き換えられて、flg変えても止まらない、
みたいな話なかったっけ。
[]
[ここ壊れてます]

766 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 06:47:09.06 ID:TJHT9gxK.net]
>>739
それはまた違う話
volatile c言語 とかでぐぐれ

767 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 07:11:18.51 ID:JKFXuD7+.net]
スレッドAが 16bit長の整数を書き換える
スレッドBが 同じ16bit長の整数を読み込もうとしたとき
8bit長でしかアトミックな操作が保証されてないシステムだと

初期状態 0x0000 で スレッドA が 0xFFFF と書き換える

 A書き込み 上位FF
  (スイッチ)
B読み込み 上位FF
B読み込み 下位00
  (スイッチ)
 A書き込み 下位FF

こういうことが起き得るという話でいいんかな

768 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:27:22.56 ID:N9R+gZBb.net]
>>734
いや、先に読んだだけっていっても、例えば
i f (v==1)
みたいな条件式を評価した段階では1だったけど、その先で急に2に変わった、とかだったらまずいだろw



769 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:34:33.02 ID:EesV0O7a.net]
質問者の文言が

>単にスレッドが変数の値を読みに行った瞬間の値を知りたいだけ

>読みに行った瞬間の値を知りたいだけ

なので必要なし
以上

770 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:39:13.41 ID:fOJ6OsHP.net]
>>742
何もまずくないだろ…

771 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:48:41.36 ID:N9R+gZBb.net]
>>744
ifの中ではもう一度vの値を読んだときには2になってたりするわけよ
vが1の前提で書いたコードの中に2を突っ込んだらまずいよ

772 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 09:11:07.28 ID:16vz6VAu.net]
>もう一度vの値を読んだとき

まずいのはこっちであって>>742のifや>>733自体は問題ないんでは。

773 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 09:15:23.13 ID:nctQkkF+.net]
質問者が言ってないことに加えて勝手に仮定を追加してまずいとか言ってる>>745はもう黙ってほしい

774 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 09:51:11.89 ID:6bm+w6Lu.net]
まずいのは>>745の頭だったというオチw

775 名前:はちみつ餃子 mailto:sage [2021/07/10(土) 09:56:52.21 ID:11oc3t46.net]
>>730
結論から言うとロックは必要。
同一のメモリに対するアクセスの少なくとも一方が書き込みである場合には衝突すると定義されている。
https://timsong-cpp.github.io/cppwp/n3337/intro.multithread#4
その場合にはデータ競合が発生する。
https://timsong-cpp.github.io/cppwp/n3337/intro.multithread#21

同時に起こりうるアクセスの内でひとつでも書き込みが存在したらそれはデータ競合の可能性があるってこと。

ミューテックスはミューテックスの所有権を取り合うことで競合を阻止する仕組み。
ロックというのは「ミューテックスをロックする (ロックしている間は自分がミューテックスの所有権を持っている)」
ということであって、対象となるデータそのもののアクセスを直接的に制御してるわけじゃないので、
書き込み側でロックするだけでは意味がない。

776 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 10:17:52.46 ID:fOJ6OsHP.net]
>>749
at least one of which is not atomic
の意味ぐらいは理解してからレスしなよ

777 名前:デフォルトの名無しさん mailto:sage [2021/07/12(月) 08:43:59.78 ID:Y3qBMERg.net]
>>749
質問者は衝突しても問題ないケースで排他は必要かどうかを聞きたいんだろ

778 名前:デフォルトの名無しさん mailto:sage [2021/07/12(月) 12:14:53.15 ID:uJpO0uZ2.net]
「衝突しても問題ない」&atomicも使わない=「データ競合となっても問題ない」=「動作が未定義でも問題ない」なら
確かにロックは不要だけど。



779 名前:730 mailto:sage [2021/07/12(月) 15:19:59.68 ID:VxiBn2TN.net]
730です、どうもお騒が

780 名前:ウせしております。
どうやら読み出しだけのときも基本的にはミューテックスを使うべきのようですね。

私の場合は域変数をカウンタとして使っていてその値をログ出力する、というような状況で、
なんとなくミューテックなしでもいいかと思ったのですが、ミューテックスを使わない場合は
気持ち悪い値がプリントされている感じですかね。
一般的な状況では、ミューテックスを使わなくても実害がないかを考えるよりはちゃんと
ミューテックスを使った方がよさそうですね...
[]
[ここ壊れてます]

781 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 17:41:58.36 ID:DZW75fJj.net]
「今値を書いてるから 書き終わるまで待て」と待たす相手は
次にそこへ書き込むヤツだけじゃなく
そこを読込もうとしたヤツも対象にしとけば ちゃんと書き終わった値が読込める
中途半端に書いてる最中であっても意図的に抜き出したいのなら 書き終わるまで待たずに読む

そしてみゅーてっくすの激しい握り合い

782 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 19:15:08.97 ID:Cs3wNevb.net]
>>753
単純なカウンタみたいなアトミックに読み書きできるような変数なら排他は不要だよ

783 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 20:10:22.43 ID:+UxqO86S.net]
>>755 なんでそんな嘘を教えようとするの?

784 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 20:55:03.74 ID:Cs3wNevb.net]
>>756
>>749のリンク先読めばわかると思うけど競合が発生して結果が未定義になるのは
> at least one of which is not atomic
のケースね

785 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 21:33:13.25 ID:+UxqO86S.net]
>>757
そこで言ってる "atomic" の意味は std::atomic<int> ならOKで int はダメという話なんだけど、
「単純なカウンタみたいなアトミックに読み書きできるような変数」って言い換えちゃったらどっちもOKに読めちゃうでしょ。

786 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 21:39:13.87 ID:Cs3wNevb.net]
>>758
intがダメなのは>>741みたいなケースね
> 「単純なカウンタみたいなアトミックに読み書きできるような変数」
でだめだと言うなら実例教えて

787 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 22:40:14.76 ID:31Jksjnm.net]
単純なカウンタがアトミックに読み書きできるかは
基本型の宣言だけではわからんから
アトミック化の指示ができるならやっとけ ということでいいんでないの?

788 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 22:49:59.37 ID:Cs3wNevb.net]
>>760
そのスタンスでいいと思うよ
俺はアトミックに読み書きできるケースなのに嘘とか言ってる>>756がなんか特殊なケースを知ってるのかな?って思ってるだけ



789 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 23:59:32.08 ID:31Jksjnm.net]
指示ができない場合にはアトミックに操作できる保証なんてないから
排他したほうがいいぜって立場

790 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 00:44:44.53 ID:pCGEFvrX.net]
>>759
生の int に複数スレッドから排他なしでアクセスしてたらその時点で未定義動作=ダメなんだってば。
未定義動作となる場合に必ず期待に反するコードが生成されるわけでもないんで、実例を出せというのも意味が無い。
(実例が無いからといって「敢えて」未定義動作に誘導するというのは意味が無いどころか有害。)

・・・スレッドサニタイザで引っかかってウザい、とか言えば「実例」として納得してくれるの?

791 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 01:04:57.94 ID:b90ql0x3.net]
生のintへのアクセスがアトミックに行えるかって処理系が保証したりしないのけ

792 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 05:39:14.15 ID:dtsN+T48.net]
https://stackoverflow.com/questions/35226128/are-c-c-fundamental-types-atomic

793 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 06:51:23.81 ID:3FmZNcD6.net]
>>764
保証してる処理系なら std::atomic<int> でオーバーヘッドは生じない、つまり排他は要らんってことでしょ
>>756がなんか実例知ってるかと思ってたけど単なる規格厨だったなw

794 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 12:49:26.09 ID:pCGEFvrX.net]
>>766
オーバーヘッドが生じるかどうかで考えてるなら(それもおかしいんだけど)、こんな例を見れば考えを改めてくれたり

795 名前:するの?
https://godbolt.org/z/6oM5oevsY
#include <atomic>
int load(std::atomic<int> const& x) { return x; }
int load(int const& x) { return x; }

↓ARM64 gcc 11.1 -O2
load(std::atomic<int> const&):
&nbsp; ldar w0, [x0]
&nbsp; ret
load(int const&):
&nbsp; ldr w0, [x0]
&nbsp; ret
[]
[ここ壊れてます]

796 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 18:54:32.14 ID:VBWUb4q7.net]
>>767
それメモリーバリアの話で排他の話じゃないけど、何を言いたいの?w

797 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 19:20:02.20 ID:pCGEFvrX.net]
>>768
766 が「オーバーヘッドは生じない」ならば「排他は要らん」という論理らしいので
「オーバーヘッドは生じない」を否定すれば「排他は要らん」とかいう嘘を言わなくなってくれるかなと思って書いてみた。
オーバヘッドの発生と排他の要・不要とが 766 の頭の中でどう繋がってるのかは知らない。

798 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 19:25:42.08 ID:VBWUb4q7.net]
>>769
まあメモリーバリアも一種のオーバーヘッドと言えなくもないがそういう話でないことぐらいはわかりそうなもんだけどねw
で、排他が必要な例は見つかったの?



799 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 20:14:07.80 ID:pCGEFvrX.net]
>>770
ごめんよ。元から意味が分からなかったところ「オーバーヘッド」の意味が何か文字通りの意味じゃなかった
みたいだし、もうどういう話なのかさっぱりだわ。
767 の「オーバーヘッド」が何を指すのか、それと排他の要・不要との繋がりがわかるようだったら解説よろしく。

「排他が必要な例」と言われても、こっちとしては複数スレッドで生の int を読み書きするなら
常に排他が必要という認識なんで文字通り「排他が必要な例」なら無数にあるんだよね。
そういうのを挙げても謎理論で「不要だろ」とか「コレジャナイ」って言うだけで話は進まなさそう。

ここまでの流れを読めば >>755 をうっかり信じちゃう人もいないだろうし、もう放置でいいかなという気になってる。

800 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 20:22:20.00 ID:cMMfM4oH.net]
>>771
あえて指摘しなかったけどstd::atomicでは既定のメモリーオーダーがseq_cstであることを知らんのか?
自分で「あんたの言うオーバーヘッド」かかる書き方してオーバーヘッドかかるから排他ガーとか意味不明なんですけど?w
そもそもstd::atomicは必ず排他かかるわけでもないし人を嘘つき呼ばわりするならもう少し勉強した方が恥をかかなくて済むと思うよ

801 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 20:35:16.14 ID:pCGEFvrX.net]
>>772
ごめんそれは知ってるよ。でもそれを知ってる知識レベルの人が >755 のような主張をしてるとは思わなかったんだ。
あと繰り返しだけど「オーバーヘッドかかるから排他ガー」とか言ってるのは >766 だけね。意味不明なのには同意する。
「std::atomicは必ず排他かかるわけでもない」は正しいけど、それと >755 が嘘であることに関係は無い。

802 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 22:17:32.53 ID:cMMfM4oH.net]
>>773
> ごめんそれは知ってるよ。
えっ?
知ってて>>767ってそれこそ意味不明なんですけどw
結局何を言いたかったの?

> あと繰り返しだけど「オーバーヘッドかかるから排他ガー」とか言ってるのは >766 だけね。
ああマジで日本語の理解力がないのね
(もちろん環境によるけど)std::atomic使っても生のintと同じようにアクセスできる = 排他なんてしてない
って話ね
念の為に言っておくけど>>764が言うようなハード上の排他制御は別の話ね

> 意味不明なのには同意する。
同意なんていらんから>>767を書いた意味を説明してよ

> 「std::atomicは必ず排他かかるわけでもない」は正しいけど、それと >755 が嘘であることに関係は無い。
嘘だと言うなら根拠を示したほうが良いと思うよ
まあ示せないからグダグダ言うとか関係の無いメモリーオーダーの話とかにそらそうとしてるんだろうけど…

803 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 23:08:12.27 ID:pCGEFvrX.net]
>>774
「767を書いた意味」なら>>769で説明した。

「環境によるけど)std::atomic使っても生のintと同じようにアクセスできる = 排他なんてしてない」これは正しい。
でもそれは生の int でデータ競合を避けられる理由にはならない。
>>755 が嘘だという根拠は >>749 に挙げられた規定による。その条件
"at least one of which is not atomic" について、生の int へのアクセスは
"not atomic" に該当するから排他なしのアクセスでは未定義動作となりダメだと言っている。
規格文面の "atomic" は、規格が規定する C++ 抽象機械上の概念という認識。

対して 755 は、規格文面の "atomic" は各処理系でのメモリアクセスが実際にアトミックかどうかに依ると考えてそう。
残念ながら規格の文面で明確にその解釈を否定できないんだけど (https://cplusplus.github.io/LWG/issue2506)
少なくとも現メモリモデル策定当時から Web 上に積み上げられている多くの記事(標準化委員会の↑含む)や
現行コンパイラ(最適化、スレッドサニタイザなど)での扱いと合致しない。

804 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 05:14:12.89 ID:oWQENBCT.net]
>>775
> 「767を書いた意味」なら>>769で説明した。
あああのメモリーバリアと排他の区別もついてないアホ丸出しの説明ねw

> 少なくとも現メモリモデル策定当時から Web 上に積み上げられている多くの記事(標準化委員会の↑含む)や
> 現行コンパイラ(最適化、スレッドサニタイザなど)での扱いと合致しない。
百歩譲ってstd::atomic使えと言うのはいいけど、排他は必須じゃないだろ

805 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 06:52:54.80 ID:DRiXJTFv.net]
charはatomicなの?規格にどれがatomicだってあるの?
どれがatomicかなんて、CPU毎に違って当然だと思ってたわ

806 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 07:50:32.57 ID:oWQENBCT.net]
>>777
CPU毎と言うかシステム毎に違うだろ

807 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 08:52:46.15 ID:JIUDKEB4.net]
>>776
うん。データ競合を回避するにあたって std::atomic を使えば排他は必須じゃなくなるよ。
ミューテックスを使うなどの排他(順序付け)でも回避できて、どっちかでもいいし両方でもいい。

>>755 が嘘だという点には異論なくなったみたいだね。よかったよかった。

808 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 09:20:51.24 ID:oWQENBCT.net]
>>775
排他は要らんケースがあると言うだけの話
ちなみに>>755では生intなんて一言も書いてないけどね
std::atomic<int>でも多くの環境では
> 単純なカウンタみたいなアトミックに読み書きできるような変数になるしな

まあ結局規格ガーって言うしかないレベルの低い規格厨が関係のないメモリーバリアーとか出してきて恥を晒しただけだったなw



809 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 10:06:00.17 ID:ux6gJq+a.net]
お前ら暇すぎやろ

810 名前:デフォルトの名無しさん mailto:sage [2021/07/30(金) 19:50:56.40 ID:VEABT8DF.net]
C++ のバイナリ互換性についてお聞きしたいのですが。C++ のライブラリの中に以下のようなものが
あったとします。
class A { char *p1; };
class B { /* 略 */ };
class C { A a; B b; };

で、class A に新たな要素を追加して
class A { char *p1; char *p2; };
としてからライブラリを再ビルドし、以前のアプリのバイナリと混在させると、class C 内で a のサイズ
が変わる結果 b へのオフセットが変わりクラッシュするようです。

そこでふと思ったのですが、class A に最初から
class A { char *p1; char *p2; char *p3; char *p4; };
等と最初からある程度要素を確保しておき、必要に応じ上の方から使っていく、みたいなやり方は
アリでしょうか? (b へアクセスするときのクラッシュを防げるでしょうか?)

811 名前:デフォルトの名無しさん mailto:sage [2021/07/30(金) 19:57:58.75 ID:SwFfvD28.net]
pimpl使え

812 名前:デフォルトの名無しさん mailto:sage [2021/07/30(金) 21:01:43.73 ID:y9Kee4rz.net]
>>782
素直にC.aやC.bをポインタにすりゃいいだけちゃう?

813 名前:まあ俺が言うのもなんだがw mailto:sage [2021/07/31(土) 22:17:00.01 ID:m7lSxL/B.net]
>>782
クラス定義が変わったのにそれを使う一部のコードを再ビルドしないってこと?

> そこでふと思ったのですが
> (中略)
> アリでしょうか? (b へアクセスするときのクラッシュを防げるでしょうか?)
ありかも知れんが、なんでそんな前近代的なやり方しないといけないのかを考えたほうがいいと思う

814 名前:デフォルトの名無しさん mailto:sage [2021/08/01(日) 03:13:38.20 ID:/oR3uo3Y.net]
C++ポケットリファレンス読んだ方いらっしゃいますか?
独習C++ 詳説 C++ 第2版の次に読もうかと思ってるのですが

815 名前:デフォルトの名無しさん [2021/08/02(月) 10:21:16.05 ID:WSe94FPO.net]
近年の現場と言うか、
大手の製品開発や比較的規模の大きい案件とかで使われてるC++のバージョンってどの辺ですか?
未だにC++03ってわけないですよね?

816 名前:デフォルトの名無しさん mailto:sage [2021/08/02(月) 10:29:43.05 ID:WSe94FPO.net]
>>786
C++プログラミング言語自体の研究という訳ではないのなら、
入門書以降は何か作る系の書籍のほうが良いのではないでしょうか?
物理シミュレーションだったりゲームだったり
人工知能だったりOSだったり様々あると思うので、
興味のある分野を極めていくのが良いと思います。
作りたいものがあるが何から手を付けて良いか分からないのなら
設計理論系の書籍等も良いと思います。
OOPを極めたいという考えであるならデザインパターン等も良いと思います。

817 名前:デフォルトの名無しさん mailto:sage [2021/08/02(月) 10:37:42.71 ID:dQnVwxld.net]
どの道、

class C { A* a; };
と、ポインターに変えても、

class A { char *p1; char *p2; };
と、新しいメンバーp2 には、C を再コンパイルしないとアクセスできない

818 名前:デフォルトの名無しさん mailto:sage [2021/08/02(月) 11:23:37.60 ID:lIzbW3kq.net]
class A;
class C { A* a; }; だけで完結してるなら まぁ問題をおこしにくそうではあるけど
そこまでして C に関わるコンパイルを止めたい理由がわからん



819 名前:デフォルトの名無しさん [2021/08/03(火) 10:56:52.82 ID:Ljn/RAt1.net]
>>787
最低でも C++11
それでも古いと思う

820 名前:デフォルトの名無しさん [2021/08/09(月) 22:11:24.65 ID:PKIz3Xw3.net]
C++って競プロ以外に何に向いてるの?なんで競プロに使われるの?

821 名前:はちみつ餃子 mailto:sage [2021/08/10(火) 01:15:34.32 ID:7+xjomdk.net]
>>792
実行速度が速いことが多いから速度が評価の一部である以上は有利になる。
(速ければ速いほど良いというわけではないが、上限が設定されているのが普通)

822 名前:デフォルトの名無しさん [2021/08/11(水) 12:58:25.34 ID:MU7UJMps.net]
std::map<std::pair<const char *, int> > hoge;
のように const char * を key とするとき
hoge.insert(std::make_pair("A", 41));
hoge.insert(std::make_pair("C", 43));
hoge.insert(std::make_pair("B", 42));
と追加すると
hoge["C"] で 43 が得られると期待できますが
このとき make_pair したときの "C" と hoge["C"] の "C" のポインタは値が違ってても
同一 key とみなされますか?(ポインタの値ではなく文字の中身の一致を見てくれますか?)
あるいは char * だとまた変わりますか?

823 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 13:12:29.99 ID:Z6PNV5dP.net]
ポインターは先頭アドレス

2つのオブジェクトの内容が同じでも、
別々のオブジェクトなら、ポインターも異なる

ポインターが同じとは、同一のオブジェクトを指している場合だけ

824 名前:デフォルトの名無しさん [2021/08/11(水) 13:28:06.66 ID:MU7UJMps.net]
追伸
一つの fuga.cpp 内で
二か所以上で "C" が使用されていたとき
同じアドレスにしてくれる機能もあるみたいですが
fuga.cpp と hage.cpp みたいに別のソースで
それぞれ "C" を使ってたりすると
勝手に同じアドレスにしてくれたりはないみたいで
いろいろトラブルのもとになりそうです
(どっちみち変数になってると手も足も出ませんし)
key は std::string にしておくか
あるいは
std::hash<>

std::equal_to<>
を定義して自分で比較する方が安全な模様

825 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 13:42:41.83 ID:EWMgwFeS.net]
>>796
「あるいは」以降ってunordered_mapの話じゃないかい
mapならstd::less<>を定義する……というかデフォルトのstd::less<>が使われないようにユーザ定義比較関数をコンストラクタで渡す

俺もこういう場合はキーにstd::string使うからいいけども

826 名前:デフォルトの名無しさん [2021/08/11(水) 14:06:43.19 ID:MU7UJMps.net]
今回の問題は
>一つの fuga.cpp 内で二か所以上で "C" が使用されていたとき同じアドレスにしてくれる機能もあるみたいですが
>fuga.cpp と hage.cpp みたいに別のソースでそれぞれ "C" を使ってたりすると勝手に同じアドレスにしてくれたりはないみたいで
これでした
stringにしたら解決です
ほんとうにありがとうございました

827 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:27:08.48 ID:01hIEDa4.net]
>>798 別のソースでも同じアドレスにしてくれることあるよ。

828 名前:はちみつ餃子 mailto:sage [2021/08/11(水) 14:56:20.07 ID:QcAq7ivU.net]
言語仕様上は内容が同じ文字列リテラルを統合するかどうかは処理系定義。
https://timsong-cpp.github.io/cppwp/n3337/lex.string#12



829 名前:デフォルトの名無しさん mailto:sage [2021/08/12(木) 23:28:31.22 ID:sg4QisCT.net]
>>ってどのように言えばいい?

だいなり、だいなり
???

830 名前:はちみつ餃子 mailto:sage [2021/08/13(金) 00:46:25.67 ID:BE9FMbqU.net]
>>801
トークンとしての名前は無いと思う。
演算子としての名前なら右シフト演算子とか、
iostream 的な用途の場合は抽出演算子とも言う。

831 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 15:49:32.03 ID:ZZGdeLtF.net]
insertion/extraction operatorっていうのか。
stream operatorだと思ってたわ

832 名前:はちみつ餃子 mailto:sage [2021/08/13(金) 16:31:09.36 ID:BE9FMbqU.net]
>>802-803
念のために仕様書を見直して見たら抽出子 (extractor) だったわ。

833 名前:デフォルトの名無しさん [2021/08/21(土) 20:09:51.28 ID:7GAoG1Iq.net]
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しでView types参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
nim-lang.github.io/Nim/manual_experimental.html


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、Cのソースコードを吐き出せるのでC言語でリモートワークされ
ている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます

834 名前:デフォルトの名無しさん [2021/08/22(日) 10:20:28.75 ID:0Cz6ueFz.net]
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
nim-lang.github.io/Nim/manual_experimental.html


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます

835 名前:デフォルトの名無しさん [2021/08/22(日) 10:29:54.67 ID:0Cz6ueFz.net]
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴 バージョン1.5.1
nim-lang.github.io/Nim/manual_experimental.html

第二プログラミング言語として Rust はオススメしません Nim をやるのです
https://wolfbash.hateblo.jp/entry/2017/07/30/193412


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます

836 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 12:34:32.34 ID:m1rLE8Mc.net]
怠け者が一生懸命2回書き込んじゃうのか

837 名前:デフォルトの名無しさん [2021/08/22(日) 13:21:27.56 ID:cx6/dnxW.net]
unordered_map で erase(key) を実行した場合
要素のデストラクタは呼ばれるのでしょうか?
必ず自分で呼ばないとだめ?
あるいは勝手に呼んでくれるオプションとかある?

838 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 13:38:27.67 ID:m4vhMo04.net]
呼ばれるよ。そうじゃないと危なすぎるでしょ。



839 名前:デフォルトの名無しさん [2021/08/22(日) 13:51:18.62 ID:cx6/dnxW.net]
つまり
unordered_map<hoge, fuga *>


840 名前:ンたいなときって
fuga *f があるとすると
delete f されるっていう認識で OK?
[]
[ここ壊れてます]

841 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 13:56:28.38 ID:M38WAZ3o.net]
ポインタ型のデストラクタは基本的に何もしない。
デストラクタで破棄したいならunique_ptrなどスマポを使う。

842 名前:ハノン mailto:sage [2021/08/22(日) 15:55:44.42 .net]
>>809
つ https://ideone.com/zKMtPs

843 名前:ハノン mailto:sage [2021/08/22(日) 16:00:15.54 .net]
>>811
つ https://ideone.com/AIykVF

844 名前:ハノン mailto:sage [2021/08/22(日) 18:24:32.36 .net]
>>813
>>809
ユーザー定義のハッシュ関数を std 名前空間に押し込むのはお行儀が悪いよね…‥
https://ideone.com/J5JYnG

845 名前:はちみつ餃子 mailto:sage [2021/08/22(日) 21:31:04.10 ID:YcQtKocs.net]
>>815
文字列リテラルを char* にキャストするほうがだいぶん行儀が悪いと思うよ。

846 名前:ハノン mailto:sage [2021/08/22(日) 22:10:22.39 .net]
>>816
しかし、MyStr のコンストラクタの引数が std::string とか、もう何やっているのかわからなくなる‥‥

847 名前:はちみつ餃子 mailto:sage [2021/08/22(日) 22:21:02.88 ID:YcQtKocs.net]
>>817
???
const char* で受ければいいだけでしょ?
なんでそこで std::string が出てくるの?

848 名前:ハノン mailto:sage [2021/08/22(日) 22:23:59.15 .net]
>>818
そういう意味でしたか、const に対する注意力がまだ足りないのは私の課題ですね



849 名前:デフォルトの名無しさん [2021/08/23(月) 11:12:35.74 ID:PZenUrJ/.net]
linuxのg++8.3でstd::stringのメンバ関数の
insert(const_iterator, char)を使うとコンパイルが通らないのですが、バグでしょうか?
-std=gnu++1zつけてます。

850 名前:デフォルトの名無しさん mailto:sage [2021/08/23(月) 12:30:44.70 ID:gvYYeNdp.net]
>>820
具体的に問題を再現するコードとエラーメッセージを書いて。

851 名前:デフォルトの名無しさん mailto:sage [2021/08/23(月) 14:00:01.42 ID:BEPpIG+d.net]
>>819
草生えたw

852 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 09:47:42.50 ID:HAU1OEWW.net]
>>821
こんな感じです。
g++のバージョンは8.3で-std=gnu++1z でコンパイルしています。

-- ソースファイル
#include <string>
int main(int argc, char** argv) {
std::string str="abcd";
std::string::const_iterator it = str.cend();
str.insert(it, 'a');
return 0;
}

-- エラーメッセージ
testinsert.cpp: In function ‘int main(int, char**)’:
testinsert.cpp:6:21: error: no matching function for call to ‘std::basic_string<char>::insert(std::basic_string<char>::const_iterator&, char)’
str.insert(it, 'a');
^
In file included from /opt/rh/devtoolset-8/root/usr/include/c++/8/string:52,
from testinsert.cpp:1:
/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.h:4419:7: note: candidate: ‘void std::basic_string<_CharT, _Traits, _Alloc>::insert(std::basic_string<_CharT, _Traits, _Alloc>::iterator, std::basic_string<_CharT, _Traits, _Alloc>::size_type, _CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::basic_string<_CharT, _Traits, _Alloc>::iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; typename _Alloc::rebind<_CharT>::other::pointer = char*; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’
insert(iterator __p, size_type __n, _CharT __c)
^~~~~~

853 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 12:50:48.93 ID:MkJE9y3A.net]
>>823
コンパイルできないのはバグだが終端イテレータの扱いについては
変遷があって有効なイテレータと見做されない時期もあった。
最後に文字をくっつけるのであれば push_back か append を使ったほうが無難。

854 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 14:09:58.40 ID:+43Lnt ]
[ここ壊れてます]

855 名前:iD.net mailto: >>824
> 終端イテレータの扱いについては
> 変遷があって有効なイテレータと見做されない時期もあった。
要出典
[]
[ここ壊れてます]

856 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 14:20:52.77 ID:cqt8yWy6.net]
>>824
アドバイスありがとうございます。
やっぱり規格的におかしいと思って調べてみたところコンパイラがc++11に対応していないだけでした。
ありがとうございました

857 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 15:38:43.16 ID:9jFaPzYS.net]
コンパイラはver.4.8で対応してるよ
gnu++1zてのがないんじゃないの?

858 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 17:29:41.65 ID:+rMtuhpY.net]
const_iteratorだとダメでiteratorだと通るぽい

↓のコード、手持ちのg++ (GCC) 7.3.1で-std=gnu++1zでコンパイル、実行できたが
https://cpprefjp.github.io/reference/string/basic_string/insert.html
「(6) 指定したイテレータが指す要素の前に、文字を挿入する」の
s.insert(s.begin(), 'b');

s.insert(s.cbegin(), 'b');
にするとコンパイルエラーになる



859 名前:デフォルトの名無しさん [2021/08/25(水) 19:02:32.36 ID:s4ke0ECA.net]
C++を勉強しているんだけど難しすぎる。
目標は研究に使う数値計算ライブラリを作ることでそのために、
オブジェクト指向とテンプレートプログラミングとSTLを勉強しているんだけど量が多すぎて発狂しそう。
本当にC++を仕事で使っている人はこの量の仕様を覚えて使いこなしてるのか・・・

860 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 19:16:48.44 ID:I0Do+yHA.net]
基本的に自分がよく使う範囲だけ覚えて
必要があればそれ以外の範囲を調べて使う
膨大なようで、所詮言語だから使ってれば覚える

861 名前:デフォルトの名無しさん [2021/08/25(水) 19:55:14.87 ID:s4bO6YKI.net]
生半可に上辺だけ触って判った気になって
コード描けますとかいうやつと仕事したくないわ

862 名前:デフォルトの名無しさん [2021/08/25(水) 21:53:18.83 ID:gHVAu5z0.net]
>>827
>>828
言葉足らずですみません。
CentOS7のdevtoolのg++はABI互換性の関係から古いlibstdc++としかリンクできないようにされていて
つまるところC++11の機能はほとんど使えなくなっている、ということでした。
本来ver8.3ならC++17にも対応しているはずなのにほとんど意味ないわけです…。
だったら-std=c++11とかつけたときに警告してくれとでも思わないわけもないですが。

863 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 23:11:46.20 ID:3/bOIe3o.net]
>>829
もしEigenとかみたいなメタプログラミング使った数値計算ライブラリを考えてるならやめとけ
無駄に開発期間が数倍から10倍程度に膨れ上がるだけ

とりあえずテンプレートとか使わずに(あるいはメタじゃないレベルにおさえて)普通に書いたら?

864 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 06:13:02.19 ID:H9rsGF96.net]
>>829
仕事をすると言っても、他の人がこさえたライブラリを使う場合はそこまでは求められんだろう。
反対に根っこ部分のライブラリとか、チーム内でのルールに関わると知識と経験がいるんじゃないかな?

よく理解できている方法でしっかり組み立てられるようになってから、徐々に細かい話に手を出したらいいと思う。
他の方法は解ってるし悪いわけでもないが、記述が気に入らないので延々とtemplate弄り倒す沼もあるから注意してね。

865 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 09:00:20.61 ID:b62pz5ME.net]
数値計算に使うのならまずはSTL抑えておくだけでいいんじゃね?
C++言語自体の習得より、GPGPU、分散処理、SIMD、メモリ管理とかのノウハウ習得にまずは時間を割り当てるほうがよいと思う

866 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 09:28:17.30 ID:eI1EN0aq.net]
物理の計算とか、いろんな数学的な量が出てくる

867 名前:ッど、そういうのの演算がすべて
プログラム上では同じ形で書ければかっこいいなあと思ったり。
例えば、(スカラー)積なら、オペランドが実数、虚数、ベクトル、行列、テンソル....等々どれでも
乗算オペレーターで扱えるとか。
「普通」の数値ライブラリだとオペランド毎に積を扱う関数がうんざりするほどあってそれを適切に
選ばないといけなかったりするので。
[]
[ここ壊れてます]

868 名前:デフォルトの名無しさん [2021/08/26(木) 12:08:14.60 ID:p2DPtxMk.net]
829です。
皆さんいろいろとアドバイスありがとうございます。

自分が作ろうと思っているのは、Eigenを用いた金融系の数値計算ライブラリなのですが、テンプレートを用いたらいろいろな型を代入できて便利かな〜くらいの感じで作ろうとしていました。

templateの使い方自体は少し勉強してみましたが、メタプログラミングの概念自体もよくわかっていないので、ひとまずtemplateは後回しにしようかと思います。

オブジェクト指向で書くかどうかは実際にコードを書いてみてから考えてみたいと思います。



869 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 16:35:43.38 ID:9wBQWoih.net]
Eigen利用するだけか
それならまぁ無駄に時間かかるということも無いと思う(変なとこに拘らなければ

870 名前:デフォルトの名無しさん [2021/08/26(木) 16:43:57.74 ID:WPRv8+9f.net]
>>836
コンピューターというか主要な高級プログラミング言語が出来て50年以上経つが
だれもそういうことをやってないのは何故だと思う?

871 名前:デフォルトの名無しさん [2021/08/26(木) 16:45:12.60 ID:WPRv8+9f.net]
ちなみに SciPy とか SymPy は良く出来てる方

872 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 14:40:33.39 ID:RrJjtAzF.net]
>>839
template使ったらもう型にとらわれなくていいんじゃね?はC++学習者の必ず通る道やからしゃーない

873 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 15:05:57.44 ID:nK81wxcE.net]
で、結局なんでできないの?

C APIのほうが汎用性が高いから?
行列やテンソルは乗算方法が複数あるから?
結果の表現形式も有理数とか複数あるから?
結果をエレベーションする必要があるから?

874 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 17:44:56.54 ID:LFMqkLz6.net]
extern "C" 使ってる?

875 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 17:53:48.43 ID:nK81wxcE.net]
>>843
Cで開発するときに、常にヘッダファイルに書いておく必要があるかどうかって話なら、将来c++から呼び出す可能性があるなら書いておけば?
最悪なくてもインクルードする側でどうにかなる

876 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 19:22:59.35 ID:ghUXxVcH.net]
>>843
32bitとはいえマイコンで-std=gnu++17とか指定するのは微妙な背徳感を感じてしまうチキンだが、
Cのライブラリも一緒に使うから、普通に使ってるな。基本ヘッダファイルでほとんど事足りるんだけど、
weak指定のCの割り込みハンドラとか再定義するときは混乱しないように明示的にextern "C"付けてる。

877 名前:デフォルトの名無しさん [2021/08/29(日) 01:50:34.33 ID:TPHdi4yb.net]
>>841
operator置き換えまくりとかな

878 名前:デフォルトの名無しさん mailto:sage [2021/08/29(日) 10:17:41.53 ID:sPGAkNt4.net]
>>841
設定読み込みの部分でお世話になったわ



879 名前:デフォルトの名無しさん [2021/08/30(月) 14:54:09.69 ID:a7szkEqk.net]
C++17は甘え

880 名前:デフォルトの名無しさん mailto:sage [2021/08/30(月) 20:54:03.52 ID:i7moqIxZ.net]
甘えてもいいぜ

881 名前:デフォルトの名無しさん mailto:sage [2021/09/08(水) 21:07:44.76 ID:QZMwNs5W.net]
C99で良いです……

882 名前:デフォルトの名無しさん [2021/11/24(水) 18:53:15.36 ID:ONXwk6fD.net]
void *q = (void*)p;
void *r = reinterpert_cast<void *>(p);
void *s = static_cast<void *>(p);
どっちが良い?

883 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 22:24:01.60 ID:7YsOMgZx.net]
p の型によるんじゃね?

884 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 14:45:18.21 ID:Ts2h3uwp.net]
>>838
Eigen の MatrixXtype と Matrix<type, Dynamic, Dynamic> が便利なのは判ったが
自分でそいつらを引数に持つテンプレート関数書こうとして
template <typename T, int R, int C>
void func(Matrix<T, R, C>&m){ ... }
で定義したら
a が Matrix3d a; とか RC 固定されてるときは func(a) で問題無いが
a が Matrix<type, Dynamic, Dynamic> a(3, 3); だと
実際に func(a) とかで呼ばれるときに
Matrix<type, -1, -1>
で呼ばれてて Row 数も Column 数も判らないので
結局呼ぶときに
func<type, 3, 3>(a)
みたいに確定して呼ぶことになるんだが
そういうもの?

885 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 19:09:15.51 ID:ZkEvf+9l.net]
Eigen使ったことないけど、それ多分動的なサイズ指定だよね
コンパイル時にサイズ分かってない奴じゃね

886 名前:デフォルトの名無しさん [2021/11/27(土) 15:14:48.94 ID:dxTMcmeT.net]
fstream で open するオプションで
ios:in ios:out ios:binary とかと
ios_base:in ios_base:out ios_base:binary とかと
何が違うのでしょう?

887 名前:デフォルトの名無しさん mailto:sage [2021/11/29(月) 16:58:44.62 ID:Afxc3rI9.net]
おなじ
:: だろうけど

888 名前:デフォルトの名無しさん mailto:sage [2021/12/06(月) 10:19:18.78 ID:aQJDsz9k.net]
一般的にプリプロセッサのビットシフトに制限てありますか?
#define HOGE (1<<27)
だとダメで
#define HOGE (0x8000000)
だとOKだとかありますかね?



889 名前:デフォルトの名無しさん mailto:sage [2021/12/06(月) 10:50:06.54 ID:7ju/18KI.net]
>>857
プリプロセッサはその define値をその記述通りの文字列(というか文)としか見てなくて、単にその定義名の所へはめ込むだけじゃない?
あとは嵌め込まれた後の文脈でコンパイラが解釈するんじゃないかな。

890 名前:デフォルトの名無しさん mailto:sage [2021/12/06(月) 12:49:27.90 ID:T2nrofKv.net]
>>858
そう言われてみればそうですよね
トンチンカンな質問失礼しました

891 名前:はちみつ餃子 mailto:sage [2021/12/06(月) 13:31:07.92 ID:Fu08U5Ef.net]
>>857
定義での制限はないが、マクロの制御定数式として表れる場合、
つまり

#if HOGE > 0

みたいな前処理指令があった場合に全ての符号付整数型が intmax_t 、
全ての符号無し整数型が uintmax_t と同じ表現を持つというルールがあるので
通常の式とは解釈が違う。
(大抵の場合に intmax_t は long long int と同じ大きさだと思う。)

つまり普通の式としてならオーバーフローする場合でもプリプロセッサではオーバーフローしないこともあるので、
制限としてはむしろ緩い。

https://wandbox.org/permlink/Ns4Qt2xG3wj1WVBH

892 名前:デフォルトの名無しさん [2021/12/08(水) 17:56:15.71 ID:ouf8qdPn.net]
std::listのsortを使ってるのですが
同値だった場合の順序が維持されず困ってます。
何かよい手はないですか?
比較関数を渡してるのですがその中で何とかならないでしょうか?

893 名前:はちみつ餃子 mailto:sage [2021/12/08(水) 18:22:21.80 ID:cTje1973.net]
>>861
言語仕様上は std::list::sort は安定ソートなので
そうなってないなら標準ライブラリの実装が間違っているか使い方が間違っている。

894 名前:デフォルトの名無しさん mailto:sage [2021/12/08(水) 18:28:56.67 ID:ouf8qdPn.net]
>>862
そうなんですね。ありがとうございます。
調べてみます。

895 名前:デフォルトの名無しさん mailto:sage [2021/12/09(木) 05:48:07.42 ID:4Thv0Igk.net]
純粋仮想関数の通知メソッドの中から他所のアドレスを知りたい時C++だとどう書くのが一般的ですか?

896 名前:デフォルトの名無しさん mailto:sage [2021/12/09(木) 07:40:39.36 ID:bGgqEdHH.net]
日本語でおけ

897 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 05:24:10.27 ID:pHnakqcn.net]
私の同僚のプログラマがC++で、あるソフトのプラグインをdll形式で作成しており
そのdllファイルは6割くらいの環境では問題なく動作しています。

しかし、ユーザーの環境次第で動かないことがあり
dllをインストールした状態でソフトウェアを起動しようとすると、ソフトウェア自体が起動しないというバグを抱えており
この問題の解決方法は数か月以上、見つかっていません。

そのdllはWindowsのみで動作するものであり、MacやLinuxには対応していません。
Windowsの何らかの設定に関係するバグなのでしょうか…?

バグの原因が一切分からず、彼の作業が進まないので私の作業も進まず、困っています。
私自身はC++でそのソフトのプラグインを作成したこともないですし、彼に何のアドバイスもできないので
このスレッドのお力をお借りしたいです。

dllを作成する際にユーザー環境でデバッグしてログを取得する方法など
何でも良いのでアドバイスがあったら教えてください。
エスパーを求めています。

898 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 05:56:13.12 ID:6fha5luI.net]
printfデバッグをファイルに書くとか



899 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 06:41:07.66 ID:9Wj0xfjq.net]
64bitと32bitの違い・・・ではないか
それかintel/amdどちらかにしかない命令使ってるとか、何か依存する部分があるとか??

900 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 08:10:32.07 ID:o0cf+I8x.net]
まずはエラーメッセージをだな

でもランタイムライブラリのオプションがMTじゃなくてMDになってると予想

901 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 08:23:33.51 ID:T7uEaOwT.net]
>>866
例外で落ちたりもせず、ただ起動しないの?
起動しない環境の特徴も分からない?
なにかしらのセキュリティソフトが入ってるとか。

902 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 10:16:08.28 ID:e0HER7LA.net]
>>866
>6割くらいの環境では問題なく動作

落ちる環境のPCで開発させてみるといいんじゃね

903 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 11:09:39.54 ID:RuQEsKMi.net]
そのプラグイン dll が vcのランタイムを要求してて 実行環境にvcのランタイムが入っていない

プラグインdllの性質上 ソフトが自前で LoadLibary するが、そこで失敗する
この際何が主因なのかわからないまま

静的なリンクなら ○○が見つかりませんdialog がでてすぐわかる

プラグインdll を Dependency Walker なりで そのDLLが必要としてる DLL を確認してみたら?

904 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 11:37:46.60 ID:zJGtuVBB.net]
>>872
ソフトの仕様や実装次第だけど、プラグイン読み込みに失敗して起動しないアプリもちょっと手抜き過ぎだよね

905 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 11:41:07.01 ID:RuQEsKMi.net]
>>873
わかったとしても、「モジュール <プラグイン>.dll が見つからない」 としか書きようがなくてややこしい
※ 本当に見当たらないのは <プラグイン>.dll がさらにロードしようとしてる MSVCR○○.dll とかだから

906 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 11:43:56.15 ID:RuQEsKMi.net]
プラグインのロード失敗で 即exit するのも不親切かもね

907 名前:デフォルトの名無しさん mailto:sage [2021/12/18(土) 10:46:11.74 ID:RFbyER+p.net]
グローバル変数かstatic変数使ってないか?
昔他所のモジュールと変数の書き換え合戦が起きて正常に動作しない事があった

908 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 15:15:53.34 ID:bLFtEsOT.net]
>>876
static なら他所と競合しないんじゃない?
あとグローバル変数が仮に extern だったとしても、意図的にエクスポートしてなければ他所の DLL と競合はしないような。



909 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 17:40:07.63 ID:150MzqYw.net]
拡張子dllでも独自の実装してるホストプログラムあるからなぁ…
それこそホストの開発者に

910 名前:キくしかない []
[ここ壊れてます]

911 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:17:52.32 ID:mIjShW6/.net]
自前でできることは

1) DllMain の DLL_PROCESS_ATTACH、 DLL_PROCESS_DETACH に
printf を仕込んで 最低限 load がなされてるかを確認

2) load されてるのなら
 最初に呼ばれるであろうexportしてる関数にがんがん printf を仕込んで 何処で死んでるかを確認

912 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 03:18:25.98 ID:pnvTuQZD.net]
規格厨ほど仕事ができなくね
どうでもいいようなことにこだわってないで
さっさと仕事終わらせろよ

913 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 10:00:30.81 ID:YmgFPSRd.net]
またお前か
何年立ったらルール覚えられるんだよ
つかえねーな

914 名前:デフォルトの名無しさん [2022/01/17(月) 19:13:47.29 ID:Xn5FtFWo.net]
メンバ関数へのポインタで質問なのですが
class MyClass {
public:
  void (MyClass::*p)();
  void func();
};
int main() {
  MyClass obj;

このようなクラスがあったとして
main関数でobjのメンバの関数ポインタpへfuncのアドレスを入れる書き方と
pを使ってfuncを呼ぶ書き方を教えて下さい

915 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 19:29:52.39 ID:pwXKfNQA.net]
>>882
obj.p = &MyClass::func;
(obj.*(obj.p))();

916 名前:デフォルトの名無しさん [2022/01/17(月) 20:40:50.75 ID:iHDNpEw/.net]
C++でオブジェクト指向を学びたいなと思ってるのですが、みなさんはどのように学びましたか?
既存のゲームの機能追加などをサークルでやっていて、C++自体には慣れてきて次のステップに進みたいと思いました.

917 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:47:51.30 ID:h5bglXe3.net]
ただただ自分でクラス設計考えて実際に書いて、さらにそれをあちこちで使ってみるだけ
実際に書く、利用する、をサボると机上の空論しか語れない頭でっかちになる

918 名前:デフォルトの名無しさん [2022/01/17(月) 20:50:24.57 ID:Xn5FtFWo.net]
>>883
ありがとうございます



919 名前:デフォルトの名無しさん [2022/01/26(水) 21:23:31.72 ID:HoA8G4VO.net]
初心者です。
自作クラスをVector型に押し込めようとしたのですが、そこで発生したエラーの解決方法を2時間くらい調べたのですが分かりませんでした。
class myClass
{
myClass(int A){num = A;}
void show() {
cout << "" << "="<<num<<endl;}
~myClass(){}
int num;
};
int main() {
myClass a1(1), a2(2), a3(3), a4(4), a5(5);
vector<myClass> myClassList;
myClassList.push_back(a1);
//中略
//削除するオブジェのインデックス番号を記録
vector<int> delList;
for (int i = 0; i < myClassList.size(); ++i)
{
if (myClassList[i].num == 2 || myClassList[i].num == 4) {
cout << "i" << "=" << i << endl;
delList.push_back(i);
}
}
cout << "削除開始" << endl;
for (int i = 0; i < delList.size(); ++i)
{
std::erase(myClassList, delList[i]);//コイツでエラー
}
return 0;
}
二項演算子 '==': 'myClass' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。

920 名前:蟻人間 mailto:sage [2022/01/26(水) 21:34:31.80 ID:bGQQ0+uk.net]
>>887
myClass::operator==を定義してみ。

921 名前:デフォルトの名無しさん [2022/01/26(水) 22:43:54.69 ID:HoA8G4VO.net]
>>888
オペレータに何を定義すれば良いか分かりません

922 名前:蟻人間 mailto:sage [2022/01/26(水) 22:53:20.32 ID:bGQQ0+uk.net]
>>889
eraseの仕様を見れば内部で要素を比較していることがわかる。
そこでmyClassとintの比較を定義する必要がある。
bool operator==(int n) const
{
return n == num;
}

923 名前:蟻人間 mailto:sage [2022/01/26(水) 22:55:52.03 ID:bGQQ0+uk.net]
あるいは
friend bool operator==(const myClass& my, int n)
{
return my.num == n;
}

924 名前:デフォルトの名無しさん [2022/01/26(水) 23:02:17.85 ID:HoA8G4VO.net]
蟻人間さん、ご丁寧に教えてくださり、本当にありがとうございます。
無事問題が解決しました

925 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 07:58:45.49 ID:Fon8EKoL.net]
delListはインデックスだからvector::eraseではなかろーか
https://ideone.com/jnELhK

926 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 15:24:34.96 ID:HENDwGdD.net]
msvcのコンパイルが遅いのとメモリ大量に使うのとで大変辛いのですが、コンパイルだけ別の端末で出来たりしませんか?

927 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 15:33:38.19 ID:hT9TavA0.net]
>>894
GitHub Actions

928 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 16:19:19.11 ID:gre2uKRK.net]
VARIANT型をログ出力したいときはどうしたらよいでしょうか?



929 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 16:23:28.54 ID:hT9TavA0.net]
>>896
std::variant (C++17 以降) のこと?
それとも COM で使う VARIANT のこと?
それとも特定の実装 (または規約) ではなく動的型一般のこと?

930 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 16:59:31.61 ID:gre2uKRK.net]
>>897
Comのです

931 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 17:44:30.90 ID:hT9TavA0.net]
何がわからないの?
基本的な数値型や配列以外の場合にどう文字列化すればいいかわからないってこと?

932 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 17:57:24.82 ID:gre2uKRK.net]
VARIANT.ToString的なのないかな?的な
みんな自分で作ってるの?

933 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 23:10:21.87 ID:hT9TavA0.net]
>>900
VARIANT は基本的な型だけでなく COM のオブジェクト (を指すポインタ) を含むこともある。
COM におけるオブジェクトは「少なくとも IUnknown インターフェイスは実装されている」という保証 (規約) があるだけで、
それをどのように表示できるのかは汎用的には決めようがない。

基本的な型だけでも簡易的に文字列化するものがあるとちょっとしたデバッグ用途などでありがたいというのはわからんでもないけど。

934 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 23:24:19.57 ID:A8Zj7Ozq.net]
>>901
オブジェクトはそのポインタ値を表示とかよくある

935 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 23:39:29.92 ID:hT9TavA0.net]
ログ用途だとアドレスだけでは意味が薄そうに思うけど……
(実行のたびに値は変わるだろうし、検証に使えない。)
少なくとも整数などではないという区別が出来れば十分ということはあり得るかな。

タイプライブラリがちゃんと用意されているなら型名などが取得できる場合もあるので可能ならそういう情報も欲しいけど、
いずれにしても「文字列にする」という要求はユースケースが多用すぎて標準的な機能として決め打ちはしづらい。

936 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 23:47:34.07 ID:Bry4gZCu.net]
>>903
Aのルーチンで使ってるオブジェクトとBのルーチンで使ってるオブジェクトが同じかどうかはわかる
それ以上のことを知りたいなら個別に表示ルーチンを組むしかない

937 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 16:18:19.62 ID:F6gMvu/h.net]
ガチガチの初心者です

#include<iostream>

double func(double x){
if (x>0) return x;
else return 0;
}

double dfunc(double x){
if (x>0) return 1;
else return 0;
}

int main(){
for (double x=-1.0; x<1; x+=0.1){
std::cout << std::scientific;
std::cout << x << ",";
std::cout << func(x) << ",";
std::cout << dfunc(x) << std::endl;
}
return 0;
}

を分割コンパイルするためにmain.cpp、func.cpp、func.fにソース分割したいのですがどのようにすればよいでしょうか

938 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 16:41:33.39 ID:LNIGuTho.net]
>>905 その3つファイル作って切り貼りして保存すればいいんじゃね。



939 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 16:44:31.98 ID:F6gMvu/h.net]
>>906
すみません、書き方が悪かったです。分割の仕方?切り貼りして保存する3つのファイルの中身の書き方が知りたいです。

940 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 16:47:36.64 ID:3ZSK4aSw.net]
>>907
なぜ調べもしない?
「C言語 分割コンパイル」でググりゃ

941 名前:あ出てくるっしょ []
[ここ壊れてます]

942 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 16:48:20.54 ID:LNIGuTho.net]
>>907 自分でやった結果を見せてもらわないと何に困ってるのかわからない。

943 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 17:08:03.21 ID:fQ9LbNHB.net]
>>905
とりあえず func.f はやめとけ

944 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 17:27:29.71 ID:54L0j00R.net]
ふぉーとらんらんらん

945 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 17:27:47.66 ID:CzloZbS7.net]
>>905
どんな入門書にも書いてあるようなことを質問するのは嫌がられる。
学ぶ気がなく代わりにやらせようとしているように見えるので。
そんで関連する事柄が多いので質問が具体的でないと単純に情報量的にとてもここには書けない。

細々としたところで引っかかるのは当然あることだしそういうのは喜んで回答するから
何がわからずに引っかかってるのかもうちょっと具体的にして欲しい。

わからないことをまとめられないなら
とりあえず自分なりにやってみたらどうなったのか見せれば、
何がわかってないかこっちで推測できる可能性がある。

946 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 00:03:59.30 ID:9peRckoc.net]
if (fp = fopen("file.txt", "W+"))

って書くと↓が出るんだけど?

warning: suggest parentheses around assignment used as truth value

947 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 00:50:39.94 ID:5Jw8HjAD.net]
まあ気に食わないが括弧でくくってやってる

948 名前:蟻人間 mailto:sage [2022/02/02(水) 00:57:41.77 ID:gV8dH/Sr.net]
if文では、代入と比較の混乱が深刻で、警告を出さなければいけなかったと聞いてるが。



949 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 08:17:16.11 ID:BmWHIg0d.net]
論理型を省略した代償は高くつきすぎたな。

950 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 10:18:30.37 ID:l1cc3wPX.net]
0とヌルの違いも曖昧な部分があったな

951 名前:はちみつ餃子 mailto:sage [2022/02/02(水) 11:07:29.08 ID:5i7w7V2o.net]
>>913
強めの警告オプションを付けてたら言語仕様上の問題がないものでも良くない作法に対しては警告が出ることはある。
a && b || c
とかいう式でも (人間が) 優先度を勘違いしやすいから括弧を付けることを勧められるし、
インデントの付け方がずれてる場合とかも警告は出る。

余計なお世話だと思うなら大抵はオプションで抑制できるよ。

952 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 16:52:47.21 ID:Os1L/Ifx.net]
括弧でくくっただけじゃ文句いわれたこともあるので二重否定しとく
if (!!(fp = fopen("file.txt", "W+")))

953 名前:はちみつ餃子 mailto:sage [2022/02/02(水) 17:18:37.99 ID:5i7w7V2o.net]
C++17 以降では if 文の括弧の中に初期化を書けるようになった。
初期化の内容と判断に使う式をセミコロンで区切って書ける。

if (fp = fopen("file.txt", "W+"); fp)

このとき変数の宣言を書いてもよく、

if (FILE* fp = fopen("file.txt", "W+"); fp)

というようにすると、この変数のスコープを if 文の内側だけに制限できるので便利。
便利だから C にも導入して欲しい。

954 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 17:39:51.00 ID:il4bRKm2.net]
if括弧中で初期化なんて前からやってたことだし
今じゃ代入も初期化になったのか

955 名前:はちみつ餃子 mailto:sage [2022/02/02(水) 18:18:35.55 ID:5i7w7V2o.net]
>>921
以前は「条件が宣言でもよい」だったところに
あらたに「初期化文と条件のふたつを書ける」「初期化文は式、もしくは単純宣言である」というルールが追加された形。

956 名前:デフォルトの名無しさん mailto:sage [2022/02/08(火) 08:24:13.76 ID:vXrgdSa9.net]
デストラクタだけ書いてあってムーブできないクラスをメンバ変数にすると色んな所でコンパイルエラーが出て困りました
値ではなくポインタで持つか、自分のクラスででムーブコンストラクタを書いたらとりあえずはエラーが出なくなったのですが、
こういうクラスは一体どう使われるのを想定して実装したんでしょうか?

957 名前:デフォルトの名無しさん mailto:sage [2022/02/08(火) 18:34:16.03 ID:SQWxHGFm.net]
基底クラスからたくさん派生クラスを作りました。
基底クラスの1つのvirtualメソッドを、各派生クラスでoverrideしました。
基底クラスを指す箱から、派生クラスのメソッドを呼ぶ方法を教えてください。

多少スタイルを変えても実現する方法があればお願いします。
ただし、場合分けやインデックスで対応するのは(派生クラスが増えたときに修正箇所が分散するので)厳しいです。
コンパイラは最近のvisual studioのC++を使っています。

struct Basic{
 virtual void work(){cout<<"Basic";}
};
struct B1:public Basic{
 void work()override{cout<<"B1";}
}b1;
struct B30:public Basic{
 void work()override{cout<<"B30";}
}b30;

void main(){
 Basic basic_array[9];
 basic_array[0]=b30;
 basic_array[0].work();//基底クラスのメソッドが呼ばれて Basic と表示されてしまう。
}

958 名前:デフォルトの名無しさん mailto:sage [2022/02/08(火) 19:25:55.42 ID:WarIH046.net]
Basicの配列にはBasicのオブジェクトしか入らないから、b30もコピーしたときにBasicになってしまったからだよ

Basic*の配列にするかvector<uniq_ptr<Basic>>を使えば



959 名前:デフォルトの名無しさん mailto:sage [2022/02/08(火) 19:56:37.56 ID:SQWxHGFm.net]
>>925
ポリモーフィズム成功しました。基底クラスのポインタを使って解決しました。
また、基底クラスの変数にコピーすると派生クラス独自のメンバが全て無くなることが理解できました。

ありがとうございました。

void main(){
 Basic*basic_array[9];
 basic_array[0]=&b30;
 basic_array[0]->work();//B30のメソッドが呼ばれた。
}

960 名前:デフォルトの名無しさん mailto:sage [2022/02/11(金) 14:30:39.44 ID:/nAwqwYv.net]
>>925
> vector<uniq_ptr<Basic>>を使え

動的にインスタンスを作り始めた途端に、コンテナとスマートポインタが必要になりました。
見事すぎる回答に改めて感謝します。

961 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 10:16:19.82 ID:+V9f8lU9.net]
例外で飛んじゃうと後始末ができなくてメモリリークしちゃうんだけど

クラスでラップしてデストラクタっていちいちやる感じ?

962 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 10:30:02.61 ID:+V9f8lU9.net]
try~catchで囲えば処理できるけど
すべての例外が出る可能性のあるコード全部try~catchしちゃっていい?

963 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 11:08:23.85 ID:v7utSHD9.net]
>>928
「いちいちやる」っていうか、同種のリソースを扱うときはいつも必要になる対応だからデストラクタでいいんだよ。
大抵はunique_ptrとか標準にあるもので済むし。

964 名前:はちみつ餃子 mailto:sage [2022/02/18(金) 11:40:56.58 ID:fowo2HBL.net]
>>928
いちいち個別対応したくないからクラス定義に押し込めるんだよ。

965 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 12:17:15.52 ID:+V9f8lU9.net]
>>931
今回のとこちょっとなんだけどなぁ
例外発生するとこ全部でやらなあかんやんコレ
クソ杉ちゃう?

966 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 12:21:15.24 ID:mVeDXtSU.net]
なにいってんの

967 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 12:27:42.18 ID:+V9f8lU9.net]
えー、わからんのー?

つまり例外が発生しうるとこすべてで
尻切れトンボされる可能性があって
以前のようにmalloc-freeのコードが混じってるとそいつらは問答無用でメモリリークしちゃうって話よ

968 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 12:47:42.19 ID:YFQd7auv.net]
malloc/freeなら検出できるやん



969 名前:はちみつ餃子 mailto:sage [2022/02/18(金) 12:48:02.74 ID:fowo2HBL.net]
>>932
対処する必要があるところで catch して解放するだけだろう。
それがどうして出来ないんだ?

970 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 13:19:45.68 ID:+V9f8lU9.net]
まあ、それよ
そういう対応が必要になるって話よ
追加するやつ全部trycatchで包むか
mallocfreeをクラスで包むか
入れたのは20行程度なのにルーチンの流れまで変える必要があったりなかったりで(# ゚Д゚) イラッ!

971 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 13:39:34.12 ID:v7utSHD9.net]
>>934
malloc-freeしてる既存コードに例外発生する処理

972 名前:混ぜるなんて特殊状況ならしょうがない。
面倒な状況なのはわかる。あきらめて心を殺してtry catchするか小さいRAII用クラスを作るか。
あるいはmalloc-freeしてるところも標準コンテナやunique_ptrに置き換えていけばすっきりするかもね。
[]
[ここ壊れてます]

973 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 09:00:24.16 ID:AlOKsuc0.net]
>>932
クソすぎかもしれないが、それは必要だし普通だろ

974 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 10:43:55.59 ID:MFjncly/.net]
メモリ解放以外にデストラクタでやることはあるわけだしな
集約して定義しとけよという

975 名前:デフォルトの名無しさん mailto:sage [2022/03/09(水) 22:51:16.35 ID:wIy/pNxS.net]
LinuxでyyyyMMddhhmmss.fffを出力する
一番簡単な方法を教えて下さい

976 名前:デフォルトの名無しさん mailto:sage [2022/03/09(水) 23:05:24.02 ID:w9Xuob20.net]
printf("yyyyMMddhhmmss.fff");

977 名前:蟻人間 mailto:sage [2022/03/09(水) 23:58:24.65 ID:ptoc1SJJ.net]
GNU/Linuxを仮定
system("date +%Y%m%d%H%M%S.%3N\");

978 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 00:03:44.70 ID:IfzvyEOT.net]
日付のフォーマットなんて都度調べるもんな
覚えてる変なやつもいるんだろうね



979 名前:蟻人間 mailto:sage [2022/03/10(木) 00:11:23.45 ID:3vn8A8hZ.net]
https://shino-tec.com/2019/06/08/time-to-string-on-linux/

980 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 07:16:50.83 ID:ZtFzrJEF.net]
>>945
これやったら秒とミリ秒を別で取得してるので
秒が59.999(ミリ秒はイメージ)のときに
ミリ秒は00.002ってなるときに前回の値が59.857ぐらいだったとすると

59.002ってなってしまうので逆転が起きたときは前回の値と比較して
逆転してたらミリ秒を強制的に999にするとかダサイことやってるんですけど
マジでこんな方法しかないでしょうか?

981 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 07:48:07.93 ID:E/Z/b8gJ.net]
>>946
そのダサいことをやってるのは何行目?
見つからないよ

982 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 08:52:39.45 ID:pPpJXJXf.net]
localtimeが時刻取得だと思ったんじゃろうね

983 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 18:51:28.19 ID:xl0leRXC.net]
>>947
timespecで取得できるのがミリ秒だけだと思ってました
自分のプログラムでtime_tで取得できる関数と複合してたのが原因でした

984 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 20:18:24.41 ID:udY9aSDo.net]
あー、だめだ
localtime_rがないって言われる

985 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 20:21:17.65 ID:udY9aSDo.net]
localtime_sもないって言われる
しばらくクソ方法で保留で

986 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 20:46:05.68 ID:xH/r/VUj.net]
>>950
環境は?

987 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 23:26:58.80 ID:udY9aSDo.net]
>>952
ubuntu

988 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 00:11:00.88 ID:3xV59ngV.net]
rはあるやろ



989 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 13:08:09.69 ID:2pJSEvK3.net]
ビルドの設定いじってもらって通りました
ありがとう御座いました

990 名前:デフォルトの名無しさん mailto:sage [2022/03/17(木) 11:34:53.41 ID:qJRouQ9M.net]
【質問】
switch constexpr って無いんですか?

【背景】
if constexpr(false){
}
if constexpr(false){
}
if constexpr(true){
}
if constexpr(false){
}
という記法に疲れました。
switch(定数) で実現可能ですが、コンパイラがwarningを出すので避けたいところです。

991 名前:デフォルトの名無しさん mailto:sage [2022/03/17(木) 11:40:14.61 ID:Y2OAtTnf.net]
無いけど俺も欲しい

992 名前:デフォルトの名無しさん mailto:sage [2022/03/17(木) 11:44:52.12 ID:qJRouQ9M.net]
>>957
早速の回答ありがとうございます。
否定的な解決で残念ですが、前向きに生きていきます!

993 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 13:40:31.67 ID:nPptgbtB.net]
クロスプラットフォーム対応のキーボードイベント入力・マウスイベント入力があるライブラリで、規模がそこまで大きくないものって何かありますか?

994 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 14:54:00.91 ID:Q/NZ1 ]
[ここ壊れてます]

995 名前:iFj.net mailto: ncurses []
[ここ壊れてます]

996 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 11:06:17.41 ID:Prmlj1K5.net]
>>960
情報ありがとうございます
ncursesだとWindowsで動かしにくいみたいなんでフォークのpdcursesでやってみます

997 名前:デフォルトの名無しさん mailto:sage [2022/03/26(土) 22:10:06.23 ID:U9Dry82x.net]
>>908
ググって出てこないようなことをおまえら答えれるのか?

998 名前:デフォルトの名無しさん mailto:sage [2022/03/26(土) 23:30:57.78 ID:po6dvxnc.net]
日本語で記述された問題や目的から有用なページを紹介するのはグーグル先生は苦手なんだよ。
核心的なキーワード抜きだと特に。



999 名前:デフォルトの名無しさん mailto:sage [2022/03/26(土) 23:42:52.67 ID:as/ML4Ec.net]
>>962

軽く調べた結果:

https://el.mml.tuis.ac.jp/moodle/mod/page/view.php?id=913

www.cc.kyoto-su.ac.jp/~hxm/cstext/prog06.html

https://programming.pc-note.net/c/header.html


どこだったか忘れたけど俺は検索して学んだ記憶がある
記憶違いかもしれないけど

1000 名前:デフォルトの名無しさん mailto:sage [2022/03/29(火) 22:17:14.91 ID:JBheGd8b.net]
スマホが普及しきった2015年くらいからGoogle検索の難易度一気に上がったな
昔はガバガバキーワードでもGoogle先生が忖度してくれていた

1001 名前:デフォルトの名無しさん mailto:sage [2022/03/30(水) 08:00:47.76 ID:NklUKb3w.net]
忖度の意味知らなそう

1002 名前:デフォルトの名無しさん mailto:sage [2022/03/30(水) 10:53:25.40 ID:2Q6y3di6.net]
Google ADの顧客は優遇致します

1003 名前:デフォルトの名無しさん [2022/03/30(水) 12:23:34.00 ID:eoFMqmT7.net]
広告出してくれるインチキ医療サイトや適当プログラミングスクール優遇しまーす!!

無能

1004 名前:デフォルトの名無しさん [2022/03/31(木) 16:42:12.47 ID:Pfu/lGwO.net]
初心者歓迎ということで、ちょっと聞いてみたいのですが、c++の世界ではboostというライブラリは有名なのでしょうか?
c++で勤怠管理できるwebシステムを作るんだといってコンストラクタがなんだかわからないまま
boostを読んでヘッダファイルをいくつか読んだあたりで英語読めなくて投げ出したことがあります。

1005 名前:デフォルトの名無しさん mailto:sage [2022/03/31(木) 16:48:44.96 ID:R4GrqV7T.net]
>>969
有名だけど、使わんほうがいいよ
標準で十分だよ

1006 名前:デフォルトの名無しさん [2022/03/31(木) 17:01:55.62 ID:Pfu/lGwO.net]
>>970
ありがとうございます!!
それに、あなた有識者の方ですね?
もしよければ少しだけ詳しく評判を教えていただければ幸いです。

1007 名前:はちみつ餃子 mailto:sage [2022/03/31(木) 17:23:59.00 ID:Dq8nC8PK.net]
>>969
かなり有名で活発。
最初から標準化委員会の人がかかわってるし、 Boost が出自の機能が標準入りしたこともある。
ただ、実験的な要素も多分にある。
急に仕様がかわることもある。

適切な場面では適切だし適切でない場面では適切でないというごく普通の話なんで、
評判がどうこうというより何をしたくて Boost に関心を持ってるのか説明したほうがいいよ。

1008 名前:デフォルトの名無しさん [2022/03/31(木) 17:31:25.58 ID:Pfu/lGwO.net]
>>972
ありがとうございます。
boostは今はそんなに興味は持っていないんですが、今ちょうどMIMEタイプらへんのところを読んでいて、
そういえばboostにMIMEタイプって書いてあったなぁ、boostって業界だとどんな感じなんだろ?という感じです。
何となくなのですが、仕様が良く変わるから使いにくいと言う感じなのかな?と理解しました。



1009 名前:はちみつ餃子 mailto:sage [2022/03/31(木) 17:51:26.52 ID:Dq8nC8PK.net]
>>973
標準ライブラリほどには互換性は意識されないってだけで、
特に実験的な部分を除いては頻繁に変わるというほどでもないけど。
アップストリームでの変更の影響を避けるために
必要な部分だけ抜き出して自分のプロジェクトツリーに入れておくという運用もよくあるし。
(そのためのツールも用意されている。)
https://www.boost.org/doc/libs/1_78_0/tools/bcp/doc/html/index.html

1010 名前:デフォルトの名無しさん [2022/03/31(木) 18:00:17.34 ID:Pfu/lGwO.net]
>>974
更に詳しく有難うございます。確かに抜き出しちゃえば変わらないですもんね。
他でも応用できそう。

1011 名前:デフォルトの名無しさん mailto:sage [2022/03/31(木) 18:34:15.90 ID:YOGNRVrk.net]
boost自体は使う必要はないけど、boostのドキュメントを読めないやつも不要だよな

ドキュメントもしっかりしてるから、使うだけなら簡単に使えるし

1012 名前:デフォルトの名無しさん [2022/03/31(木) 19:04:21.70 ID:Pfu/lGwO.net]
>>976
ありがとうございます。
boostくらい軽く読めないならエンジニアになるなと言うことですね。
初めて3か月くらいなもんでポートフォリオの一つもないですけれど、
本当に読んでおきますね。

1013 名前:デフォルトの名無しさん mailto:sage [2022/03/31(木) 19:25:23.71 ID:R4GrqV7T.net]
これから年単位でトレーニングが続くのに初心者がいちいちポートフォリョーポートフォリョー言うのは大変めんどくせえ感

1014 名前:デフォルトの名無しさん mailto:sage [2022/03/31(木) 23:41:57.85 ID:Sxv2nhUu.net]
boost有用性は分かっていてもコンパイル時間やらなんやらで本チャンに適用しにくいんだよなぁ

1015 名前:デフォルトの名無しさん mailto:sage [2022/04/01(金) 01:53:53.30 ID:46G1puQR.net]
boostなんてtemplateで悪ふざけしてるだけだから
普通のアプリには使えない

1016 名前:デフォルトの名無しさん [2022/04/09(土) 01:43:32.41 ID:fJGplIUn.net]
VC++である動画を再生するのにコーデックのDLLが必要なのですが
予めレジストリにDLL情報を登録して、実行ファイルと同じディレクトリにDLLを置けば動きます。
でも他の環境でレジストリに登録するのが大変なので(権限がらみで面倒)、登録なしでどうにか動かす事が出来ないでしょうか?
DLLを参照とかしても無理でしょうか?

1017 名前:デフォルトの名無しさん mailto:sage [2022/04/09(土) 09:41:01.85 ID:nJhutFId.net]
レジストリで何を登録してるんだろう?
関数をexportするだけのsusieプラグイン
なんかはレジストリ登録不要で利用できるけど

1018 名前:デフォルトの名無しさん [2022/04/09(土) 13:44:11.76 ID:unOoTfDz.net]
COMだろ
仕様が公開されてればLoadLibrary()して使えるんじゃね?



1019 名前:デフォルトの名無しさん mailto:sage [2022/04/09(土) 14:04:17.62 ID:ehpYMGIZ.net]
DirectShowやMediaFoundationのcodecなら自分で呼ぶわけにもいかんだろうな

1020 名前:デフォルトの名無しさん mailto:sage [2022/04/09(土) 17:06:35.88 ID:fJGplIUn.net]
みなさんレスありがとう。
>>984
たぶんこれなんですよね… やっぱ無理ですかね。

1021 名前:985 [2022/04/09(土) 18:31:18.53 ID:fJGplIUn.net]
今見たら、Video For Windowsの機能を利用してるみたいでした。
こんな古いのを使ってるから専用のコーデックを使わないといけないのか。
コーデックはH.264用のDLLみたいですね。どうにかならないかな。
HKEY_LOCAL_MACHINEにプログラムから簡単に登録出来ればいいんだけど。
なんか良い案はないでしょうか。

1022 名前:蟻人間 mailto:sage [2022/04/09(土) 19:04:00.95 ID:3yKii3E5.net]
権限が必要ならプログラムのマニフェストで権限を要求。
自動化が必要なら、必要なコマンドラインを調べてバッチプログラム化する。

1023 名前:デフォルトの名無しさん mailto:sage [2022/04/09(土) 19:39:38.43 ID:fJGplIUn.net]
>>987
ありがとうございます。調べてやってみます。

1024 名前:デフォルトの名無しさん mailto:sage [2022/04/09(土) 19:45:37.96 ID:s5Ocn4sk.net]
一般的な動画再生ソフトでもコーデックをインストールしないと見れないのがあるが
一方、コーデック内臓もあるので技術的にはインストール不要だとおもうが
やり方はしらん、どっちも

1025 名前:985 mailto:sage [2022/04/10(日) 14:43:33.45 ID:pRTmUSXM.net]
とりあえずはマニフェストの設定変更で、起動した時に権限要求するようにしました。
調べて更に良い方法あればまた変更するつもりです。みなさんレスありがとうございました。

1026 名前:デフォルトの名無しさん [2022/04/14(木) 15:42:21.39 ID:VkbtJkFZ.net]
SIMDの勉強中で、下のようなことをしたいのですが、コンストラクタでエラーになります。
プリミティブ型をアライメント指定してnew,deleteするにはどうすればいいですか?
class MyClass {
public:
MyClass() : member(new (std::align_val_t{32}) int[1000]) {}
~MyClass() { delete[] member; }
int* member;
};

1027 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 16:34:45 ID:4tVKG4Xu.net]
コンパイラの吐き出すエラーは見た?
std::align_val_t を使えるのは C++17以降みたいだけど
そこらへんは大丈夫?

(※ ideone は C++14までやよね?)

1028 名前:991 [2022/04/14(木) 16:56:57.03 ID:VkbtJkFZ.net]
>>992
C++20です。
visual studio 2022でエラーC2956が出ます。
エラーのリンク先には構造体をnewしたい場合の対処法が書かれてます。
対処法:構造体の宣言時にalignas()でアライメント指定する。
プリミティブ型を宣言することができない(?)ので、この対処法では解決できませんでした。



1029 名前:デフォルトの名無しさん [2022/04/15(金) 15:16:32 ID:KM+JgYPL.net]
うめ

1030 名前:デフォルトの名無しさん [2022/04/15(金) 15:16:44 ID:KM+JgYPL.net]
埋め

1031 名前:デフォルトの名無しさん [2022/04/15(金) 15:16:54 ID:KM+JgYPL.net]
ume

1032 名前:デフォルトの名無しさん [2022/04/15(金) 15:17:03 ID:KM+JgYPL.net]


1033 名前:デフォルトの名無しさん [2022/04/15(金) 15:17:12 ID:KM+JgYPL.net]
ウメ

1034 名前:デフォルトの名無しさん [2022/04/15(金) 15:17:37 ID:KM+JgYPL.net]
生め

1035 名前:デフォルトの名無しさん [2022/04/15(金) 15:17:46 ID:KM+JgYPL.net]
産め

1036 名前:1001 [Over 1000 Thread .net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 641日 1時間 25分 58秒

1037 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<311KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef