C言語なら俺に聞け 155

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
垢版 |
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0
!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言語なら俺に聞け 154
https://mevius.5ch.net/test/read.cgi/tech/1578997950/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
226デフォルトの名無しさん (アウウィフ FF11-B5RW)
垢版 |
2020/06/07(日) 17:27:43.06ID:ABh2E5hxF
>>224
excelのカラム名だな
2020/06/07(日) 17:53:13.82ID:H9nBLvae0
>>215, >>219
それ桁数でカウントしてるだけでN進数と言うのは無理あるだろ
228デフォルトの名無しさん (アウウィフ FF11-B5RW)
垢版 |
2020/06/07(日) 17:56:40.04ID:ABh2E5hxF
定義上は間違ってない
0の桁上がりが00で次が000なら成立してる
2020/06/07(日) 18:51:19.67ID:H9nBLvae0
まあお前の定義ならそうなんだろうな
2020/06/07(日) 18:58:57.43ID:Hm2+3fRX0
>>226 確かに「Excelのカラム」がこれだね。
範囲指定の時にマウスポインタを暴走させるとちょくちょく目にする。
身近な実例なのに思いつかなかった。

それにしてもワッチョイの英数部分(何て呼ぶんだろ?)が FF11 とは。
231デフォルトの名無しさん (アウウィフ FF11-B5RW)
垢版 |
2020/06/08(月) 15:49:07.32ID:blut5LG8F
#
2020/06/10(水) 18:58:49.17ID:feWbpc5y0
今このスレ見返してたんですが
gcc -W -Wall
って意味あるんですか? -Wallオプションだけと何か違うの?
2020/06/10(水) 21:32:32.29ID:OTs8rmHM0
>>232
私も gcc/clang でそのオプションを好んでいます、理由はしりません…
2020/06/10(水) 22:37:56.41ID:GAHb3hGx0
>>232
俺も気になって調べてみたら出てきた
https://at-aka.blogspot.com/2006/11/gcc-wall-w.html
2020/06/10(水) 23:10:40.06ID:tM8DbNAJ0
>>234
なるほど
https://linuxjm.osdn.jp/html/GNU_gcc/man1/gcc.1.html
このページを見た限り-Wは-Wallに含まれてるのかなと解釈してました
どうもです
2020/06/11(木) 06:19:27.46ID:zR4s1lAr0
man gcc を見ると -Wextra のところに This option used to be called -W.
と出てるね。日本語だと「かつては -W と呼ばれていた」で合ってるだろうか。

-W を指定することと -Wextra を指定することは同じ効果かな。
2020/06/18(木) 12:45:08.73ID:5LdPXPiS0
clやgccのassertって生真面目にabortしてうざいね
イベント1001なんか記録してくれなくていいのに
238デフォルトの名無しさん (ワッチョイ 8f01-pPzt)
垢版 |
2020/06/24(水) 12:01:11.31ID:T7mdaPsT0
元気があればなんでもできる。
Cさえ出来ればなんでもできる。
2020/06/25(木) 07:45:23.79ID:1LmSFJHY0
正しライブラリーは付属しません。
2020/06/25(木) 08:00:17.88ID:Nd1uEPT+0
C書いてる人ってみんな可変長配列とかリストとか木構造とかグラフとか自前で書けるよな?
2020/06/25(木) 08:01:55.58ID:XUZZkb7Yd
木構造⊂グラフ
2020/06/25(木) 08:03:09.05ID:XUZZkb7Yd
最近勉強して書けるようになったから嬉しいの?
2020/06/25(木) 08:06:39.00ID:Nd1uEPT+0
<3
244デフォルトの名無しさん (ワッチョイ 8f9b-/Fs/)
垢版 |
2020/06/25(木) 11:19:49.85ID:2XRewe5U0
>>240
自己参照構造体とか普通に使う
2020/06/25(木) 11:30:04.55ID:N8mY4JDD0
>>240
プロのミュージシャンは「蛙の歌」くらい自分で弾けるよな? くらいのシュールな質問だ
2020/06/25(木) 12:01:03.23ID:6D953TAQ0
最近覚えた言葉を使ってみました
2020/06/25(木) 12:24:56.81ID:9JLqMYSrM
職業画家ならピカソのイタズラガキぐらい描けるよな?
2020/06/25(木) 12:37:09.65ID:Nd1uEPT+0
<3
2020/06/25(木) 12:50:41.05ID:VB93ltO10
単なるそういう構造でも感心するような実装ができたらすごいけどな。
メモリ管理は奥が深いよ。
2020/06/25(木) 13:27:45.77ID:HOWmpZqad
名前が付いてるようなのは既存のを使えば良い
付いてないような複雑な構成、特殊な構成のものがさらっと作れるようになって一人前

名前が付いてる構造をただ列挙して喜んでるようなのは初心者
251デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/25(木) 13:32:44.25ID:CW3F7rpu0
>>240
API使うから見たこともない。
2020/06/25(木) 17:18:14.56ID:f73tPHfd0
カーニハンが引用して有名になったフレーズだったと思うけど
「職業プログラマーでも二分探索を正しく実装できる者は意外なほど少ない」
ってのと似てる感じね。
出典はベントリーさんの記事だったかな。

で、ベントリーさんが出してる二分探索ルーチンの例が
(細かいこと言えば)誤ってるというお見事なオチ。
2020/06/25(木) 17:22:50.60ID:f73tPHfd0
いかん、カーニハンさんに「さん」付けるの忘れた。
カーニハンに「さん」を付けるとなんか座りが悪い気がするんだよ。
べつに「ハン」は関西弁の「〜はん」じゃないのだけど。
2020/06/25(木) 17:28:33.47ID:EHXNgq1Pd
アカデミックな文章のなかでは敬称略はデフォやん
2020/06/25(木) 17:53:32.70ID:Yy8QFoSC0
インブリードチェックとかねー
掘り掘りの打ち切り確認とか
可変配列で返せると効率的なのに記述や関数使用方法がCでは面倒くさいという
web上のサラブレッド血統表のインブリードどこも結構いい加減な自動抽出だし
2020/06/25(木) 17:55:14.95ID:5kqDetxy0
飴ちゃんみたい、蟹はん。
2020/06/25(木) 17:58:50.94ID:f73tPHfd0
>>254
そこは俺の投稿はアカデミックじゃなくて井戸端の噂話くらいなモンってことで。
何なら便所の壁に描かれた傘差したネズミの落書きでもいいのだが。
2020/06/25(木) 21:13:44.78ID:VB93ltO10
>>252
正しく実装ってのが何を指してるのかよく分からないけど、その解説ってどこかにある?
2020/06/25(木) 23:23:06.88ID:Dxq2c9AW0
2ch (5ch) ではカーニハンは蟹飯とか呼ばれたりするのも普通だからなー。
さんを付けた方がすわりが良いと思うなら付けてもいいが、
ここでは雑に言っても文句は出ないよ。

敬称を付けなきゃ敬意がないってわけでもないし。
2020/06/25(木) 23:35:03.55ID:kZgmLzec0
蟹めしとしか読めない。
2020/06/26(金) 07:00:11.04ID:Ks2Lu7GD0
>>258 の人に質問されたのでちょこっと書庫をひっくり返してみた。
書籍資料しか示せないし、古い本だから見つけるのは大変かも知れんけど。
今回は「さん」無しで書かせてもらう。人名が多くてやかましくなるでな。

カーニハンによる言及は『プログラミング作法』(ASCII)の第2章。
見直して気づいたけどベントリーからの直接の引用ではなかった。
あと、この本はカーニハンとパイクの共著だったので訂正させてもらう。

ベントリーによる2分探索法は『プログラム設計の着想』(近代科学社)の第4章。
ここに「ベル研とIBMで試したら2時間かけて正しく書けたのは10%」と出てる。
この章をまるまる使って、二分探索ルーチンを題材に、正しいプログラムを書く
手順を説明してるが、使用言語は擬似コードとBASICの方言。


補足としてネット情報 Wikipedia 「二分探索」ページ
特に「実装上の間違い」の部分が興味深いかと。
2020/06/26(金) 07:30:17.89ID:zNtEkj210
>>261
丁寧にありがとう。
確かにやらかしてたわw
2020/06/26(金) 07:30:54.43ID:CbN2WAX/d
見てみたけど...

アルゴリズムの問題じゃなくて
ただのインデックスのオーバーフローか

インデックスが計算途中でオーバーフローする心配をするなら
要素数自体がintの範囲を越える心配やメモリ不足の心配もしないと
2020/06/26(金) 07:33:24.14ID:CbN2WAX/d
intじゃ足りないかもしれないから
size_tじゃないとバグとか言い出すのか
くだらん
2020/06/26(金) 07:37:26.08ID:CbN2WAX/d
斜辺を求めるコードも
sqrt(a*a+b*b)
なんて書いたらバグだと言われちゃうね
2020/06/26(金) 07:53:21.24ID:R6SXx1iE0
まあ、ビット数の少ないCPUを使ってた頃はオーバーフローで実際にバグの挙動を示していたこともあったのかもね。
64bitになって、今しばらくはインデックスの足し算をいい加減な順番で行ってもオーバーフローになるほど実メモリが積めなそうだけども。
2020/06/26(金) 08:08:32.76ID:tBxKhrZw0
>>265
aとbがintなのにキャストしないタコいたら許さん
2020/06/26(金) 08:22:33.07ID:zNtEkj210
>>263
だからアルゴリズムじゃなくて実装の問題だって話なんだろ。
そして型が int だとか size_t だとかの問題でもない。
どんな型であろうと計算の途中でその型をオーバーフローする可能性がある式だというのが問題であり、扱ってるデータではオーバーフローしないことを意識した上でそういう式を選んでるのかたまたまそういう条件になってるのかは大違いってこと。
最近は64bitだからいちいちそんなこと考える必要もないというなら、それは違うだろと(検索対象がメモリで64bitに及ばないメモリ量の環境でしか使わないコードだという考慮くらいは必要)。
特にライブラリなんかでは、インデックスの許容範囲がその型の許容範囲より狭いならば明記しなければならない。
2020/06/26(金) 08:51:08.83ID:ulI8ykG3d
>>268
>>265もバグという主張だね?

>>267
a, b はdoubleとする
2020/06/26(金) 08:55:01.02ID:ulI8ykG3d
単純な数値計算も簡単じゃなくなるね
大変だ

>>268
底辺a, 高さbの三角形の面積を返す関数を書いてみて
2020/06/26(金) 09:27:28.43ID:zNtEkj210
>>269
扱う値の範囲をなんの考慮もせずに書いたコードがたまたま動いてるならバグと言うかはともかく考慮漏れだわな。
巨大な空間で距離を計算する話だったら、とりあえず式が double で足りるかくらい考えるだろ?

>>270
オーバーフロー回避を意識する必要があるなら a / 2 * b とか?
整数型なら a / 2 * b + a & 1 かな?
扱う値によって型なり式なりを選べってことだよ。
2020/06/26(金) 09:39:45.10ID:zNtEkj210
>>271
a & 1 にカッコ忘れてるのは多目に見て
2020/06/26(金) 10:09:23.28ID:zNtEkj210
>>271
三角形の整数の計算式は全然ダメね。
書き直す気も無いけど、値の範囲に適用する式と型の考慮が必要ってのが言いたいことね。
2020/06/26(金) 10:12:30.36ID:DHczgJjy0
ビットand の & の優先順位が低いのがすげー気になるマン
2020/06/26(金) 10:24:55.68ID:0ez7fC22d
>>271
aが小さいとダメだからバグです
2020/06/26(金) 11:51:33.67ID:CsRb/b6RM
確かに、掛け算並みに優先度高くても良い気がする
2020/06/26(金) 12:06:06.43ID:wPd6FHznd
比較より低いのは仕様バグだな
2020/06/26(金) 12:54:54.87ID:hOK/Kg/V0
a,bがdoubleでsqrt(a*a+b*b)以外にどう書けと
2020/06/26(金) 13:34:59.23ID:zNtEkj210
>>278
もし double でも計算途中でオーバーフローする可能性があるなら、最初に適当な係数の平方で a b を割って計算してから係数を掛けるとか?
あるいは long double が使えるなら単純にそれで計算するとか。
逆に言えば、オーバーフローする可能性があるならなんとかしないといけないわけだから、なんの変形もせずオーバーフローするに任せたらそれこそバグでしょうよ。
2020/06/26(金) 13:41:41.84ID:zNtEkj210
>>279
また嘘言った
後で a b 共に2乗するんだから係数の平方じゃなくて係数そのもので割るんだね。
すまん
2020/06/26(金) 14:27:07.38ID:QICJMmXvM
doubleでオーバーフローって、10の何乗を想定してる?
2020/06/26(金) 15:19:41.24ID:gU0A9MqI0
aとbの差が大きいときでしょ
2020/06/26(金) 15:43:00.88ID:QICJMmXvM
それオーバーフローじゃないし、
情報落ちのことだとすればsqrt(a*a+b*b)をどう工夫して防げと?
2020/06/26(金) 16:10:21.31ID:tBxKhrZw0
>>281
1.79769e+308
まさか、これを知らねえんじゃねえよな
2020/06/26(金) 16:42:15.29ID:QICJMmXvM
で、宇宙の観測可能な距離をヨクトメートル単位で表したら?
2020/06/26(金) 16:44:50.44ID:R6SXx1iE0
デカルト距離は物理的な空間でしか使われないわけじゃないしなあ(屁理屈
2020/06/26(金) 17:02:33.96ID:tBxKhrZw0
64bitあれば大きいほうはエクサ、小さい方はアトまで扱える
今飲んでるコーヒーの液面からカップの底までが1アトパーセクくらい
288デフォルトの名無しさん (ワイーワ2 FFbf-/Fs/)
垢版 |
2020/06/26(金) 17:41:45.88ID:PjbtVFt+F
>>282
aに対してbがはるかに小さいとして
sqrt(a*a+b*b)がaになってもあまり困らない
2020/06/26(金) 17:47:26.42ID:zNtEkj210
double で何やったらオーバーフローするのかってことじゃなく、必要な対象を計算するのに必要な型や計算手順は何かってことだろ。
掛け算や指数を扱うならオーバーフローについては普通に考慮するもんだと思うけど、そうじゃないのか?
今扱おうとしてる対象について考慮してるから double なら大丈夫だと考えてるんだろ。
で二分木については足し算がオーバーフローする可能性が盲点ってことで、なるほどと思うべき所だろ。
アルゴリズム上も計算途中に最初に与えた imax を超える値が現れるようには見えないんだから。
今時 double も 64bit整数も当たり前だったとしても、SIMD使いたいからデータ長を抑えたいなんてこともあるでしょ。
290デフォルトの名無しさん (ワイーワ2 FFbf-/Fs/)
垢版 |
2020/06/26(金) 17:54:06.22ID:PjbtVFt+F
一般論で答えても叩かれる
質問内容に特化して答えても叩かれる
どうしろと
2020/06/26(金) 17:56:45.81ID:9etEQyfpM
俺くらいになればケッセルランを12パーセクで飛ぶくらい余裕
2020/06/26(金) 19:11:05.35ID:EPLAnBEId
>>289
通常使わない範囲の心配を無条件で(コストをかけてでも)するべき
なんて主張はあほ

その例が>>265
2020/06/26(金) 19:13:45.24ID:EPLAnBEId
>>278
いくらでも方法がある
ldexp / frexp を使うのが普通かな
294デフォルトの名無しさん (アウアウウー Sad3-u/pE)
垢版 |
2020/06/26(金) 21:15:32.77ID:TyyL07+Ya
>>240
みんなかどうかは知らんがおれは書けるな
295デフォルトの名無しさん (アウアウウー Sad3-u/pE)
垢版 |
2020/06/26(金) 21:18:13.75ID:TyyL07+Ya
>>253
カニチャーハン
2020/06/26(金) 21:39:07.24ID:/YkOh9yY0
int x=0;
int y=(x=1)+(x=2);
とするとyが4になってしまいます。
3だと思うのですが。
2020/06/26(金) 21:43:56.84ID:9IxUvn/4H
>>271
>オーバーフロー回避を意識する必要があるなら a / 2 * b とか?
それは回避したことになりません、演算子 / 2 と * b のどちらが先に処理されるかはコンパイラが籤引きで決めるか独断偏見で決め打ちするのでは?
2020/06/26(金) 21:46:49.80ID:9IxUvn/4H
>>296
https://ideone.com/w2FJBE
……
そんなことがあるんだ…
299デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/26(金) 21:52:32.85ID:Sd6G194T0
逆にして(x=2)+(x=1)
だと 2 だね
https://ideone.com/MbXZtz
2020/06/26(金) 21:54:17.86ID:gtOtInFM0
>>296
副作用は副作用完了点までのどこかで起こることになっているのでそういうこともある。
っていうか普通は警告が出るでしょ。
301デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/26(金) 21:57:33.08ID:Sd6G194T0
int x=0;
x=1;
x=2;
int y=x+x; //(2+2)
という話になっているのだと思われ
302デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/26(金) 22:03:10.60ID:Sd6G194T0
あとは優しいおじい・・紳士様がアセンブラでは実際どうなっているかを解説してくれるはず
2020/06/26(金) 22:32:16.04ID:zNtEkj210
>>297
自信を持っては言えないけど、/ 2 してから * b するのとその逆とでは結果が違うんだから、書いた式と結果が異なる可能性がある計算順にコンパイラがいじるものかね?
例えば各項を関数として a() / c() * b() にした場合、a 〜 c がどの順で実行されるか、つまり項の評価順は保証されないけどそれら結果を使った計算順は式通りになるんじゃないの?

でももし仮にそういう懸念があるなら、カッコ付けるなりそれでだめなら2手に分けるなりすればいいんじゃね。
2020/06/26(金) 22:48:16.05ID:GYQIE3peM
>>302
アセンブラだとxに2入れて、yに4入れて、おしまいだろうな。
2020/06/26(金) 23:31:20.43ID:ONx8T6wJ0
誰も逆汗しないのな。
一昔前だったら
A「俺がやってみるから待ってろ。」
B「いや、俺がやるから(ry」
C「いやいや、俺こそが」
AB「「どうぞどうぞ」」
の前振りだったのに。

VC++2019のデバッグモード
int y = (x = 1) + (x = 2);
00C118FF mov dword ptr [x],1
00C11906 mov dword ptr [x],2
00C1190D mov eax,dword ptr [x]
00C11910 add eax,dword ptr [x]
00C11913 mov dword ptr [y],eax

最適化したら 304 になるんだろうけど。
2020/06/26(金) 23:34:17.38ID:GYQIE3peM
クソ冗長なコードだな
2020/06/27(土) 00:56:28.31ID:VCabyp7F0
>>297
/ と * の優先順位は等しくて左結合なんだから疑問の余地はない。
a/2*b と書いてあったら a を 2 で割ってからそれに b をかける。
またはそうしたかのように見えるような振舞いをすることは保証される。
そうなってなかったらコンパイラのバグだよ。
2020/06/27(土) 01:04:32.76ID:zYxBmbbI0
「回避手段があるならバグとしない。」
2020/06/27(土) 01:14:50.37ID:qKnmoagb0
例えばスケーリングなんかの時、オーバーフローを避けるため割り算やってから掛け算することもあるし、丸め誤差を小さくするため掛け算やってから割り算することもあるし、
意図して式書いてるんだから順序を勝手に変えられたらやっぱり大問題だよな。
2020/06/27(土) 07:08:40.12ID:TsX0h7IG0
>>297
オーバーフローは回避出来てるが
かわりにアンダーフローの可能性が出てくる
だから>>271はバグ
2020/06/27(土) 07:18:53.17ID:TsX0h7IG0
QZがここまでアホだとは

>>296
https://www.jpcert.or.jp/sc-rules/c-exp30-c.html
2020/06/27(土) 07:46:43.88ID:5JNhQ0LTH
>>311
ありがとうございます、たしかに副作用完了点に対する私の誤解です
@値の評価の問題、と、A副作用の問題、とを完全にごった煮にしてました、今回は副作用は関係ない…

>QZがここまでアホだとは
現在までの推移を客観的に観察している限りにおいて、これはスランプでは済まず、私はこれからもっと阿呆になっていくのだろうと私は予測しています
https://mevius.5ch.net/test/read.cgi/tech/1434079972/ へのエントリー数もパッタリ止まってもう増えそうもありません
2020/06/27(土) 08:38:40.98ID:Fil4ka9J0
>>296
鼻から悪魔ネタはもうお腹いっぱい
2020/06/27(土) 08:39:33.42ID:Fil4ka9J0
>>309
行を分けて書けばいいだけ
2020/06/27(土) 08:42:53.25ID:aqzZKmXR0
アホが使うと使い手とそっくりな動きになる
Cとはそういうものだ
2020/06/27(土) 08:45:36.41ID:TsX0h7IG0
>>314
行を分けると何が解決するって?
お前もQZと同じアホ?
2020/06/27(土) 08:48:05.70ID:TsX0h7IG0
>>309
>>268によると
オーバーフローも丸め誤差増大も
両方回避しないとバグらしいぞ
2020/06/27(土) 08:51:31.93ID:TsX0h7IG0
オーバーフローを最近勉強して
それだけが気になって
それを回避するために別の問題を起こす
初心者君のたわごとだから
放置すればいいんだけど
2020/06/27(土) 08:57:09.10ID:aqzZKmXR0
どんくらいまでの誤差を許容すべきかは
なかなか数学的な考えどころ
2020/06/27(土) 09:11:00.12ID:TsX0h7IG0
許容誤差
パラメーターの対応範囲
コスト
保守性、可読性、...

これらを総合的に考えてコードを作るのが普通
1個だけの要素が気になるといびつな実装になる

色々な規格も偏った視野で作られる事が多くて
いびつな物が多い

それぞれの項目を勉強するのはもちろん良いこと
2020/06/27(土) 09:23:41.94ID:6HwwPL420
>>317
両方起こりえる状況なら変数の精度不足というバグか。
2020/06/27(土) 09:32:46.13ID:Fil4ka9J0
>>316
ああアホには「文」を分けると書かないとわからんかw
2020/06/27(土) 09:40:26.98ID:TsX0h7IG0
文を分けると何が解決するって?

乗算と除算の演算順がコンパイラによって変わる
というのはQZの勘違いな主張で
明確に順番は決まってる
(QZが>>312で勘違いを認めている)
2020/06/27(土) 09:50:13.95ID:qKnmoagb0
オーバーフローの話は (imax + imin) / 2 ではなく imin + (imax - imin) 2 と書けば回避できるってのが発端なわけだけど、何がそんなに気にくわないんだ?
盲点とも言えるよくやりがちなことなんだから、素直に吸収しときゃいいんじゃないの?
2020/06/27(土) 10:02:32.81ID:TsX0h7IG0
>>324
オーバーフローの可能性があるならそうやって回避可能
っていうだけの話なのに

パラメーターの型全ての値に対応出来ないとバグ
とか言い出す人がいるから
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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