C言語なら俺に聞け 145

■ このスレッドは過去ログ倉庫に格納されています
2018/02/19(月) 22:13:58.98ID:9/te2eSJ0
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言語なら俺に聞け 144
https://mevius.5ch.net/test/read.cgi/tech/1514025223/

次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/03/11(日) 10:20:33.73ID:szqHStkk0
>>361
setvbuf忘れなければ済む話だよパパ
365デフォルトの名無しさん (ワッチョイ 0b9f-uQtz)
垢版 |
2018/03/11(日) 14:10:54.85ID:ry5KQfC80
>>363
そだねー

>>364
本当にそれだけで大丈夫かね?

この頃のライブラリは多分マルチスレッドでもちゃんと動くように内部でロック掛けている部分があると
思うんだけどね、例えばシグナルハンドラの中でそのロックを掛けている最中にまたシグナルが来て
同じシグナルハンドラに入ると同じロックを掛けようとしてデッドロックするなんてことが起こり得ると
思うんだが。(まあその程度のことでデッドロックしてしまうこと自体がバグかも知れんが。それ以前に
シグナルハンドラの中でprintf()は使うなって話でもあるか…)。
2018/03/11(日) 15:06:05.16ID:szqHStkk0
>>365
ロケールがCならprintfだってスレッドセーフだしぎりぎりシグナルセーフだよパパ
2018/03/11(日) 15:33:10.91ID:UYIqocxw0
世の中には完全なCライブラリを実装していないタイニーなマシン用のサブセットだってあるんだよ坊や。
368デフォルトの名無しさん (ワッチョイ 23b3-lJdD)
垢版 |
2018/03/11(日) 16:08:45.67ID:sEfAJdP70
それはCじゃないから、このスレで話し合っても無駄では。
2018/03/11(日) 16:12:01.01ID:UYIqocxw0
Cは言語仕様であって、ライブラリ仕様は別枠だろ?
2018/03/11(日) 16:46:35.93ID:iUqzSqql0
30年以上前だったかな、あるメーカーのプリンタファーム開発用Cコンパイラが配列要素上限が255だった
当時アスキーネットでこれを聞いたvoid氏が呆れていたようだ。
371デフォルトの名無しさん (ワッチョイ 23b3-lJdD)
垢版 |
2018/03/11(日) 17:10:10.38ID:sEfAJdP70
インストラクションに8ビットまでの即値を組み込めるなら、その制限によって(そのような最適化が必要なプロセッサにとって)強烈な最適化をかけられるから、アリやナシやと問われればアリのような感がある。
2018/03/11(日) 17:20:27.39ID:Dtt3qpb50
Cライクって言っときゃいいのにCと名乗ってしまうから
イチャモンつけたいヤツの標的になる
373デフォルトの名無しさん (ワッチョイ 23b3-lJdD)
垢版 |
2018/03/11(日) 17:33:57.41ID:sEfAJdP70
本場ドイツ直輸入ポークソーセージを買ったら魚肉ソーセージだったような感じですね。
つまり詐欺です。
2018/03/11(日) 17:36:14.99ID:szqHStkk0
>>369
それ言ったらバッファリングの話題もCの話にならないだろぉオヤジィ
2018/03/11(日) 17:37:59.08ID:iUqzSqql0
何が正当な教義かについて議論したければ、上級者スレでやってね
376デフォルトの名無しさん (ワッチョイ 23b3-lJdD)
垢版 |
2018/03/11(日) 18:04:00.35ID:sEfAJdP70
こういう掲示板で宗教対決を規制したら過疎化するんじゃないだろか。
377デフォルトの名無しさん
垢版 |
2018/03/11(日) 18:26:39.19
>>370
まるでUvaみたいな制限だな(藁
2018/03/11(日) 18:45:46.67ID:QedwXA9H0
>>366
マルチスレッド版のライブラリーがあるかと
行出力中にスレッドが切り替わらない
2018/03/11(日) 18:48:04.93ID:QedwXA9H0
>>374
なお初代K&Rにはライブラリーの仕様は含まれない。
WhiteSmithとかはprintfが実装されてない
2018/03/11(日) 20:24:48.92ID:1mhcZmSWa
>>372
セントロニクス
2018/03/11(日) 21:13:40.31ID:Dtt3qpb50
5Vシングルエンドがそのままコネクタに出てるアレか
アレを基板に直付けするアフォが多くて頭クラクラした
382デフォルトの名無しさん (ワッチョイ 6ac6-lLam)
垢版 |
2018/03/11(日) 23:26:14.78ID:3FTmPjnp0
for(i=0;i<10;i++)
scanf("%d",&num[i])

で入力した変数がiに入ってしまうことがあるのですがなぜですか?
2018/03/11(日) 23:59:04.31ID:Sn9rQkOCM
numのサイズが10ないとか。
2018/03/12(月) 00:02:45.79ID:9wDOvV2B0
ソース全部晒せ
2018/03/12(月) 07:51:36.03ID:6B2Hj+UH0
do whileはいらない子?
2018/03/12(月) 08:04:24.78ID:uoSNo/WDM
アルゴリズムによってはdo whileの方が素直なときがある。まれだが。マクロを本当の関数っぽく使うのにdo while (0)使うハックがある。まれだが。
コンパイラによってはdo whileの方が速いコード出す。まれだが。
2018/03/12(月) 08:36:16.07ID:SpziwmuNM
>>370
プリンタっつーてもピンキリだからなぁ
レシートプリンタとかならその程度で充分かもしれん
2018/03/12(月) 09:25:52.84ID:kO6Vn+sG0
>>385
んなこたーない
whileのほうが使用頻度は高いけど
本質的に後判定なロジックはそんなに珍しくもない
2018/03/12(月) 09:30:32.07ID:Cd8AY8RG0
do〜whileは、必ず一回は処理してくれるから便利。
2018/03/12(月) 09:31:53.62ID:kO6Vn+sG0
繰り返し対象処理が実行される条件がブレるから気をつけないといけないけどね
2018/03/12(月) 10:16:52.94ID:Igle62xq0
do{continue;}while(false); で無限ループになるのウケる。
2018/03/12(月) 10:19:34.77ID:kO6Vn+sG0
391 error: undeclared symbol 'false'
2018/03/12(月) 10:42:19.80ID:wLVR4ID4a
>>389
女に見習わせたいな
394デフォルトの名無しさん (ワッチョイ 8f23-0aB1)
垢版 |
2018/03/12(月) 12:03:54.32ID:A4+OWJSs0
こんな書き方たまにする

do{
・・・
条件
break;
・・・
条件
break;
・・・
条件
continue;
・・・
条件
break;
・・・
条件
continue;
・・・
}while(0);
2018/03/12(月) 12:10:22.44ID:rLGzoMUT0
>>387
一応汎用のレーザープリンターなんだ
30年って一寸行き過ぎだな
95が出てきた頃だから、20年前か
2018/03/12(月) 12:11:48.84ID:Igle62xq0
>>394
GOTOを怖がるな。
俺は反GOTO教は抜けた。
まぁ乱用しようとも思わんけど。

>>392
文脈で察してくれ。
boolはいったことだし。
2018/03/12(月) 15:52:19.83ID:bCYSOHOV0
B 判定 A B 判定 A B … みたいに
do { } while () のブロックの途中に飛び込んで開始するようなのが悩ましい

goto ENTER;
do {
 A();
ENTER:
 B();
} while(条件);
2018/03/12(月) 17:04:49.51ID:Ro63JAiYH
出口が複数は可だけどエントリーポイントが変なとこにあるのは読みにくいからやめたほうがいい。
この例の場合はB Aの無限ループにして、Bのあとの条件で脱出するのが定石。
2018/03/12(月) 17:15:21.51ID:bCYSOHOV0
for(;;) {
 B();
 if (条件) break;
 A();
};
こんな感じですか。
やっぱり頭から入っていくほうが読みやすいし…
2018/03/12(月) 17:24:28.52ID:rLGzoMUT0
処理内容がそうならそういうことなんだろうが、
見ていて気持ちが悪くなるロジックだな、すまん
2018/03/12(月) 17:31:42.39ID:kO6Vn+sG0
エントリーポイントが変なとこって、mainだって1行目にはまずならないしな
実装されることなく廃止になったキーワードにentryつーのがあって
そいつがおそらくは1行目に
entry main;
とか持ってこれるようにするつもりだったのかもな
402デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/12(月) 17:41:10.71ID:mlDQMbRTa
>>397
昔の BASIC を思い起こさせる goto の使い方だなw
2018/03/12(月) 17:58:00.69ID:DBOT0xK9M
gotoは禁止はしないが、異常系の終了処理にジャンプするパターンだけ許容だな。
404デフォルトの名無しさん (アウウィフ FF1f-0aB1)
垢版 |
2018/03/12(月) 18:04:50.67ID:FajbO2mAF
exceptionさえあれば
2018/03/12(月) 18:06:32.58ID:bCYSOHOV0
コンストラクター/デストラクターのような機構があれば
異常時の後始末は割と楽に書けるっすね
406デフォルトの名無しさん (アウウィフ FF1f-0aB1)
垢版 |
2018/03/12(月) 18:09:46.06ID:FajbO2mAF
atexit()はあるぞ
2018/03/12(月) 18:25:47.87ID:rLGzoMUT0
異常の場合は,例外処理をしてから続行したい
2018/03/12(月) 19:11:12.71ID:HQXq1VOq0
つ setjmp
2018/03/12(月) 19:32:23.64ID:6OIrRNruM
>>408
volatileをつけ忘れて最適化で暴走するなんてよくあること。
2018/03/12(月) 20:42:20.27ID:SpziwmuNM
>>395
1995年頃でLBPだと16bitから32bit CPUに移行する頃だから配列サイズが最大255なんて言うのはさすがに見たことないわ
ちなみにうちはSH-2+独自モニタからR3000+VxWorksへの移行期だった
コンパイラもチップベンダーかOSベンダーのものを使ってた
2018/03/12(月) 21:14:21.91ID:hz29p2j/p
gotoを後始末以外の使い方して変な所に飛ばしたりするから禁止って言われるんだよな。
2018/03/12(月) 22:09:38.43ID:kO6Vn+sG0
昔のBASICにはON ERROR GOTOとかON ERROR GOSUBつーのがあって
異常系から復帰できたんだよな、それがCやC++にはない
2018/03/12(月) 22:12:32.16ID:rLGzoMUT0
setjmp longjmp
2018/03/12(月) 22:16:55.21ID:kO6Vn+sG0
RESUME NEXTに相当する処理はsetjmp.hにはない
2018/03/12(月) 23:49:45.06ID:+NwoaeJY0
gfortranで言うところのfcheck=allを設定した時のように配列の範囲外アクセスを検知したいのですが、いい方法はありますか?
2018/03/13(火) 00:26:13.95ID:zisSqBer0
boundschecker 使えばよろし
2018/03/13(火) 00:43:16.47ID:LMrPxj1+0
Linuxなので代用を探していたらvalgrindに辿り着きました
ありがとうございます
2018/03/13(火) 03:11:31.37ID:a0aOTtHi0
大域ジャンプはダメだ。
2018/03/13(火) 07:50:52.88ID:H/7hRIr60
初期化

タイトル
...
GOTO 本編

GAME OVER
...
GOTO タイトル

ゲーム本編
...
GOTO GAME OVER
2018/03/13(火) 08:44:52.34ID:a0aOTtHi0
>>419
よくあるダメなゴトーさん。
421デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/13(火) 10:00:11.49ID:mZm9h8PZa
>>412
まあ、ないけど、エラーになったら自分でif文使って分岐すれば良いだけでは?
C言語は単に言語レベルでのそういう便利機能が少ないってだけで実現する方法は内部的な動作まで考えたら結局は同じにしかならんと思うよ、
2018/03/13(火) 10:29:21.12ID:FbdkMN9Up
C言語はマクロアセンブラから派生した感じなんで、言語体系はお世話にも良いとは言えないんだよな。
当時はマシン語で演算結果フラグで条件ジャンプや条件コールしてた煩わしさから開放されただけでも有り難かったんだ。
そんなチープな言語にオブジェクト指向だの例外処理だのとか求めて迷走したのがC++
ええい、いっそ作り直してしまえって出したのがJavaやC#
だからC言語使う時点で諦めれ。
2018/03/13(火) 11:04:12.06ID:92t/zLSk0
>>421
そのif文でゴチャゴチャしだしたら「例外処理」を名乗れない
2018/03/13(火) 11:54:23.49ID:a0aOTtHi0
基本的にウオーターフォールを守るのが大事やな。
そのうえでどこに飛びたいかって感じ。
425デフォルトの名無しさん
垢版 |
2018/03/13(火) 12:12:14.52
フォールウオーバー機構を言語レベルで用意すべき
2018/03/13(火) 12:16:24.04ID:a0aOTtHi0
https://www.google.co.jp/search?q=%E3%82%A6%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%80%80%E6%84%8F%E5%91%B3&;
ウオーバーってなんぞ?
2018/03/13(火) 12:26:22.54ID:CTGLDN6cM
漢字で書くと闘婆
428デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/13(火) 13:00:28.56ID:5qOlO1LIa
>>423
名乗らんでいいのでは?

Cが不便なら他の言語使えばいいじゃない。
2018/03/13(火) 13:12:03.18ID:92t/zLSk0
>>428
ああ、議論できないのね
いいよ話さなくて
2018/03/13(火) 13:20:12.96ID:lXm9DcKjM
SIGUSR1/2じゃ駄目なのか?
431デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/13(火) 15:58:05.78ID:LC30GjQRa
>>429
議論?何の?新言語の?
2018/03/13(火) 16:39:07.67ID:92t/zLSk0
>>431
いいよ、無理に話さなくて
2018/03/13(火) 19:35:09.64ID:WMMjj2eHM
聞く耳持たんらC
2018/03/13(火) 20:04:26.12ID:/ChP+Vc3M
突っ込まれて遁走だろ w
2018/03/14(水) 02:09:35.30ID:IiyiuIPr0
ここで幾ら議論してもC言語は変わらない。

Cから派生した言語を新たに作るというのであれば議論することには意味があるだろうが、そうでないならそれはただの愚痴だ。
2018/03/14(水) 06:44:38.33ID:4nqAllCK0
おまえさあCの例外処理が言語のビルトインとか思っているわけ?
Cは変わらないとか言っちゃってるけど、
その現状のCがわかってないのに変わったかどうか気付けるのか?
2018/03/14(水) 07:02:59.95ID:M7iHvccR0
一応errnoだったかっていう、失敗理由を示す変数がある事はある。忘れられてるけど。
C言語で唯一トラブルシューティングに使える変数。
2018/03/14(水) 08:03:51.30ID:ylQhqnt4M
>>436
> その現状のCがわかってないのに
お前だけだろ w

>>437
ライブラリレベルの話を入れるかどうかは悩ましいな
普通の言語なら入れなくてもいいと思うがC言語にはsetjmp/longjmpなんて言うとんでもないものもあるからなぁ
2018/03/14(水) 08:15:23.77ID:4nqAllCK0
errnoだってwww あれが例外処理なのか

setjmpがどうとんでもないのか具体的には言えないんだろうな
だから聞かない
2018/03/14(水) 08:25:02.15ID:M7iHvccR0
>>439
大域ジャンプするとエラー処理したところが戻ったりして変数グチャグチャになることがあるからな。
まぁ、C++の例外も大域ジャンプだし。個人的には使わないな。
古き良き-1やら_boolであきらめる方が精神的には良い。
んで、趣味位のケースなら正常系だけ書いておけば大体問題ない。
エラー系は大体ロジックエラーだからデバッグで落とす。
2018/03/14(水) 08:29:46.90ID:ylQhqnt4M
>>439
> setjmpがどうとんでもないのか具体的には言えないんだろうな
他の言語でライブラリレベルで実装してる例はないから
まともな頭があれば理解できるはず
2018/03/14(水) 08:31:33.24ID:6wuH32OAd
高級アセンブラの名前は伊達ではないよね。
2018/03/14(水) 08:32:17.72ID:M7iHvccR0
あれジャンプじゃなくて、スタックロールバックだからな。どっちかっていうとリセットの類。
他の言語でこれは実装できない。というかやりたくはないだろう。
2018/03/14(水) 08:35:45.72ID:M7iHvccR0
大域ジャンプ+動的メモリアローケート。あぁおそろしい。
なので、大域ジャンプはやめましょう。
2018/03/14(水) 08:37:30.11ID:ylQhqnt4M
>>440
> 大域ジャンプするとエラー処理したところが戻ったりして変数グチャグチャになることがあるからな。
それはお前の能力が足りないだけの話だろ w

> まぁ、C++の例外も大域ジャンプだし。
C++はデストラクタとかの処理も要るからライブラリレベルでは実現できない
そう言う処理を全てプログラマに押し付けられるC言語だからできるってことでもある
2018/03/14(水) 08:41:34.04ID:M7iHvccR0
>>445
あーすげー。この人、他人がいじった変数全部把握してるんだな。すげー。
メモリ確保したのなかったことになっても正常系に戻せるんだな。
超人か!!
2018/03/14(水) 08:45:22.60ID:M7iHvccR0
C++のクラス機構をライブラリで実装するときは、構文糖入れたりとか、イベントモデル入れたりとか。
エネルギーばかりかかって収穫がない。
2018/03/14(水) 09:25:24.96ID:ZphqLecba
>>436
Cには言語レベルでの例外処理はないのでは?何のことを指してそう言っているのか?
2018/03/14(水) 09:28:14.80ID:ooB4nY3v0
Cにだって例外処理はある。
でもそれって、CPUの例外割り込みの事だけどね。
あー結局言語仕様じゃ無いじゃんw
2018/03/14(水) 09:29:50.23ID:ZphqLecba
>>449
ほら。ないよな?
2018/03/14(水) 09:32:49.61ID:ZphqLecba
割り込みっていうならシグナルがあるがしかしOSの問題だよな?
てか標準じゃないか。それにシグナルのために特別な言語仕様が作られてもいない。
2018/03/14(水) 09:35:13.20ID:ooB4nY3v0
所詮Cは高級アセンブラだからなぁ
2018/03/14(水) 10:19:21.23ID:4nqAllCK0
>>441
現状のCの話じゃなかったのか?
なんで他の言語が出てくるんだ

俺はてっきりsetjmpの仕様がとんでもないと言っているのかと思ったが
実装方法がとんでもないと言っているのか?
あれか動作保証のないマイクロ診断命令でも使っていると言いたいの?
2018/03/14(水) 10:20:28.21ID:4nqAllCK0
>>448
言語を定義する規格票が定義しているライブラリのことだよ
まさか知らんのか?
2018/03/14(水) 11:44:11.11ID:jowRUKsS0
何やら雰囲気が悪くなってるように感じるけど、カレンダー絡みかな。
2018/03/14(水) 12:08:39.92ID:L/3+Hz1H0
やたら突っかかってくるやつを構ってやっているだけだが
457デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/14(水) 12:22:56.52ID:e7inwI4na
>>454
知らんなあ。Cの例外処理ってなんなの?
2018/03/14(水) 12:24:13.25ID:y6ADsCAy0
ここは遊び場ではありません
2018/03/14(水) 12:52:15.53ID:L/3+Hz1H0
>>457
そうか、知らんのか
じゃあ話にならんな
460デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/14(水) 12:53:42.74ID:e7inwI4na
>>459
何のことなのかぜひ書いてくれ。
2018/03/14(水) 12:53:55.90ID:L/3+Hz1H0
人の話の腰を折ることに専念せざるを得ない防戦一方なつまらんやつ
2018/03/14(水) 12:55:02.45ID:L/3+Hz1H0
>>460
おまえ、そこで3回まわってワンといえ
書いてやるかも知んねーからw
2018/03/14(水) 12:55:16.50ID:x85VLsABM
>>446
むしろそう言うのを把握せずにどうやってプログラム組んでるんだよ?
動けばラッキーってか? w
■ このスレッドは過去ログ倉庫に格納されています