C言語なら俺に聞け 154

■ このスレッドは過去ログ倉庫に格納されています
2020/01/14(火) 19:32:30.16ID:SgRnb4BR0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 153
https://mevius.5ch.net/test/read.cgi/tech/1566050562/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/04/08(水) 16:36:56.26ID:do2Qazkj0
>>519
シングルトンならグローバル構造体にして関数を介して読むべきだな
2020/04/08(水) 17:43:28.57ID:VkTQCF2n0
>>516
よくやります。君もやりたまえ。
2020/04/08(水) 18:06:51.24ID:VV8vD69L0
関数仕様(プロトタイプ)を変えたくないとか
関数をたすさん経由するので変更が多いとか
少しでもパフォーマンスをあげたいとか
少しでもリソースをけちりたいとか

理由はいろいろとある
綺麗さよりもそういった事が重要であれば使うこともある
2020/04/08(水) 18:20:05.30ID:do2Qazkj0
パフォーマンス改善の仕事してるけどパフォーマンスのためにグローバル変数使うとか聞いたことないわ
2020/04/08(水) 19:27:06.81ID:vCaQPcU3M
井の中の蛙宣言しても意味無くない?
2020/04/08(水) 20:24:48.12ID:zy2o7H5P0
>>520
別に構造体にする必要は無いじゃん。
しいて言えば、引数でたらい回しにするときこそ構造体が便利で、そういうやり方になるとシングルトンというより this を明示的にやり取りする普通のオブジェクトみたいなもんじゃね。
グローバル変数でシングルトン的に実装するなら、グローバル変数を全部 static にしてソース内にスコープを絞る感じじゃね。
2020/04/08(水) 20:33:22.56ID:zy2o7H5P0
>>523
キャッシュにヒットしやすい配置に並べやすいとか、
引数渡しでは必要なスタックに引数を積み上げるコストを節約できるとか、
戻り値を複数貰いたい場合に余計なポインタや構造体を使う必要が無いとか、
「どの程度」はともかくいろいろありそうだけど。
2020/04/08(水) 21:53:33.85ID:3lkMRJ1l0
>>516
組み込みだとよくあるよ。その方がデバッグしやすいんだと。
2020/04/09(木) 02:17:55.56ID:qzPRDrss0
ICEのメモリダンプでリアルタイムに状態の変化を追跡するのに変数のアドレスがスタックを動き回られては確認しづらいので
グローバル変数で寿命を永続化してアドレスマップを固定アドレス化することはよくある
2020/04/09(木) 07:57:04.28ID:bPuB4yJ40
errnoの悪口?
2020/04/09(木) 11:01:14.49ID:/KG6GbYC0
C言語10年ぐらいやってるけどいまだにエラー機構の正解が見えない
errno使おうかと思ってた時期もあるけど、けっきょく構造体使ってエラーハンドリングしちゃう
2020/04/09(木) 11:29:30.64ID:DMgYiRAM0
>>530
グローバル変数とlongjmp
2020/04/09(木) 11:41:05.77ID:tgAP9EIB0
jmp_bufはグローバルにしちゃダメだよ
2020/04/09(木) 12:28:29.74ID:/KG6GbYC0
>>531
例外みたいに?
そういえばマクロでtry文再現してるライブラリがあったな
2020/04/09(木) 18:27:54.57ID:TSHXR2zEM
>>532
何故に?
2020/04/09(木) 21:06:08.39ID:tgAP9EIB0
>>534
例外ハンドラの階層を構成できなくなるからだ
2020/04/09(木) 21:26:59.30ID:v8J19e77M
>>535
そういうケース限定の話ということね
2020/04/10(金) 06:06:54.66ID:1zuF7RzQ0
限定ってそれ以外に何を考えているんだ?
2020/04/10(金) 09:24:51.46ID:sn6MPl7m0
全てのケースで例外は階層化しないといけないって言う病気にでも罹患してるのか?
最終手段としてトップレベルに抜けるだけにしか使わないとか普通にやると思うけど
2020/04/10(金) 10:17:13.27ID:1zuF7RzQ0
ああexit使うと怒られるから形を変えるってやつね
2020/04/10(金) 11:09:12.87ID:bV/hR7tO0
例外があったらプロセス終了ってw
別にライブラリが呼び出し元に戻る直前の手段として longjmp する場合、jmp_buf はライブラリのソース内の static なグローバル変数でもいいわけで。
グローバルにするかローカルにするかなんてその時の作りに応じて選べばいいだけで、グローバルじゃダメなんて何のルールだよって話なだけだろ。
2020/04/10(金) 12:20:25.35ID:1zuF7RzQ0
別にルールとか言ってねえぜ、勘違いすんなよ
飛ばされては困る処理はない方がレアケースで
だからグローバルはお奨めしないと助言したんだよ
2020/04/10(金) 13:03:17.75ID:VwhukIlHd
例外発生時は自分自身にリセット要求出して割り込み禁止して無限ループ
2020/04/10(金) 13:17:24.64ID:doBqOulyM
>>539
随分低レベルな考え方だなw
通常のエラー処理は戻り値とかでやるけどロジックエラー等の回復不可能なエラーはlongjmpでトップレベルまで戻ってログ吐いて止まるなりリスタートなりするとかだよ

>>541
> 飛ばされては困る処理はない方がレアケースで
階層化の話はどうしたんだよw
2020/04/10(金) 13:35:44.69ID:OARfLwlq0
long long a;
int b;
a >>= 8 * b;
‾‾‾‾‾演算のオーバーフロー
4バイトの値に演算子*を使用し、結果を8バイトの値にキャストしています。
オーバーフローを避けるため、演算子*を呼び出す前に値を幅の広い型にキャストしてください。

シフト演算でも右辺値は左辺値の型にキャストされるのですか?
2020/04/10(金) 15:49:55.13ID:1zuF7RzQ0
>>543
例外はむしろ回復可能なエラーへの対策が主要な用途だぞ
ゲロって止まるって、おまえエラーとバグを混同してるか?

俺は別に階層化の話から逸脱はしてねえぞ
そう思いたいのか?
2020/04/10(金) 16:27:16.96ID:sn6MPl7m0
>>545
> 例外はむしろ回復可能なエラーへの対策が主要な用途だぞ
お前の流儀が主要とか言われても困る

> ゲロって止まるって、おまえエラーとバグを混同してるか?
文章理解力なさすぎだろw
>> 通常のエラー処理は戻り値とかでやるけど

> 俺は別に階層化の話から逸脱はしてねえぞ
飛ばされて困る処理が常に階層化されてると言うのか?

> そう思いたいのか?
お前が(あえてかどうかは知らんけど)書いてないから指摘しただけ
2020/04/10(金) 17:07:36.93ID:bV/hR7tO0
>>544
32bit環境の gcc では特に何も言われないな。
2020/04/10(金) 17:53:11.95ID:1zuF7RzQ0
>>546
俺個人の流儀ではない

エラー処理には返却値を使う方法と例外を使う方法がある
この点はおまえ完全に間違って憶えているようだな

飛ばされて困る処理を確実に実行させるために
階層化とリスローをするんだよ

おまえ何もわかっちゃいねえな
買いかぶってた
2020/04/10(金) 18:07:17.86ID:bV/hR7tO0
ごちゃごちゃ言ってるのを読む気にもならんが、結局グローバルでもいいんだろ?
階層組みたきゃそれができるように実装すりゃいいだけだよな?
的はずれなこと書くと無駄に長くなるってことが分かったな。
はいおしまい
2020/04/10(金) 18:18:19.61ID:rT2v6YFT0
>>542
エレガントです。
2020/04/10(金) 18:31:37.60ID:IOulq41rM
>>548
> エラー処理には返却値を使う方法と例外を使う方法がある
> この点はおまえ完全に間違って憶えているようだな
この点がどの点なのか知らんけど、主要とか言ってたのにやけにトーンダウンしたなw

> 飛ばされて困る処理を確実に実行させるために
> 階層化とリスローをするんだよ
だからそういう流儀もあるというだけの話だろ
で、お前それちゃんとやってるか?
C++みたいに例外発生時にデストラクタが呼ばれる機能がないからちゃんとやろうとするとほとんどの階層毎にsetjmpするはめになること理解してる?

> おまえ何もわかっちゃいねえな
そのまま返すよ

> 買いかぶってた
そりゃどうも、ってかお前に買いかぶられてもなw
2020/04/10(金) 19:42:36.77ID:TdKXcRvJ0
C言語のスレとは思えんほど視野が狭いヤツがいるな

RAM 16バイトのCPUからスーパーコンピューターまで使われてるんだぞ
2020/04/10(金) 19:48:10.23ID:bV/hR7tO0
ケチつける意図は無いけどあんまり小規模な CPU ならアセンブラで書いちゃうかな。
2020/04/10(金) 19:49:12.02ID:GS5sAu5k0
>>548
>飛ばされて困る処理を確実に実行させるために
>階層化とリスローをするんだよ

例外のリスローってよくわからないんですよね
例外を食ってしまわないかぎり飛ばされることはないんだから、リスローって意味がないのでは?
それとも皆んな、例外を食い潰しまくっているのかな?
2020/04/10(金) 19:51:47.29ID:I9hTO0gF0
是非1ビットCPU用のCコンパイラを提供してください
2020/04/10(金) 19:59:25.43ID:GS5sAu5k0
>>555
1ビットCPU が存在するのなら作ってさしあげましょう
2020/04/10(金) 20:05:04.44ID:TdKXcRvJ0
昔1bit CPUもどきがあったような
2020/04/10(金) 20:06:23.04ID:TdKXcRvJ0
http://www.st.rim.or.jp/~nkomatsu/motorola/MC14500.html
2020/04/10(金) 20:56:44.60ID:bV/hR7tO0
>>556
完成が楽しみだ
2020/04/10(金) 21:10:30.64ID:GS5sAu5k0
>>559
1bit の CPU が存在するのなら作りますが、現実には存在しないのでは?
>>558 はプログラムカウンタを持っていない以上、CPU とは言いがたいですね
2020/04/10(金) 21:14:55.95ID:gFmjwv7d0
longjmpて関数の垣根を飛び越えるためのものだろ
jmp_bufをローカル変数になんて有り得なくね?
2020/04/10(金) 21:27:53.89ID:1zuF7RzQ0
>>551
ああ、ちゃんとやってるよ
おまえやってないんだろ?

C++の動きもわかってねえな

>>554
日本語でおk
2020/04/10(金) 21:38:00.03ID:bV/hR7tO0
>>561
setjmp と同じかより深いスコープまたはスタックフレームから戻ってくるだけだから、
setjmp の呼び出し時点で存在しているスコープであればローカルだろうとグローバルだろうと構わないよ。
2020/04/10(金) 21:49:38.93ID:bV/hR7tO0
補足すると、ローカル変数に置いた jmp_buf を呼び出し先の関数から直接参照することはできないから、引数かなにかでポインタを引き回さないといけない。
これ嫌ならグローバル使う感じじゃね。
2020/04/10(金) 22:06:15.16ID:upEOHZmS0
>>560
かっこ悪いぞ。ちゃんと作れ
2020/04/10(金) 22:06:35.43ID:upEOHZmS0
>>560
かっこ悪いぞ。ちゃんと作れ
2020/04/10(金) 22:24:00.75ID:aXPLRrP9M
>>560
プログラムカウンターも1bitじゃないからダメとか言いそうw
2020/04/10(金) 22:26:36.48ID:jlvstp5nM
>>562
> ああ、ちゃんとやってるよ
そりゃすげーな

> おまえやってないんだろ?
うん、性能も悪いしバカみたいだもんw

> C++の動きもわかってねえな
具体的に指摘しなよ
まあ出来ないから悪態しかつけないんだろうけど
2020/04/10(金) 22:34:25.59ID:gFmjwv7d0
>>563
それやるのにlongjmpなんぞ使わないだろって
普通にif (err) return;で戻ってくりゃいいだけじゃん
2020/04/10(金) 22:52:34.09ID:bV/hR7tO0
>>569
それで済むならそうすりゃいいじゃん。
2020/04/10(金) 22:56:16.19ID:bV/hR7tO0
>>569
いや、盛大な理解不足をしてそうだな。
そもそもとして setjmp をしたスコープから上位に出てしまったら longjmp はできないぞ?
setjmp をした時点のスタックが壊れていないことが条件だから。
572デフォルトの名無しさん (ワッチョイ 7b19-/9S9)
垢版 |
2020/04/11(土) 08:18:46.47ID:ESZwWJDK0
時間をトリガーとした実装について質問したいです。2つあります。

1
何時何分という絶対値をトリガーとしてスレッドを起動orコールバック関数の実行をしたいです。
どのような実装したらよいでしょうか。。

2
相対値、例えば何秒後というトリガーで1と同じ制限の処理をしたいときにはどうしたらよいでしょうか。

いずれも、任意個の処理とトリガーをつくりたいです。
POSIXの範囲でできるのが好ましいですが、不可能であればLinuxに依存してもOKです。

よろしくおねげーします。
2020/04/11(土) 09:19:58.59ID:mccf80iK0
つat & crontab
posix準拠
574デフォルトの名無しさん (ワッチョイ 7b19-/9S9)
垢版 |
2020/04/11(土) 09:27:13.95ID:ESZwWJDK0
>>573
一つのプロセスの中でやりたいんですよ。決してシステム管理の一貫ではないです。
2020/04/11(土) 10:02:10.80ID:1yaHqyx7M
>>572
2はsleepしてスレッド起動するだけだろ
1は 目的日時 - 現在時間 を計算して相対値にしてから2と同じ処理をすればいい
2020/04/11(土) 10:30:52.73ID:BTIsFQoK0
>>572
sleepしながら時刻を確認するタイマースレッドでも作れば?
直近の時刻まで時間があるなら大まかにループして、イベント時刻に近づいたら細かくループすればそこそこの分解能と低CPU時間を両立できるんじゃね。
新しいタイマーをリストに加えたらタイマースレッドに signal 投げれば sleep からすぐ戻るから再計算もできるでしょ。
2020/04/11(土) 10:47:05.13ID:qsSqqeEW0
pthread_cond_timedwait
じゃダメなん?
2020/04/11(土) 11:11:32.64ID:BTIsFQoK0
>>577
それでもいいんだろうけど、sleep に比べてこれといったメリットあるかな?
いや、ケチを付ける意図も無けりゃ sleep を推したいわけでもないんだけど、この場合の pthread_cond_timedwait は時間待ちをするだけの目的で使うんだよね?
2020/04/11(土) 11:20:14.71ID:vFamPbGj0
プロセスを都度起動でなく、常駐させる理由を書けば良いと思う
2020/04/11(土) 11:56:15.95ID:qsSqqeEW0
>>578
時間指定じゃなくて時刻指定だから
用途に合ってると思ったわけだが
2020/04/11(土) 12:13:08.97ID:BTIsFQoK0
>>580
なるほど確かに。
2020/04/11(土) 12:31:33.82ID:qsSqqeEW0
時刻にしたのは設計ミスだと思うけど
2020/04/11(土) 20:31:02.14ID:ESZwWJDK0
皆さんありがとうございます
>>576 案は実装ムズそう(KONAMI)
>>577 案をまず試してたい、と思っています
2020/04/11(土) 21:07:01.99ID:U1tTiVMl0
>>568
え、すげーの?????
2020/04/11(土) 21:18:35.44ID:AxqfFildM
>>584
うん、すごい
性能も悪いしバカみたいなことを得意げに語るところがw
2020/04/11(土) 21:29:37.03ID:BTIsFQoK0
例外処理っぽいことをやること自体が目的になってる感はあるな。
ある程度のところへ longjmp したら後は return でいいんじゃねーの?みたいな。
goto 使ってもいいしな。
2020/04/12(日) 06:36:15.91ID:GRbObigC0
>>585
longjmpが性能悪いわけねえだろ
悪いのはおまえの頭だ
2020/04/12(日) 07:04:02.05ID:CkeJkK0DM
>>587
うんlongjmpの性能はたいして悪くないよ
多少悪くてもガンガン呼び出すわけじゃないだろうしね
悪いのはsetjmpとlongjmpの区別もついてない君の頭だと思うw
2020/04/12(日) 07:49:02.13ID:GRbObigC0
なんでsetjmpとlongjmpの区別って話になるの? おまえ精神分裂病なのか?
2020/04/12(日) 08:09:51.13ID:onC+zfyaM
>>589
longjmpの性能とか言ってるのはお前だけ
妄想性障害かよw
2020/04/12(日) 08:27:20.43ID:GRbObigC0
>>590
ああ、性能悪いってのはおまえが書くコードのことか
なるほど551でヘボぶりを露呈したやつだからな
2020/04/12(日) 08:34:51.02ID:3HJi1EoTM
>>591
これまた意味不明なことを言い出したな

> longjmpが性能悪いわけねえだろ
はどうしたんだよw

あと前の話に噛み付くなら
>> C++の動きもわかってねえな
> 具体的に指摘しなよ
にもちゃんとレスしろよな
2020/04/12(日) 08:38:27.27ID:GRbObigC0
>>592
人に教えを請う態度ではないな
乞食野郎
2020/04/12(日) 08:43:03.32ID:GRbObigC0
煽れば情報が出てくると思ってやがる
2020/04/12(日) 08:50:35.16ID:3HJi1EoTM
お前に教えを請う?w

> まあ出来ないから悪態しかつけないんだろうけど
って書いてあることも理解してないのかよ
2020/04/12(日) 08:52:25.41ID:GRbObigC0
かすりもしない想像を開陳されても痛くも痒くもねえぜ
2020/04/12(日) 08:53:25.62ID:GRbObigC0
プログラミングだけでなくプロファイリングもど下手くそだな
頭悪いやつは何やっても同じってことだな
2020/04/12(日) 09:15:25.45ID:y4wlbrQWM
> longjmpが性能悪いわけねえだろ
って書いちゃって顔真っ赤になってはぐらかしに必死w
2020/04/12(日) 09:34:53.23ID:GRbObigC0
正しいことを言ったのに真っ赤になるわけねえだろアホ
もうテキトーこくしかなくなってやんのw
2020/04/12(日) 12:25:24.41ID:NktHaBkmM
longjmpが性能悪い?
どう悪いのか説明してみ
まあどうせまともな説明できないからまたごまかすんだろうけどw
2020/04/12(日) 12:46:20.80ID:XnFqx3xm0
longjumpを使ってループとかしちゃうんじゃないの?
2020/04/12(日) 13:28:21.70ID:/Fi25RTn0
何このスレ
C界隈って民度低いんだね
2020/04/12(日) 13:41:06.57ID:JUoERGEp0
レンジャー部隊のスレです
2020/04/12(日) 16:38:59.01ID:X+MKnNFs0
低きに流れて共に暴れる程度の度量もないのか。ケツの穴のセグメントの小さい奴らめ。
2020/04/12(日) 16:58:27.71ID:YHx2xXt40
GNUのlsのソースで状態遷移を使ったパーサーがあった
なんか自分の知ってる技術が使われてると嬉しくなるな
2020/04/13(月) 14:39:05.17ID:vztTI3R90
longjumpではなくlongjmpな

gccとclで結構違う
http://codepad.org/cm3uAblb
2020/04/16(木) 09:06:42.33ID:kHN+0sn+0
インラインアセンブラで1バイト相対ジャンプ命令使ったとき、
128バイト以上離れても警告されなくて何度もバグったわ。
当時はデバッガー使ってなかったし。
2020/04/16(木) 12:23:43.25ID:dbvXh7HJ0
インラインアセンブラでジャンプとか
2020/04/16(木) 12:30:43.74ID:Vn4RPyR40
流石にアセンブラソース部分のチェックはしてないと思うが
2020/04/16(木) 12:43:36.87ID:rwMm4haa0
アセンブラで条件分岐するにはジャンプは必ず使う
大抵の条件ジャンプ命令は相対ジャンプ
2020/04/16(木) 12:44:21.19ID:zHaHU1HF0
ショートブランチの射程距離ぎりぎりを使うときはうっかりミスなどあり得ない
通常はそんなことになるまでにロングブランチに切り替えるが
それをあえてショートで責める理由があるときは細心の注意を払う
2020/04/16(木) 12:52:02.41ID:dbvXh7HJ0
インラインアセンブラを使うのはせいぜい数行
それより多かったり分岐を含むのは
インラインじゃない普通のアセンブラ
intrinsicで済むのはintrinsicで

ていう考え
2020/04/16(木) 12:55:39.14ID:zHaHU1HF0
だよな
2020/04/16(木) 13:02:03.37ID:t+z6tGpZ0
インラインアセンブラって何のために使うの?
パフォーマンス的にはコンパイラの最適化に任せておいた方がマシな場合が多そうだけど
2020/04/16(木) 13:04:17.71ID:kHN+0sn+0
16bit時代で最適化なんて信用できんかった。
2020/04/16(木) 13:12:21.85ID:dbvXh7HJ0
ならなおさら
インラインじゃない方が良い
2020/04/16(木) 13:34:12.50ID:sXqqJ3Mr0
どうしても SIMD でその部分だけ実装したかった
あとから別のしくみがあることを知った
2020/04/16(木) 13:44:01.42ID:EClU3YdgM
>>614
コンパイラが吐かない命令使いたい時とかデータの特性がわかっててその特性に合わせた最適化したい時とか
2020/04/16(木) 13:51:33.32ID:zHaHU1HF0
rdrand命令とかね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。