C++相談室 part153

■ このスレッドは過去ログ倉庫に格納されています
2020/10/10(土) 23:18:20.00ID:i4F+i14Y
https://mevius.5ch.net/test/read.cgi/tech/1589424805/
※前スレ
C++相談室 part152
https://mevius.5ch.net/test/read.cgi/tech/1594528940/

テンプレおしまい
2020/10/21(水) 12:15:19.02ID:EPxGxCCv
関数化やクラス化でプログラムを小さくするわけで、あんまり関係ないな
assertを使うときもそうだが、デバッグ用のコードに副作用を入れちまうのはヘボ以下
2020/10/21(水) 12:41:52.63ID:BgzupaSs
デバッグOffして弊害残すヤツは動作の仕組み把握出来てないだけだろ
>>336、まず貴様のコーディングセンスを磨いてから出直してこい青二才
2020/10/21(水) 23:09:27.50ID:oE8Yb73v
非同期で動くブツ同士の通信はprintfデバッグ大活躍なのでは…
誰がいつ何を呼んで何を渡したのかと呼ばれたほうが本当に受け取ったのかがすぐワカル

printf消去忘れについては条件コンパイルを使えば良いし、
Ad-hocな追加ならいかに大量にやってもソースコード管理システムで安全に消すこともできるわけやし、
2020/10/22(木) 00:49:05.87ID:VEHOj23m
未定義動作踏んでるときとかにprintfを呼び出すことでたまたま動くようにできたりする
ということか
341デフォルトの名無しさん
垢版 |
2020/10/22(木) 10:43:36.11ID:vPWH9GQz
>本当に受け取ったのかがすぐワカル

buffer flush しないと判らんし
flush すると勝手に改行する環境とかあるし
そこまで便利ってほどでもなくね
nonbuffered しろってか
2020/10/22(木) 10:47:06.06ID:ZfML18uZ
ここまでの話をまとめると
やはりprintfデバッグが最強、ということですね
2020/10/22(木) 12:25:12.96ID:QhFI+vyp
#ifdef DEBUG
 #define PUTCHAR(a) (putchar(a), fputc(a, _fpDbg))
#else
 #define PUTCHAR(a) (putchar(a))
#endif
PUTCHAR(*ptr++);
みたいなことをやれば デバッグ時だけ*ptr++ が二回評価されて結果は変わってしまう。
2020/10/22(木) 12:29:38.65ID:PrgepFj3
>>343
インライン関数に置き換えられるだろ
少しは頭使え
2020/10/22(木) 12:30:03.14ID:Pdn6awLx
デバッグ関係ねーじゃん
2020/10/22(木) 12:31:48.09ID:QhFI+vyp
>>344
そんなことは当たり前。
IQが低い人と話すとこれだから困る。
2020/10/22(木) 12:34:55.42ID:PrgepFj3
>>346
わかってるならインラインで書けよ池沼
2020/10/22(木) 12:38:34.09ID:QhFI+vyp
>>347
駄目な例を敢えて書いたんだ。
どうしてそれが分からないの、あなた達には?
IQが高い人には駄目な例が単なる例として出されたのだと分かるのに
ここの人達にはそれがわからない。
2020/10/22(木) 12:39:39.22ID:3l9/RVrp
>>339
非同期なアプリでprintf使うとタイミングが変わることがあるから安心できんな
デバッガよりは遥かに良いけど
2020/10/22(木) 12:41:58.22ID:QhFI+vyp
>>336
「printf デバッグは完成後に printf の行を消すと動かなくなったりするω」
と書いていたが、>>340が指摘した理由だけではないので、
そうなる他の理由の1例を>>343で書いた。
2020/10/22(木) 12:45:00.97ID:QhFI+vyp
これが考える力なんだよ。
マスコミを含めて「知識知識」と言う人が多いが、生まれつきの頭が悪いと
>>344 >>347 のような馬鹿な発想しか出来ないのでどうにもなら無い。
俺に比べれば、おまえが池沼の癖に。
2020/10/22(木) 12:48:35.56ID:t0UpjLw/
マクロを使う必要性が全く感じられなくてリアリティがない
2020/10/22(木) 13:11:57.24ID:PrgepFj3
>>351
おまえ自分のこと頭おかしいと思わないならかなり進んだ病気だな
2020/10/22(木) 14:13:12.96ID:+Chcwfvy
>>353
精神病院に行け。
2020/10/22(木) 16:17:21.51ID:t0UpjLw/
C++の話しねえやつは出てけ
2020/10/22(木) 17:13:27.21ID:Ztx90rC8
C++ラーメン次郎うめえ
2020/10/22(木) 18:56:55.19ID:N0tQIHiY
>>350
たぶんみんなは
そりゃマクロ使えば何でもありありだろ
そんなことでドヤるとかバカじゃねーの
って思ってる…
2020/10/22(木) 19:00:31.57ID:wCIm4hGG
>>335
printfデバッグを肯定するとは
ロートルの吹きだまり感かなりある
2020/10/22(木) 19:08:50.28ID:lftkiv5C
printfごときで騒いでる方が精神いかれてんだろ。。
360デフォルトの名無しさん
垢版 |
2020/10/22(木) 19:11:08.49ID:dQkQeqlj
今はJTAGがあるので、そんなにお金がかからない。
それでも、プロセッサごとにデバッグ環境を用意できるわけないだろ!!というのが日本企業の現状なら、中韓に任せて野菜でも育てる道が効率よい。
中韓は用意できるし、売り切ることが出来る。
printfデバッグなんてインパール作戦と同じ。
物量が違いすぎる。
361デフォルトの名無しさん
垢版 |
2020/10/22(木) 19:15:22.48ID:dQkQeqlj
お前たちは農民に戻れ。
ハイ解散。
2020/10/22(木) 20:52:46.17ID:RiQFyYLu
>>360
私のマザーボードの JTAG/IEEE1149.1 はどれですか?
363デフォルトの名無しさん
垢版 |
2020/10/22(木) 21:09:21.98ID:dQkQeqlj
>>362
OS開発の場合は、専用のボードを用いることを視野に入れる。
それが無理なら、中韓に任せて撤退するべし。
2020/10/22(木) 23:42:23.12ID:PrgepFj3
#ifdef DEBUG
 #define PUTCHAR(a) do{auto b=a;putchar(b), fputc(b, _fpDbg);}while(0)
#else
 #define PUTCHAR(a) (putchar(a))
#endif
死ねザコw
2020/10/23(金) 08:10:45.22ID:DuAJkWLf
センズリマクロ
2020/10/23(金) 12:27:51.26ID:mEDgqyfG
>>364
else節もコピーしろザコw
2020/10/23(金) 12:34:55.69ID:wQpWPNJn
教師が「こういうやり方はしてはなりません」と言っただけなのに、
生徒「そういう場合は、inline使えよ馬鹿教師」
という馬鹿生徒の集まり。
学級崩壊。
2020/10/23(金) 12:38:30.14ID:DuAJkWLf
教師が「こういうやり方はしてはなりません」と言っただけなのに、
生徒A「そういう場合は、inline使えよ馬鹿教師」
生徒B「こういうやり方ならいいんだよ、死ねザコw」
教師「」
2020/10/23(金) 12:48:55.12ID:wQpWPNJn
inline関数や、>>364のやり方が分かった上で教師は言っている。
それとも、おまえらの通った学校の教師はそんなことも分からない
くらい程度が低かったのか?
どこの学校だよ。
2020/10/23(金) 13:33:06.99ID:g1Zoxl1Q
ここは教室じゃねぇんだよバカが
とっととキエロ
2020/10/23(金) 13:52:00.54ID:DuAJkWLf
俺が通った学校の教師か
化学のおじいちゃん先生だったな
当時C++はまだ世に出てなかったから
マクロの使い方は知らなかっただろうな
2020/10/23(金) 15:17:01.62ID:vvEFmscd
へー、Cにはマクロないんだ?
2020/10/23(金) 16:10:04.88ID:HRhvOpQY
>>372
#define マクロはありますが、lisp 様仕様マクロはありません
2020/10/23(金) 16:52:36.06ID:GtGn5ZF1
c++の文句をいって
cの話を延々はじめる
そしてどっちも言い尽くされた話

printfデバッグやってるじじいの特徴
2020/10/23(金) 16:57:39.47ID:DuAJkWLf
>>372
C++が世に出る前っていつ頃かわかってる?
その頃のCを化学のおじいちゃん先生がやってると思ったの?
おまえさんでさえK&R Cなんか使えるのか?
376デフォルトの名無しさん
垢版 |
2020/10/23(金) 17:12:38.69ID:2f10zgGH
DxLib は printfDx で printf 推奨ω
2020/10/23(金) 17:55:43.35ID:vvEFmscd
>>371 ではC++はまだ世に出てなかったからマクロの使い方は知らなかっただろうと言ってるのに
>>375 では化学のおじいちゃん先生がCなんてやってるわけないだろうと言っている

それではC++が世に出ててもその頃のC++なんておじいちゃん先生はやらなかったのでは。
だとすると >>371 はいったい何が言いたかったのか…
2020/10/23(金) 20:21:43.75ID:DuAJkWLf
>>377
同一人物なんだが君は何に見えたのかな??
2020/10/23(金) 20:22:37.35ID:DuAJkWLf
で、君はK&R Cは使えるのか?
2020/10/23(金) 20:23:29.32ID:IQ0Nf1Vk
>>379
K&R1 か K&R2 かを指定してください
2020/10/23(金) 20:32:42.02ID:DuAJkWLf
もちろん1よ
2なんて馬鹿言うわけねえだろ
何が言いたいの? おまえさんは
2020/10/24(土) 00:28:14.62ID:5I5noegP
>>341
>nonbuffered しろってか
別に
非同期要素同士のハンドシェークがうまく行っているかは
callerとcallerの呼び出し順序に崩れが無いことをメッセージの中身とともに確認できればほぼほぼ十分なので
printf()を呼んでから出力されるまでの時間はあんま拘る意味は無い
2020/10/24(土) 02:46:57.76ID:yf0wmlMH
非同期な処理を観察するってのは非同期な処理が「失敗しているかもしれない」のを見つけ出さなきゃいけないってことだよね。
複数のスレッドが競合したりする場合もあるってことだよね。
printf は歳入可能でもないし、問題があるときは printf の処理も信用できないと思うんだけど。

信用できないけどバッファに溜まったまま吐き出されないということはなるべくないようにしたいって話でしょ。
2020/10/24(土) 06:18:58.62ID:S/SsQhb2
printfが再入可能でないってどゆこと? strtokみたいに状態を持つのか?
2020/10/24(土) 08:34:42.41ID:H3Ix9ZgH
スレッドセーフとリエントラントってどう違うの?
2020/10/24(土) 08:40:39.80ID:VP+yyMyu
単一スレッドでも再帰なんかで再入は発生しうる
関数内でクリティカルセクションなどを使ってスレッド同期するようにしていても状態を持つ作りだと同一スレッドからの再入で異常になることはある
2020/10/24(土) 08:44:50.93ID:VP+yyMyu
Cランタイムは通常スレッドセーフだよね
だから複数スレッドでprintfを読んだりerrnoを参照してもよい
Windowsの場合、_beginthreadで作成したスレッドはCランタイム安全、CreateThreadで作成したスレッドはCランタイム安全ではないとかいう話もあった
2020/10/24(土) 11:13:00.25ID:aZOaF4i3
>>385
今、リエントラント(再入可能)という言葉は余り聞かなくなっているが、
ハードウェアに密着したプログラムを書くときに、ハードウェア割り込みの
割り込みルーチンがまだ終わってないタイミングで、同じ割り込みが生じ、
同じルーチンが再帰的に呼び出されることがあり、そのような呼び出しに
対応しているものを「リエントラント」と呼ぶことがあった。
ただし、そのようなプログラムは複雑になりがちなので、ハードウェア
割り込みが生じ、割り込みルーチンがまだ終わってないタイミングで、
同じ割り込みを発生させる原因がもう一度発生しても、割り込みルーチン自体を
呼び出さないようにする手法が使われることが多かった、というか、
その様にプログラムすることが標準とされ、そのためにプログラマブル割り込み
コントローラなるものが、その役割を果たすモードを持っており、それが通常、
有効な状態にされていた。
2020/10/24(土) 11:21:13.53ID:aZOaF4i3
>>388
一方、単一スレッドプログラムの場合、mallocの中からmallocが再帰的に呼び出される
ことはそもそもない。printfも同様。
なので、複数スレッドが動作している場合でも、各スレッドにおいては、
mallocやprintfが再帰的に呼び出されることはない。
そして、mallocを作る場合、Heapに関する重要データを読み書きする時、クリティカルセクション
のようなもので囲って、1つのスレッドだけが読み書きできるようにするような手法が使われる。
この場合、その区間を実行しているのは、最大で1スレッドのみであり、複数スレッドが
同時に実行することはない。
もちろん、malloc自体は同時に複数のスレッドが呼び出しても良いが、malloc内部で重要データ
の読み書きが行なわれるのは、必ず1スレッドのみで、それ以外のスレッドは待機させられる。

割り込みハンドラをリエントラントにする場合には、このようなクリティカルセクション的な
やり方は絶対に使えない。
まず、割り込みハンドラは、実際に実行しているのは1スレッドと言えば1スレッド。
割り込み自体が、1コアしかなかったZ80などにおいても有った概念でもあるし、それは当然であるが。
2020/10/24(土) 12:26:35.65ID:w2qFem8L
おじいちゃん
スレタイ読もうか
391デフォルトの名無しさん
垢版 |
2020/10/24(土) 12:29:55.83ID:+GevKgJx
coutデバッグと言うべきってか
2020/10/24(土) 12:34:34.81ID:UCFHvZt3
>>388
多重割り込みの話と勘違いしてねーか?
同一割り込みなんて起きなくてもメインルーチンで使ってる関数を割り込みルーチンで使う可能性があるならリエントラントでないとおかしくなるよ
そもそもシングルスレッドで割り込み使ってなくてもある関数内で直接的もしくは間接的に自分自身が呼ばれる場合もリエントラントでないとおかしくなる
最近の言語だとグローバル変数とか静的変数使ってなきゃ(例外はあると思うが)リエントラントになるのであまりに気にする必要はなくなった
393デフォルトの名無しさん
垢版 |
2020/10/24(土) 14:30:45.75ID:ZbhxKyMw
ちゅうことはスレッドセーフなloggerが全部同じファイルにログを書き込むんだろ
これもうそのまんま出力に逐一印字させた方がいいんじゃね
394デフォルトの名無しさん
垢版 |
2020/10/24(土) 15:33:28.19ID:H3Ix9ZgH
>>391
いや、厳密にはstd::coutデバッグというべき(ドヤ
2020/10/24(土) 15:35:14.21ID:LXBNuCv6
printf()はスレッドセーフ
複数スレッドから呼べる
規格のどこに書いてあるかは示せないが探せばあるはず
なぜなら、ファイルI/Oやからなあれ

もちろんこれは、printf(("ABC")とprintf("CDE")をそれぞれ別スレッドで呼んだ場合、
ABC、CDEという表示になるという保障にはならないが
実際にはたいていのケースで行単位で分かれてくれるからデバッグには困らない
行が頻繁に混じってしまってデバッグにならないようなら初めて行単位の排他の追加を検討する
みたいな
2020/10/24(土) 15:37:01.80ID:LXBNuCv6
ただしもちろん割り込みルーチンからprintf()を呼ぼうとするような猛者は知らん
火の粉がこっちに降りかからない限り
放っておいて差し上げなさい
2020/10/24(土) 15:38:11.89ID:cYR5fjBG
保障にはならないが〜
実際にはたいていのケースで〜

こういうの一番困る
398デフォルトの名無しさん
垢版 |
2020/10/24(土) 17:06:18.74ID:ZbhxKyMw
printf使ってヘンになってるならまだ許せるが自前のクソloggerが全般的にクソ動作してると排除したくなる
399デフォルトの名無しさん
垢版 |
2020/10/24(土) 17:47:23.40ID:H3Ix9ZgH
非同期シグナル安全な関数のリストにprintfがない・・・
https://docs.oracle.com/cd/E19683-01/816-3976/gen-26/index.html
2020/10/24(土) 17:57:44.41ID:lGAQOfIr
自前でロックすりゃいいだろ
401デフォルトの名無しさん
垢版 |
2020/10/24(土) 18:01:02.56ID:H3Ix9ZgH
printf実行中に割り込みが発生して、なおかつそのhandlerでprintf使ってると
デッドロックが発生する(?)
※printfは内部でmallocを使ってるので、>>389に書いてあるようにheapの
操作時にロックを取得しようとするため
という感じかな?
2020/10/24(土) 18:10:47.63ID:lGAQOfIr
なら自前のprintf作ればいいだろ
標準に頼りきるバカが
2020/10/24(土) 18:13:44.58ID:sM3RwuUT
>>402
>自前のprintf作ればいい
こういう台詞は、その能力の欠けたものが得てして言いがちなことだよなあ‥‥と
2020/10/24(土) 18:32:15.74ID:lGAQOfIr
己の道は己で切り開くものだ
貴様らジャップどもは文句たらたらと言ってるだけで行動に移そうとはしない
猿に退化する課程の獸だな
2020/10/24(土) 18:55:26.18ID:W2/6It6m
>>404
ワイらがジャップだとしたら
お前はいったい何なんだよ
2020/10/24(土) 19:34:38.35ID:kvu4j0jg
>>404
無関係な問題まで何でもかんでも民族や国籍に結びつけて的外れな非難をしようとするとは、怒りに囚われて論理的思考力が壊滅的にダメージを受けてるんだろう。プログラマとしては致命的だなw
2020/10/24(土) 19:40:13.77ID:LXBNuCv6
割り込みルーチンの中からprintfを読んだら危険なのは
一般にOS機能のうちクリティカルセクション(ロック)みたいな高級な機能が
ユーザーが勝手に定義した割り込みルーチンのコンテキストでは使えないからじゃわ;

OSはOSで割り込みを受けてスレッドのコンテキストを管理しているので、
それとは非同期に起きたOSのあずかり知らない割り込みで
OSの高級な機能が呼ばれたらOSの管理情報の排他が崩れる
2020/10/24(土) 19:44:20.88ID:LXBNuCv6
割り込みルーチンから呼んでも安全なprintf()を自力で実装するとしたら
メインのOSとコードベースをまったく異にする必要があるのでOSの自力実装に近くなってくる
やっぱ割り込みルーチンからはprintf()呼ばないというのが一番スマート
409384
垢版 |
2020/10/25(日) 08:15:28.48ID:B8Qi0Gue
聞くんじゃなかった
printf( → fprintf(stdout,
みたいなもんでstdoutが静的記憶域期間とか
そういう説明が聞けるのかと思いきや
なんだこりゃ・・・
2020/10/25(日) 08:36:53.97ID:fEg6VUML
stdoutが静的記憶だとして(大概のOSではIOBで管理しておりそうなっているはずだが
printf()をユーザー定義な割り込みルーチンから呼ぶと
それの排他を安全に行える人がだれも居なくなる、
411デフォルトの名無しさん
垢版 |
2020/10/25(日) 10:46:14.61ID:zd7LSfWt
printfデバッグでダメならputデバッグでいいじゃん
2020/10/25(日) 11:40:46.63ID:luVqTFHx
printfごときでいちいちケチつけやがって陰気なヤロウどもだぜ
2020/10/27(火) 20:01:20.88ID:9N87g439
こいつらは屁理屈言いたいだけでデバッグする気なんて少しもない。
2020/10/27(火) 23:03:02.20ID:1nczmGPR
お金払われればやるよ
2020/10/27(火) 23:23:32.01ID:2LDrYrw3
金もらわないとデバッグしないの?
つまらない人生だね
416デフォルトの名無しさん
垢版 |
2020/10/27(火) 23:25:33.33ID:IA9V1GzZ
そんなに楽しい事ならお前がやれば?
2020/10/28(水) 13:38:51.49ID:6icraQaZ
やらないならクソみたいなこと言ってないで黙ってりゃいいのに
2020/10/28(水) 14:00:21.64ID:a3TqMSUE
普通は成果物に対して報酬を得るよね
バグを出したら潰すのは当たり前

お金払わなきゃデバッグしないとか言ってる人は客先常駐のような労働時間に対して賃金を得る労務提供型なんだろうか
労働者から脱却しないとソフトウェア開発の本当の楽しさを知ることはできない
2020/10/28(水) 14:20:56.34ID:XBU5yUok
1レスの中で矛盾していくスタイル嫌いじゃない

成果に対して報酬があるならお金のためにバグ潰す

時間給なら貰えるお金は変わらないから「バグ潰すのは当たり前」と洗脳したり脅したりしないとバグは潰されない
2020/10/28(水) 14:50:59.10ID:K+lW0Fsg
いや、いるんだよ
他人が書いたコードを有料で引き継ぐ人
414がそうとは見えないけどね
2020/10/28(水) 21:57:28.94ID:bY6aZzj9
つーか普通に仕事してたらちょいちょい
前任者が逃げた、とか潰れた、とか逮捕された、とかで
クソみたいなゴミクソウンコのコードをわたされて
これ保守してねー、みたいなクソみたいな仕事
おしつけられることなんてまれによくあることだろ
そんでなぜかそいつのクソゴミコードのバグを
まるでおれが出したかのように責められる、までがセット
2020/10/28(水) 22:56:44.64ID:a3TqMSUE
ここってサラリーマンが多いのね
2020/10/28(水) 23:22:28.00ID:58wSuA1P
そんなん公然と拒否するか
0から作り直すかの二択だろ
2020/10/29(木) 05:18:26.87ID:A02IsQiB
>>421
そういう状況はママあるけど
> お金払われればやるよ
って言う状況とは違うだろ
2020/10/29(木) 08:31:38.61ID:VBEUGOAK
>>421
担当を引き受けたのなら、過去の潜在バグであってもお前の責務だろ
2020/10/29(木) 15:25:24.71ID:wtO1e/xm
>>423
こういう人間はソフトウェアなんかやらんでコンビニバイトでもやってた方が向いてるよ。
2020/10/30(金) 00:03:30.35ID:Wx+7ZgRN
C++でもPythonの内包表記みたいにVectorの要素舐めていって
全ての要素に特定の処理をしたものを別のVectorに代入することってできますか?
2020/10/30(金) 00:17:54.24ID:V+g0QAOl
まずPython処理系を書きます
2020/10/30(金) 00:26:39.96ID:XbvTe/rK
内包表記に近いことは無理じゃない?
initialize listでもしかして?って思ったけどうまくできそうにない
2020/10/30(金) 08:18:43.66ID:ooe1U4VR
つtransform & lambda
2020/10/30(金) 09:52:48.93ID:5giIBuWJ
std::transform(s.begin(), s.end(), t.begin(), [](int e) -> int { return e * 2 });

きっとforのほうが読みやすくて速いと思う
2020/10/30(金) 10:04:53.11ID:73xlUHi2
あとはvalarrayとかな
433デフォルトの名無しさん
垢版 |
2020/10/30(金) 10:06:43.70ID:uffCAw9U
表現上はあたかもラムダ式使った華麗なことやってるように見えるけど
マジでそう見えてるだけで、コンパイルするとfor文とそんなに変わらなくなるんじゃね

むしろどっかの時点でただのfor文に置き代わったりしてるんじゃないの
2020/10/30(金) 10:22:13.62ID:73xlUHi2
インタープリターよりは速いよ
435デフォルトの名無しさん
垢版 |
2020/10/30(金) 11:34:39.85ID:7MkyV1Cp
https://cpprefjp.github.io/reference/tuple/apply.html
436デフォルトの名無しさん
垢版 |
2020/10/30(金) 11:37:53.83ID:7MkyV1Cp
https://www.fluentcpp.com/2020/02/07/transform-adaptor-equivalent-in-cpp/
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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