C言語なら俺に聞け 154
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ bf63-lB9F)
垢版 |
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
0455デフォルトの名無しさん (エムゾネ FF43-8H9x)
垢版 |
2020/04/02(木) 18:32:26.76ID:4X8ewqwSF
>>452
もちろんそのセグメントで扱えるブロックの範囲の先頭に戻る
そういうときはセグメントレジスタの方の値を増やさないと無理
0456デフォルトの名無しさん (エムゾネ FF43-8H9x)
垢版 |
2020/04/02(木) 18:35:21.60ID:4X8ewqwSF
>>452
誤解されそうなので補足だけど
>0x0EFFF0を指すfarポインタで ++ しながらメモリアクセスした場合
セグメントレジスタ 0x0EFFF
ポインタ 0x000F
なら 0x0EFFFF にアクセス出来るし
セグメントレジスタ 0x0EFFF
ポインタ 0x0010
なら 0x0F0000 にアクセス出来る
0457デフォルトの名無しさん (ワッチョイ 253d-5QI3)
垢版 |
2020/04/02(木) 18:58:03.66ID:SCUy7Ffk0
>>456 >>453
ああなるほど、セグメントレジスタは16倍してオフセットに加算されるんですね
勘違いして認識していました、ありがとうございます
そうなるとfarポインタでも基本的には64KBまでならそのままアクセス可能そうですね
0459◆QZaw55cn4c (ワッチョイ e3aa-5LkK)
垢版 |
2020/04/02(木) 21:33:11.59ID:F2YXKB2C0
>>447
オフセットがあふれてもセグメント部分はインクリメントしない、したがって 64 KB を超えて連続アクセスはできない
0463デフォルトの名無しさん (ワッチョイ b501-j0VC)
垢版 |
2020/04/03(金) 01:16:56.77ID:rS9EMaRY0
>>457
16ビットと一言で言ってるけど、x86の場合リアルモードとプロテクトモードでセグメントの扱いは全く異なるから注意
16倍して足すだけなのは前者のとき(DOSとか)
Windows3.1は後者
0468デフォルトの名無しさん (ワッチョイ e5ca-Otsn)
垢版 |
2020/04/03(金) 20:59:00.91ID:15ER3YJX0
>>464
条件が成立してるはずなのにどうしても走らないコードがあり、コンパイラの最適化のバグで処理が消えたと思い最適化のスイッチをいろいろいじり、
それでもだめでコンパイラ自体のバグを疑い吐かせたアセンブラソースに処理コードが吐かれてないことを確認して、
ほれ見たことかコンパイラが悪い!と報告を上げた後でコメントの */ が抜けてることを発見した俺には敵うまい。
0469デフォルトの名無しさん (ワッチョイ 6db3-ii8Z)
垢版 |
2020/04/04(土) 00:47:19.29ID:qMa2xGJ10
私はいくつかコンパイラのバグを見つけたけどね
見つけた時は発生する最小形にしてから報告

コンパイラのバグだとさわぐヤツの99%は自分のバグ
ってのは同意
0472デフォルトの名無しさん (ワッチョイ 230e-bVUD)
垢版 |
2020/04/04(土) 08:44:49.54ID:glhU6EPt0
99%もそんなアホいるのか?
コンパイラのバグを疑った場合まず最小の再現コード作るだろ
で、バグレポに条件と現象を書くわけだが
自分が悪い場合はそこで必ず気付くことになる
0473デフォルトの名無しさん (ワッチョイ 4bd2-bVUD)
垢版 |
2020/04/04(土) 09:28:47.06ID:oeIO06yp0
>コンパイラのバグだとさわぐ
× こういう風に書いたのですがxxのコンパイラなら問題ないのにxxxの方だと誤作が(ry
〇 xxxつかったら動かねぇ!!ソースに間違いは無い!!クソコンパイラ!!謝罪と賠(ry
0476デフォルトの名無しさん (ワッチョイ 23ad-Ujw5)
垢版 |
2020/04/04(土) 13:15:20.63ID:SI4lxjMM0
>>468
負けた。君に勝ちを譲ろう。
0478デフォルトの名無しさん (ドコグロ MM43-5poS)
垢版 |
2020/04/04(土) 13:29:50.17ID:3Wwr2fKwM
10年くらい前でもマクロのネストが多いとかでInternalエラー吐く処理系はあったよ
本来ちゃんとエラーチェックして適切なエラーメッセージ出すべきなんだろうけどほとんどありえないような状況にどこまで対応すべきかって話はなかなか難しいものがある
まあそれと処理系のバグとは別の話だが
0484デフォルトの名無しさん (ブーイモ MM6b-eRVI)
垢版 |
2020/04/05(日) 00:53:15.82ID:8lfN7LOTM
cでコンパイラがゲロる複雑に成るって三項演算子をネストするくらいだろ
c++はテンプレートでわりあい簡単に混乱を引き出せるけどCのメタ構築機能はゴミみたいなもんだし
0486デフォルトの名無しさん (ワッチョイ 6db3-ii8Z)
垢版 |
2020/04/05(日) 07:26:24.26ID:c+nOX//s0
人間にとっての複雑とコンパイラにとっての複雑化はまったく違う

演算子のネストなんて3項じゃなきゃ普通にやってることで
コンパイラにとっては普通のこと

3項演算子の結合は特殊なので
人間にとっては複雑なのは間違いないけど
0490デフォルトの名無しさん (JP 0H93-3bw/)
垢版 |
2020/04/05(日) 11:43:40.11ID:pjXS/HuIH
4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0

ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0

SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
0493デフォルトの名無しさん (ワイーワ2 FF93-8H9x)
垢版 |
2020/04/05(日) 14:56:50.54ID:P07lI1PFF
A ? B : C;
A ? B ? D : E : C ? F : G;
(A ? B ? D : E : C) ? F : G;
A ? B ? D : E : (C ? F : G);
0495デフォルトの名無しさん (ワッチョイ e5ca-Otsn)
垢版 |
2020/04/05(日) 15:03:37.61ID:bk3bMB+g0
コンパイラにとって複雑というのは、構文木が深くなる、とどのつまり項の多い長い文なんじゃない?
昔のコンピュータはメモリが足りなかったから深い木は扱えなかったってことでしょ。
0496デフォルトの名無しさん (ワイーワ2 FF93-8H9x)
垢版 |
2020/04/05(日) 15:58:31.05ID:PRah2HwrF
>>494
人間には右につなげる方が見やすいのかも知れないが
コンパイラ的にあいまいさが無いのは左(内側?)に入れていく方だと思う

Pythonのはさらに結合の優先度が判りにくい気がする(慣れてないだけかも知れない)
0500デフォルトの名無しさん (ワッチョイ 6db3-ii8Z)
垢版 |
2020/04/07(火) 07:11:26.19ID:Aukj6IXD0
? を if と同じように改行 & インデントすればいい

A ?
    B ? D : E :
    C ? F : G;

A
    ? B ? D : E
    : C ? F : G;
0506デフォルトの名無しさん (ワッチョイ 23ad-Ujw5)
垢版 |
2020/04/07(火) 12:46:52.50ID:rrWnJIGn0
この世には括弧というものがあってだな・・・
0509デフォルトの名無しさん (ワッチョイ 23ad-Ujw5)
垢版 |
2020/04/07(火) 23:16:28.11ID:rrWnJIGn0
Kotlinは思い切って三項演算子なくした代わりにifを式にしちゃったよ。
他の言語からのパクリだとは思うが、val a = if (x == y) b else c のような書き方ができる。
0512デフォルトの名無しさん (ワッチョイ 8252-b+QY)
垢版 |
2020/04/08(水) 03:26:20.58ID:5a3Kp3Hv0
>>511
ダメと言われている三項演算子を使ってません!と言えることかなw

一つあるとしたら、ネストさせたときに if ... else if ... else if ... else とできることか。
式の中に文のような表現が入る気持ち悪さがあるから、三項演算子の方がまだましな気もするが。
0514デフォルトの名無しさん (ワッチョイ 8252-b+QY)
垢版 |
2020/04/08(水) 09:37:01.78ID:5a3Kp3Hv0
>>513
どこかのコーディング規約や一部の教条主義者の間で言われてるみたいだよ。(>>512前段はそれを揶揄したつもり。)
俺自身は三項演算子は分かりやすさを損なわない範囲で使うのは大好きだし、>>502の前者の書き方はよく使う。
0522デフォルトの名無しさん (ワッチョイ ebb3-aNAp)
垢版 |
2020/04/08(水) 18:06:51.24ID:VV8vD69L0
関数仕様(プロトタイプ)を変えたくないとか
関数をたすさん経由するので変更が多いとか
少しでもパフォーマンスをあげたいとか
少しでもリソースをけちりたいとか

理由はいろいろとある
綺麗さよりもそういった事が重要であれば使うこともある
0525デフォルトの名無しさん (ワッチョイ d7ca-BKMK)
垢版 |
2020/04/08(水) 20:24:48.12ID:zy2o7H5P0
>>520
別に構造体にする必要は無いじゃん。
しいて言えば、引数でたらい回しにするときこそ構造体が便利で、そういうやり方になるとシングルトンというより this を明示的にやり取りする普通のオブジェクトみたいなもんじゃね。
グローバル変数でシングルトン的に実装するなら、グローバル変数を全部 static にしてソース内にスコープを絞る感じじゃね。
0526デフォルトの名無しさん (ワッチョイ d7ca-BKMK)
垢版 |
2020/04/08(水) 20:33:22.56ID:zy2o7H5P0
>>523
キャッシュにヒットしやすい配置に並べやすいとか、
引数渡しでは必要なスタックに引数を積み上げるコストを節約できるとか、
戻り値を複数貰いたい場合に余計なポインタや構造体を使う必要が無いとか、
「どの程度」はともかくいろいろありそうだけど。
0528デフォルトの名無しさん (ワッチョイ 67da-RYyP)
垢版 |
2020/04/09(木) 02:17:55.56ID:qzPRDrss0
ICEのメモリダンプでリアルタイムに状態の変化を追跡するのに変数のアドレスがスタックを動き回られては確認しづらいので
グローバル変数で寿命を永続化してアドレスマップを固定アドレス化することはよくある
0530デフォルトの名無しさん (ワッチョイ a2c5-KRXG)
垢版 |
2020/04/09(木) 11:01:14.49ID:/KG6GbYC0
C言語10年ぐらいやってるけどいまだにエラー機構の正解が見えない
errno使おうかと思ってた時期もあるけど、けっきょく構造体使ってエラーハンドリングしちゃう
0538デフォルトの名無しさん (ワッチョイ e201-Y19k)
垢版 |
2020/04/10(金) 09:24:51.46ID:sn6MPl7m0
全てのケースで例外は階層化しないといけないって言う病気にでも罹患してるのか?
最終手段としてトップレベルに抜けるだけにしか使わないとか普通にやると思うけど
0540デフォルトの名無しさん (ワッチョイ d7ca-BKMK)
垢版 |
2020/04/10(金) 11:09:12.87ID:bV/hR7tO0
例外があったらプロセス終了ってw
別にライブラリが呼び出し元に戻る直前の手段として longjmp する場合、jmp_buf はライブラリのソース内の static なグローバル変数でもいいわけで。
グローバルにするかローカルにするかなんてその時の作りに応じて選べばいいだけで、グローバルじゃダメなんて何のルールだよって話なだけだろ。
0543デフォルトの名無しさん (ドコグロ MM2b-Y19k)
垢版 |
2020/04/10(金) 13:17:24.64ID:doBqOulyM
>>539
随分低レベルな考え方だなw
通常のエラー処理は戻り値とかでやるけどロジックエラー等の回復不可能なエラーはlongjmpでトップレベルまで戻ってログ吐いて止まるなりリスタートなりするとかだよ

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

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

俺は別に階層化の話から逸脱はしてねえぞ
そう思いたいのか?
0546デフォルトの名無しさん (ワッチョイ e201-Y19k)
垢版 |
2020/04/10(金) 16:27:16.96ID:sn6MPl7m0
>>545
> 例外はむしろ回復可能なエラーへの対策が主要な用途だぞ
お前の流儀が主要とか言われても困る

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

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

> そう思いたいのか?
お前が(あえてかどうかは知らんけど)書いてないから指摘しただけ
0548デフォルトの名無しさん (ワッチョイ 620e-AglQ)
垢版 |
2020/04/10(金) 17:53:11.95ID:1zuF7RzQ0
>>546
俺個人の流儀ではない

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

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

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

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

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

> 買いかぶってた
そりゃどうも、ってかお前に買いかぶられてもなw
0554◆QZaw55cn4c (ワッチョイ c2aa-zNgl)
垢版 |
2020/04/10(金) 19:49:12.02ID:GS5sAu5k0
>>548
>飛ばされて困る処理を確実に実行させるために
>階層化とリスローをするんだよ

例外のリスローってよくわからないんですよね
例外を食ってしまわないかぎり飛ばされることはないんだから、リスローって意味がないのでは?
それとも皆んな、例外を食い潰しまくっているのかな?
■ このスレッドは過去ログ倉庫に格納されています

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