C言語なら俺に聞け 161

レス数が1000を超えています。これ以上書き込みはできません。
2023/04/21(金) 14:05:20.18ID:rqj2HSDF0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf

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

C23 最新ドラフト
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.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言語なら俺に聞け 160
https://mevius.5ch.net/test/read.cgi/tech/1672191630/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/10/27(金) 21:30:02.47ID:t+LCPq2M0
Windowsのクロンダイク作ろうぜ
あれならもともとCのはず
2023/10/27(金) 21:37:13.50ID:qIG6QpEs0
MS-DOSの頃はアマチュアの作ったゲームがたくさんあったな
ゲームメーカーの商品より優秀なのもあったし、
メーカーから訴えられた個人もいたな。
メーカー側が取り下げた様だが、
もしかしたら訴えた事実がなかったかも知れない
その後倒産したという噂を聞いた
Windowsになってからは、VBで作る人が多かった
2023/10/27(金) 21:44:44.21ID:heVGcbpM0
アマチュアが作っているゲーム作品の数で言えば今のほうがずっと多いと思うが。
2023/10/27(金) 22:25:12.50ID:qIG6QpEs0
そうなのか・・・
最近はゲームしてないので知らないんだw
2023/10/27(金) 22:28:08.93ID:M9GgCmOO0
今はvやutuberに媚びたゲーム作れば配信で遊んでくれるから一気にプレイヤー数も増えるよ
2023/10/28(土) 11:42:50.19ID:vcHM6tqr0
>>953
すっごい適当なことばっかり言うねw
2023/10/28(土) 12:43:38.00ID:p7wdBTPe0
>>957
Bio_100%とかタカリスなんて知らないせだいなんだろうな
2023/10/28(土) 13:20:46.38ID:CS7+IID10
ゲームエンジンもライブラリもろくになかった時代にC言語とアセンブラを駆使して
高レベルなゲームを作れるアマチュアプログラマがたくさんいた
(Unityで作るより高スキルが求められる)という話であって、
アマチュア/インディーズゲームのリリース数が論点というわけじゃないんじゃね?w
2023/10/28(土) 13:35:13.59ID:t5G+utQT0
1997年あたりにワイヤフレームだけどゴリゴリの3Dで8台で競艇するゲームは当時かなりオーパーツ感あった
波でグラグラゆれたり、あの当時でステージメイキングも確か出来たし、誰か知ってる人おらんじゃろうか
961デフォルトの名無しさん (ワッチョイ 5351-zW/F)
垢版 |
2023/10/28(土) 14:14:38.32ID:wcF/YB9E0
よそできけよ
962デフォルトの名無しさん (ワッチョイ 937c-cQ99)
垢版 |
2023/10/29(日) 00:56:56.68ID:GrwAVmld0
C言語標準規格、せめて5年毎ぐらいに見直してくれればなぁ。
そしたらとっくにnullptrは入ってただそうし。もしかしたら deferや lambdaも入ってたかもしれん。
963デフォルトの名無しさん (ワッチョイ 5351-zW/F)
垢版 |
2023/10/29(日) 08:16:14.69ID:d4XtWcMl0
規格に対してまあそういう考えの人がいるのも分かるが、全体としては改定に対しての需要というか声は小さかったってことでしょ
2023/10/29(日) 08:37:00.25ID:x+5RB5aB0
どれも今更すぎていらんわ
そういうの絶対必要って奴はとっくにC言語ではない何かを使ってるでしょ
2023/10/29(日) 09:22:00.09ID:C0ma4yse0
>>962
C17 がわずかな保守で終わってることから察しなよ。
見直した結果として変更が要らんという判断をしたんだ。

C に defer を入れる意味はない。
提案として出ている以上は欲しいと思う人もいるんだろうけど。
あれは panic とかがあっても後始末するというところが価値なので
そういうのがない C で関数の終わりに後始末したけりゃ関数の終わりに書けばいい。
例外処理も含めて入れるってのだとなおさら無理だと思うし。
いまさらランタイムを分厚くする方向の機能を言語コアに入れるのは賛成を得られるはずがなさそう。

ラムダ式はまだ可能性がなくもなさそうに思うが……
C++ のラムダ式は暗黙のクラス定義の構文糖として定義することで詳細な規定を
大幅に別項目に丸投げ出来ている。
C で理屈をきちんと整理するのはちょっと難しくない?
キャプチャを全く諦めるならあり得そう。
2023/10/29(日) 09:22:16.65ID:+KTUg2vO0
継続メンテナンスが必要なのはだいたいC89の頃のプロダクトだったりするので
C言語自体の規格アップデートはさほど必要とされていないのね
2023/10/29(日) 10:51:27.53ID:C0ma4yse0
モダンな機能が必要なら C++ を使えばいいって言えてしまうってのもあるしな。
C23 は刷新が大きいけど、新しい機能を入れるというよりは
あまりにも駄目すぎるところを (C++ の後追いをする形で) 改良するって感じだし。
2023/10/29(日) 15:22:27.72ID:YxpLOPna0
C99 からの無名構造体は廃止してほしいねえ、あれでC++との互換が失われた。
構造体にコンストラクタを記述できるようにした方がマシだったと思う…
2023/10/29(日) 15:22:33.47ID:YxpLOPna0
C99 からの無名構造体は廃止してほしいねえ、あれでC++との互換が失われた。
構造体にコンストラクタを記述できるようにした方がマシだったと思う…
2023/10/29(日) 15:24:11.31ID:V/yNBYFm0
コンストラクタ用意したら、それはもはやCではない
2023/10/29(日) 16:10:21.42ID:C0ma4yse0
>>968
コンストラクタこそ要らないだろ。
関数として書けば済む話だから。

ああいうのは色んな機能と連携して便利になるので
個々に見てしまうとたいして便利ではない。
2023/10/29(日) 17:23:22.94ID:x+5RB5aB0
>>968
Cでtypedef+無名構造体/共用体のペアはstruct tag書式より使われてると思うが
これはstructをいちいち書かされるC固有の仕様の問題であって、C++では最初から型宣言自体のやり方が違う
つまりCの仕様をC++に合わせる意味は無く、C++との互換性はどうでもいい
2023/10/29(日) 22:25:46.25ID:ce2BuRgD0
>>965
例外の無いCでのdeferの意味は、単に後処理(デストラクタ)をコンストラクタ(Cではmallocや初期化関数)の直下に書けるという意味がある
関数の下に書けばいいといっても、gotoで飛ばしてんじゃ、プログラミング言語として欠陥が有ると思うよ
goto使うな→エラー処理で使えば綺麗に書けるよ!って、やっぱおかしいだろw
2023/10/29(日) 23:50:43.25ID:eMkvRHiW0
defer って分からんのですが、関数単位での atexit() みたいなもの?
2023/10/30(月) 00:11:39.03ID:2SouKz/I0
double* q = malloc(something);
defer { free(q); }
↑これ見れば一目瞭然だな
exitと関数やブロックを抜ける時に発動する
けど、Cは書かれた通りに動くという前提を少し逸脱してんだよね
それでも絶対便利ではある
難しい問題だな
2023/10/30(月) 00:12:01.02ID:hHEGE8Ol0
合ってるよね、うん

それ(他言語の defer 相当機能)って、問題解決にC言語を採用する環境では、OS上のプロセスの切り出し単位の設計、にマッピングすれば済む事ではないのかな?

建設的な議論の参考ネタとして:
perl言語が嫌われた理由の一つに「同じ事をいろんな書き方で書ける」言語設計ポリシーがあって、それは他人が書いたコードをメンテする立場だと「あらゆる書き方に精通してないとメンテできない」デメリットになり

pythonはそれを反面教師として「同じ事はだいたいみんな同じ書き方になるような言語設計を目指す」ポリシーにした、と認識してます
2023/10/30(月) 00:33:24.74ID:hHEGE8Ol0
ああ、ブロック単位なのね…

とすると、上手なC言語のプログラマー達が習慣的にやってきた方法は以下ですよね:

■実装すべき処理を関数にマッピングするとき(主処理、失敗時処理を)細かく分ける
■関数をイベントハンドラとして「登録する」流儀の ミドルレイヤを書いて、そのミドルシステム上で 実装対象の「意味のある処理単位」を書くよう、プロジェクト単位でコーディングルールを定め、守り&守らせ
■◯◯失敗時には△△を行う、を明確に設計し実装して、それが分かりやすい納入プログラムとする

で解決してきた、と思います。

つまり defer 機能がなくても同じ事をやる手法は既に確立している。
前のレスでの主張と合わせ、defer 機能を追加しないのが正解、と言いたいです
2023/10/30(月) 01:02:35.88ID:tKZ3J0Lw0
breakでいつでもブロックを離脱できればgotoより明確でスムーズでかっこよくdeferっぽいことできるよな
979デフォルトの名無しさん (ワッチョイ 937c-cQ99)
垢版 |
2023/10/30(月) 01:09:19.67ID:SHIqNVOV0
かっこいいかなぁ、、、
2023/10/30(月) 01:25:52.81ID:hHEGE8Ol0
>>978

{int rc=0; do{ ★始め
処理
rc=1; break; ★失敗した
処理
break; ★成功した
} while(0); if(rc) { ★
異常時処理
}} ★終り


とかそういう話?

こういうのを #define で「エセ構文糖」みたいに定義する人もいますよね。(自分はあまり好きじゃない。格好悪いと思う)

C言語用の単体テストフレームワークで unity ってのがあります。unity ではテストコード内で 独自の try ~ catch 風文法を書けるのですが、それがまさに (setjmp longjmp も使って) #define でエセ構文糖風に実装してました。需要があれば再度調べてここで概要報告しますw
2023/10/30(月) 09:24:19.57ID:I7fISnX+0
>>975
Go の defer に倣うなら defer 文に書けるのは関数かメソッドの呼出し。
(式一般、文一般を書けるわけではない。)
呼出しは関数の末尾だが引数は書いてある場所で評価されるというルール。
C 風の文法で書くなら

double* q = malloc(something);
defer free(q);
q=NULL;
return;

というように書いても malloc した場所はちゃんと free されることになる。
このルールのおかげで前準備と後始末を近い場所に書けて「対応関係は」一目瞭然と言えるが、
そのために変則的な評価規則が入ってるわけ。
式単位での順序が入れ替わるってだけじゃなくて引数の評価と関数の呼び出しが
分離されるってだいぶん変な仕組みだよな。
982デフォルトの名無しさん (アウアウウー Sad5-g+2W)
垢版 |
2023/10/30(月) 10:15:21.12ID:xnp7PI6ya
>>973-974
Nim の defer 良いよね
983デフォルトの名無しさん (アウアウウー Sad5-g+2W)
垢版 |
2023/10/30(月) 10:15:44.95ID:xnp7PI6ya
>>973-974
Nim の defer 良いよね
2023/10/30(月) 10:17:23.47ID:hHEGE8Ol0
正常ルートは終わる時 q==NULL なのに、その前の
defer free(q) したときのqの値でfree() するんですね

うへぇ…
誤解釈してバグ出しそう

てかこれは、ひねり出された意地悪サンプルで…実際のプログラミングでdefer式が効果的となる使用例ではない、ですよね?
2023/10/30(月) 10:34:41.68ID:hHEGE8Ol0
この話で改めてあぶり出されるのは、
あるプログラミング言語を深く理解して「書ける」「読める」ようになることには「自分なりの 上手なエラー処理の書き方 を探して身に付ける」事が含まれる、って事ですよね。

それは人類の資産なんだけど、実際の存在場所は あまたのプログラマー達の脳内 であって、一朝一夕に書き換えられる物じゃない。
だから言語仕様を改定して新機能を足すのは、新言語を作る時よりは慎重になる必要がある、と解釈しました
986デフォルトの名無しさん (スプッッ Sd73-cQ99)
垢版 |
2023/10/30(月) 11:45:07.40ID:Ccd5zWuDd
nullptrはもっと早く入れるべきだった。
2023/10/30(月) 11:57:46.53ID:I7fISnX+0
>>984
Go でどうだか知らんけど C に defer を入れたとしたらというテーマでの話なら
malloc と free を対応づけるのは考えられる用途の筆頭でしょ。

逆にこういう変則的な評価規則を持ち込まないとしたら、
つまり defer 文に書いたものが単に return の直前に評価されるだけということにしたら
途中で書き換えられる可能性が出てきて
前準備と後始末が対応づいているかどうか一目瞭然とはいかなくなる。

どこかしらでなんか汚い感じにはなるよ。
そういう汚さを受け入れてもなお欲しいほどの利便性かというとやっぱり疑問は残る。
汚さを受け入れていいなら goto の汚さを受け入れるのとそんなに差があるとも思えないし。
2023/10/30(月) 12:40:32.59ID:2SouKz/I0
>>980
意地でもgoto使いたくない時にはそれでもいいけど、それの欠点は中にswitch文を書くと、breakで抜けれるのはswitch文からだけになる事だな
自分ではwhileを抜けた気になって実は抜けてないという、微妙なバグを生み出す可能性があるなw
2023/10/30(月) 16:19:29.96ID:hHEGE8Ol0
>>988
do {...} while(0)
なので、必ず1回実行し、2回目はないです
2023/10/30(月) 16:52:46.78ID:bW5EQkS/0
>>989
適当だけどこういうことでは?

{int rc=0; do{ ★始め
 処理1
 siwtch(x){
  case 0: rc=1; break; ★失敗した  ※siwtchから抜けるだけでwhileからは抜け出せていない
  case 1: break; ★成功だけど処理2は実行しない ※siwtchから抜けるだけでwhileからは抜け出せていない
  case 2: break; ★成功で処理2も行う
 }
 処理2
 break; ★成功した
 } while(0); if(rc) { ★
 異常時処理
}} ★終り
2023/10/30(月) 16:58:35.91ID:hHEGE8Ol0
>>990
おっしゃる事、分かります。具体的に書いてくれてありがとうm(_ _)m
2023/10/30(月) 17:01:08.71ID:hHEGE8Ol0
>>987
はい…
mallocとfreeを確保と解放の例とするのは異論ないです

deferより一つ上位の話は、エラー処理をバグなく、分かりやすく書こうというテーマだ、で合ってますよね。
その上で、deferがないとこんな面倒なのが、deferがあるとこんなに分かりやすい 例がよいのです

確保と解放の書き方検討で、私が検討するのは例えばこんな感じです:

■(1)ある意味のある処理単位が、リソースを 2個以上使う 場合を考えると、1個の場合より検討がよく進む。特に、
■■(1a)初期化が途中で失敗した場合、すでに確保が成功してしまった資源をどう解放するか
■■(1b)資源の変数は最初に、確保処理のエラー戻り値と同じ値で初期化をすると、スッキリする事が多い

■(2)正常ルートでの解放と、エラールートでの解放で、コードを共通とするか、別とするか。
■■(2a)確保、主、開放 の処理を、同じ「関数」で書くのと、別の「関数」に分けるのはどちらが良いか
■■(2b)「goto エラーラベル;」を好きか嫌いか

■(3)プログラマーによる解放処理の前の 「if(確保済みなら)」のガードが、必要なもの(fcloseなど)と、不要なもの(free)があるので、マニュアル確認は要る

もっと語りたいけど、レス分けます、というか時間を置きます。あまり一人が語りすぎると、嫌がる人もいますよね
2023/10/30(月) 17:09:39.89ID:hHEGE8Ol0
てかキータで書いて、皆さんの意見を聞いて修正していったり、してみようかな…
2023/10/30(月) 17:17:16.34ID:hHEGE8Ol0
とりあえず次スレ立てました。即死防止の保守書き込みは要らない、で良いのかな?

C言語なら俺に聞け 162
https://mevius.5ch.net/test/read.cgi/tech/1698653580/
995デフォルトの名無しさん (スプッッ Sd73-cQ99)
垢版 |
2023/10/30(月) 18:42:32.58ID:Ccd5zWuDd
>>994
乙。
あなたの男気に女気に惚れました。
2023/10/30(月) 22:27:42.13ID:I7fISnX+0
Golang の defer はあくまで関数の終わりまで遅延させる (ブロックの終わりではない) ので
呼び出される defer の個数が動的になりうるんだな。
https://go.dev/tour/flowcontrol/13
この挙動も C には馴染まなさそうだな。
2023/10/30(月) 22:37:34.66ID:n3VNJX5I0
俺は某画像ライブラリのリソーストラッカーみたいに開放が必要な物を全部紐付けて後で開放する仕掛けを使ってる
まあCには何にも縛られないのが良いんだし好きにしたらいいよ
2023/10/30(月) 23:34:44.67ID:2SouKz/I0
構文的にはC#っぽく
using (double* p = malloc(...); free(p)) {
p を使う
}
でも良いかも知れない
これだと1ループのforに似ててCに良く馴染むな
もちろんreturnとかexitで脱出してもfreeは呼ばれる
999デフォルトの名無しさん (ワントンキン MM53-wL8D)
垢版 |
2023/10/31(火) 10:19:02.32ID:i2gAy2CGM
そんなもんが規格に入るわけないんだから無駄話だろ
1000デフォルトの名無しさん (ワントンキン MM53-wL8D)
垢版 |
2023/10/31(火) 10:19:24.66ID:i2gAy2CGM
うめ
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 192日 20時間 14分 5秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はUPLIFT会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。

▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.net/

▼ UPLIFTログインはこちら ▼
https://uplift.5ch.net/login
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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