C言語なら俺に聞け 160

■ このスレッドは過去ログ倉庫に格納されています
2022/12/28(水) 10:40:30.02ID:PyoNDBFu0
!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言語なら俺に聞け 159
https://mevius.5ch.net/test/read.cgi/tech/1659623547/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/02/20(月) 09:47:26.91ID:N/iEiUCGd
>>480 チャレンジしたことはないけど、たぶん再帰なしでも書けません。どうか御教示をお願いします。
2023/02/20(月) 09:50:41.85ID:N/iEiUCGd
ハノイの塔は再帰でしか解けない
2023/02/20(月) 09:51:19.24ID:cTmdkEXkd
んなこたあない
2023/02/20(月) 09:57:18.63ID:KyZtaEjed
待ち行列やLIFOは再帰的な処理を非再帰にするときの友
2023/02/20(月) 11:00:02.06ID:Htkx1bCsd
再帰呼び出しする所をpushに変えてgoto最初
returnの所をpopに変えてgoto最初
時間があればそこからgotoを取り除く
gotoが輝く場面
2023/02/20(月) 11:21:38.14ID:N/iEiUCGd
>>485 goto文を使うのですね 覚えておきます
2023/02/20(月) 11:58:19.08ID:KyZtaEjed
アンチgoto教信者は近頃減ってきているが
絶滅はまだ先のようだな
2023/02/20(月) 12:38:57.43ID:sAm6cEmU0
スパゲティGotoをたんと召し上がれ!
2023/02/20(月) 13:04:25.72ID:Htkx1bCsd
再帰からループへの変換はgotoのある言語なら機械的にできるからね
存在すら許さない言語は発想を阻害してると言える
2023/02/20(月) 13:35:56.24ID:JqcJZDsUd
while(スタックが空になるまで){
  pop();
  ...
}
って書き始めるけどな
2023/02/20(月) 21:19:52.57ID:I5iz8R+L0
>>490
戻りのpopはそれでいいけど呼び出しのpushは処理がぶった切れるから
gotoがないとかなりややこしい変換になるよ
2023/02/20(月) 23:51:00.80ID:7qph/rf50
>>485
push/pop はルール違反
それに二方向、多方向への再帰はそう簡単じゃないですけどね
二分木の全要素を列挙する非再帰プログラムを書いてください
2023/02/21(火) 00:08:57.34ID:Cn1Xq+JJ0
がんばってgoto無しで作ったりしてたなあ
2023/02/21(火) 06:59:46.53ID:1n1W4gUgd
push/popはルール違反て何それ?
2023/02/21(火) 09:59:11.37ID:MGN7/c1b0
「俺がルールブックだ」
2023/02/21(火) 10:33:24.95ID:5S8ZyEUUd
「ウリが蟹飯リッチニダ」
497デフォルトの名無しさん (ワッチョイ 23ad-BTrK)
垢版 |
2023/02/21(火) 10:51:10.49ID:NudgdpLh0
豪華な蟹飯が思い浮かんだ
2023/02/21(火) 13:43:23.05ID:1n1W4gUgd
苫小牧だっけ?
2023/02/21(火) 16:27:46.36ID:dWpsoJfPa
>>436
>>481
テスト
https://ideone.com/iPWHR0
2023/02/21(火) 16:50:09.17ID:ncQgkmT30
チャットジピティれカス
2023/02/21(火) 17:05:45.18ID:j4WOJdo9d
>>499 見事です 私はまだ初級なのでvectorだのcstdioなど見たこともありません
2023/02/21(火) 17:54:02.02ID:5S8ZyEUUd
>>499
お、動いた動いた!
2023/02/21(火) 17:55:02.20ID:MGN7/c1b0
goto が一つもない・・・
2023/02/21(火) 19:30:27.79ID:oAMbgY5Ra
goto文は禁じてではないかな?
C言語では
2023/02/21(火) 19:48:08.10ID:1n1W4gUgd
俺様ルールは興味ないから
2023/02/21(火) 19:50:05.73ID:MGN7/c1b0
CPUレベルまで行くと、GOTOは使いまくりだろう
2023/02/21(火) 19:57:40.07ID:1n1W4gUgd
機械語1命令ごとにPCを更新するのもgotoかw
2023/02/21(火) 20:39:53.11ID:pHGJPw2cM
gotoなんて所詮関数内にしか飛べない
関数が小さければなんて事はない
巨大な関数はgoto以前に悪
2023/02/21(火) 21:02:34.32ID:MGN7/c1b0
昔いた現場は、1関数ごとに設計書を何枚も書かされてたな
それでみんな、関数の数を極力減らしてた
行き着くところ初期とメインと終了の三つ
それぞれが何百行にもなってしまったw
2023/02/21(火) 22:12:19.48ID:QJTSRl8U0
そういうのいいから
2023/02/21(火) 22:59:26.21ID:fpEKur8e0
硬直化して目的を忘れた「管理」に泣かされたもんだけど
それは昭和も今も変わっとらんだろ
2023/02/21(火) 23:48:29.43ID:MGN7/c1b0
プロジェクト管理はそのうちAIがやるようになるんだろうか
2023/02/22(水) 03:11:04.32ID:ZjvNTHuW0
AI「壊れるまで働け、人間共よ」
2023/02/22(水) 06:39:57.73ID:6aYkdgkrd
>>491
continueを知らないのか?
2023/02/22(水) 15:13:03.32ID:rwr+6TWF0
>>415
やはり構文解析器(プリプロセッサ含む)に手を入れないとデリミタに'は難しそうに思うの

暇だったので>>413を(ナイーブに)
# define b(n) (strint(#n, 1u))
# define t(n) (strint(#n, 2u))
# define o(n) (strint(#n, 3u))
# define x(n) (strint(#n, 4u))
unsigned
strint(const char cs[], const unsigned wt){
long d;
unsigned u=0;
do { // valid digis: ascii '0'..'^'
if((d=*cs)<0||d>'_'-'0'+1) continue;
u<<=wt, u+=d;
} while(*cs++)
return u
}

b('1100'1010'1111'1110)
b(1100_1010_1111_1110)
o(145;366)
x(<:!?>)
全て0xCAFEに等しい、ただし' が奇数個のケース、 b(1100'1010'1111'1110)
マクロ引数を区切る,の使用はプリプロセッサがエラー吐く(cc -Eの段階)
missing terminating '/" character
too much argument
etc. (pcc/tcc)

ex/m4とか外部ツールでプリプロセスするなら別だけど、c/cプリプロセッサの構文内では不可能に思う(当然リテラルとして自然な仕様拡張も)
2023/02/22(水) 15:22:17.41ID:mafEi4nvd
>>467
アセンブリやいにしえの言語は明示的なdecimal prefixを持ってるね
forthだと#123と変種?の&123
#の方がthe (decimal) 123と読めて個人的に好み
2023/02/22(水) 15:23:53.30ID:mafEi4nvd
the (decimal) number 123です
2023/02/22(水) 15:28:02.92ID:mafEi4nvd
299,792,458と書けたら素敵だけど
ds(299,792,458)が引数を区切る,と区別出来ないから無理だね
2023/02/22(水) 16:23:34.63ID:GDrSYSMbM
ほかの言語では、123_456_789の様にアンダーバーで区切るのが多い
Cでも出来たと思うけどなぜか'なんだよな…
アンダーバーが良かった
2023/02/22(水) 16:41:13.08ID:3MJ5isf30
C++に合わせたんでしょその方が都合がいいだろうし
2023/02/22(水) 16:52:25.15ID:3MJ5isf30
規格の紹介をしてる>>415に対してそれは解析器を変えないと難しいとか言ってる>>515は何なんだ?
C23でこうなります、なんだから難しいもクソもないと思うんだが笑
2023/02/22(水) 18:12:39.68ID:/HhOnmf9d
規格を批判してるんだが
2023/02/23(木) 02:20:36.04ID:zOdHjjZs0
まだワーキングドラフトだから対応するもしないのも自由だと思うし、c2xはアトリビュート関連くらいしか追ってないが、一応意見を

せめて不正なトークンとして弾ける約物にしてほしいな
0b10101011未対応(0cでも何でも)は不正な8進
トークン構成文字0b1010_1011なら不正な型サフィックスとして不正なトークンを報告できるので、ユーザに手直しさせるのも自明
パース状態をトグルする'はEOFまで食うので、エラーが報告されたとしてもcryptic

頻用したと仮定すれば、1/2の確率で釣り合うって字句解析をパスしてしまうのも厄介
2023/02/23(木) 04:08:08.64ID:zOdHjjZs0
>>416
俺は16bit程度なら一行で書いてしまうけど、より大きい整数型なら行を分けて書いてるな
(u)int64/128_tなんかで二次元データエンコードする時はこんな感じで

uint64_t plaid = 0b\
01010101\
10101010\
...\
;

ゲーム盤、行列、画像、畳み込みカーネル、マスク等、重宝する機会は多い

pbmそのままだからstatic変数にスクリプトでブチ込むのも楽で非常に重宝
普通(2)/8/10/16のみで任意進数(ビット深度)を指定できないのが歯痒いところ
2023/02/25(土) 15:46:50.99ID:2A7WVGnna
C++におけるユーザー定義の接尾辞で
_数字 みたいな奴を許可していなかったら桁区切り文字はアンダースコアになってた
2023/02/26(日) 07:07:10.46ID:Gr0Cvu5K0
だな
2023/02/26(日) 07:37:36.32ID:oQAKiXWbd
自己参照構造体を、テキストのコードが難しくて理解できない
2023/02/26(日) 07:49:42.99ID:ymHOkbuH0
>>525
まさか4567_8(→4567 of type "8")?
珍妙な…
2023/02/26(日) 07:58:07.27ID:ymHOkbuH0
extern "C"で混ぜるにはもう違いが多過ぎるし、c++と足並み揃えるのやめればいいのに
2023/02/26(日) 08:42:57.62ID:Gr0Cvu5K0
C++が流行りだした当時のCの財産を捨てずに済むってだけの話で
これから新しく作るものの足かせになるのは本末転倒だよな
2023/02/26(日) 12:16:51.44ID:0OyaNSrI0
C言語で構造体の双方リンク理解する前にテキストエディタ作るようなことあったら
激重エディタつくってただろうなぁと経験してもないことを妄想。

1文字挿入→その後ろの文章を全部コピーでずらして・・・
2023/02/26(日) 18:12:24.76ID:zCQzTRZzM
>>531
emacs なんかは1文字挿入のたびに後ろ全部コピーしなくても良いようにギャップバッファという手法を使っていた
2023/02/26(日) 18:34:27.49ID:akN/HRard
>>532
emacs!
Esc x compile
に何度も助けられた
一人で五万行くらいのコードを書いてたからな
ヘッダーファイルだけで50くらいあった
2023/02/26(日) 20:20:17.76ID:Qgs0XTsDM
>>532
過去形だけど今もだぞw
ギャップバッファは、最近流行りの複数カーソル使って離れた複数箇所を一気に編集すると、大量にコピーが発生して重くなる可能性がある
なのでこれからテキストエディタを実装するには、Piece Tableを使う方がいいと思われる
2023/02/26(日) 20:22:02.57ID:OdlyZwjm0
Slackware+JEに入ってたMuleを3年くらい使ってたけど別のエディタに移っちゃったな
悪くないと思うんだけど時代に合ってないというか、貧相な環境の方が使い出があるエディタだったな
2023/02/26(日) 20:31:33.93ID:Qgs0XTsDM
EmacsとかVimを貧相と思うのは、端末内で動かせるようになってるからだ
GUIはオマケみたいな扱いだ
でも、それはそれで存在意義はある
2023/02/26(日) 20:37:35.64ID:gahU4Yv80
viは来世紀にも残ってそうだから最初に覚えたなあ
eなんとかはデベロッパーのオナニーが透けて見えて気持ち悪すぎた
2023/02/26(日) 21:16:43.25ID:fbmwPkIL0
viの様にコマンド覚えなくても使えたから便利だったぞ
2023/02/26(日) 22:04:54.83ID:OdlyZwjm0
>>536
ちゃう、Emacsを貧相だと思ってるんじゃなくて計算機資源が豊かでない環境の方が使い出があるって言ってるんだよ
2023/02/26(日) 22:36:28.47ID:0m6hfJUV0
最初に使い込んだエディタの話?
俺はVZだったな
2023/02/27(月) 04:08:09.05ID:naBje3l2d
スレちがいだし
わりとしょうもないレベルの自慢話になってることを警告しておくぞ
2023/02/27(月) 07:30:50.50ID:U2h1s9M4d
ダム端末使ってた頃はviが有り難かったけど
今となっては当時慣らした人はともかく
若いやつにお奨めするもんじゃない
と俺は思うな
2023/02/27(月) 09:43:18.06ID:jlyK/+pC0
>>531
素のCだと何もないからデータ型を一つ一つ自分で理解していけていいという意味?
例えばC++ならlistがあるから理解しないままになる?
でもlistとvectorの違いを知らなければ結局
2023/02/27(月) 12:21:44.99ID:3zla3lE+0
>543
Cやる前はアセンブラだったからねぇ。アセンブラでの処理方法をそのままC言語に持ち込んでた。
当時はでっかく領域確保したらその領域で全部処理するって思考しか無かった(自動変数って概念も無し)。
2023/02/27(月) 12:29:45.17ID:U2h1s9M4d
ダミーセクションは使ってたけどね
2023/02/27(月) 17:11:48.94ID:3MgFEhuya
>>543
そこはdequeですよ常考
2023/02/28(火) 10:24:33.59ID:7/0mM3ia0
>>544
>自動変数って概念も無し

自分はデバッグでディスアセンブルを読むぐらいしか用事がないんだけど、
ゼロからアセンブリを書く場合はスタックの操作で領域管理したりはしないと?
2023/02/28(火) 10:32:54.86ID:7/0mM3ia0
>>546
listやvectorはほとんど使わない感じ?
2023/02/28(火) 12:10:45.99ID:dNNgH11Kd
スタックはレジスタのバックアップが主な用途で
メモリ変数はグローバルがデフォだった
だから変数表を作ってた
2023/02/28(火) 16:07:40.92ID:Ki6W+L2N0
あの 先頭に戻って検索 するかどうかを維持する変数名ってどんなのがいい?
2023/02/28(火) 16:44:22.88ID:295BsPXb0
>スタックの操作で領域管理
8086系だとスタックレジスタ直接使うと遅いんじゃなかったっけ?
MOV AX、[SP+10]
とかやるより
MOV AX、[TEMP]
...
TEMP: DW 0000h

ってやる方が速いとか。



BASIC時代のマシン語CALL時のレジスタエリアは16バイトってトラウマが・・・。
552デフォルトの名無しさん (アウアウウー Sa39-bn+B)
垢版 |
2023/02/28(火) 21:38:56.96ID:EshvOxGGa
ダミーセクションって、IBMのメインフレームのアセンブリ言語の DSECTですか?
2023/02/28(火) 21:47:36.63ID:svcsEAcG0
うん
2023/03/01(水) 20:42:10.06ID:fErXdR4ud
>>550
auto_reverse
絶対これにしなさい
2023/03/01(水) 23:36:37.44ID:5C60qBo90
>>550
cyclic
2023/03/02(木) 00:05:39.48ID:pZfd6NSK0
そういうのはいわゆる自転車小屋の議論になりがち。
そこそこ盛り上がりはすることもあるかもしれないけどあまり意味のある結論は出ないよ。
2023/03/02(木) 03:04:30.24ID:eGjuMjwU0
するか否か、1ビットのフラグの命名に他者を巻き込む議論が本当に必要ですかということか
すなわち名前はflagとかで変数宣言部に日本語コメントでも添えた方が建設的ということだな?違うか?
2023/03/02(木) 07:06:54.36ID:xa7MSIOTd
変数名の付け方は案件による
無論、一般論などない
主観と思い込みで強弁するやつはいるけどね
559デフォルトの名無しさん (ワッチョイ 7646-BmO7)
垢版 |
2023/03/02(木) 09:03:08.54ID:GoAAqo+J0
C-gengo wa mada nihon-go kakenai no?

bool 先頭に戻って検索 = 真 ;
2023/03/02(木) 16:32:03.69ID:N0PfEOQ90
質問の仕方でどういうコード書いてるか垣間見えるのはあるな
int searchtype = FROM_TOPとかBOTTOMとかBACKWARDみたいな持ち方ならそんな質問出ないだろうし
2023/03/02(木) 17:21:24.58ID:y83mRLNqd
>>551
どのCPUでもダイレクト指定が速いに決まっとりまんがな
レジスタ相対はレジスタにディスプレースメントを加算してからアドレス出力するんだから
2023/03/03(金) 01:19:24.14ID:5ZXS0iFm0
>>561
個々の命令の速度で考えればその通りだが今どきの CPU だと
パイプラインに隠れて差が出ない (差があっても観測不能なほどの極小) ってことも普通にあるんじゃないの?
2023/03/03(金) 08:02:43.32ID:an7QtCXRd
1Hzぐらいの速度で計測すれば何かわかるかもしれない
2023/03/03(金) 08:14:12.93ID:jW6Dg0m70
1Hzだと速度的には1秒周期なので測定の意味がない
2023/03/03(金) 22:40:53.27ID:1TAJ9GtV0
もしかするとCPUクロックをそこまで落としてデバッグしたいとかw
2023/03/04(土) 06:01:07.88ID:2lfmGWRw0
[sp+10]はメモリアクセス1回だが
[temp]は2回だな
8086だとキャッシュないからメモリのウエイト数の影響をモロに受ける
どciscでパイプラインなんかないし
2023/03/04(土) 19:01:51.83ID:siYz8HOgd
Cのコードを書くのにアセンブラまで意識するのか、、
立派な心がけあるな
精進しなされ

でも、CPUやコンバイラで違うじゃん、、、
568デフォルトの名無しさん (ワッチョイ 1302-ScW/)
垢版 |
2023/03/04(土) 21:31:31.02ID:mhQJa69K0
>>566
勘違いしてない?
2023/03/04(土) 21:33:37.98ID:K3zEUrJN0
[sp+10]が1回なら[temp]も1回じゃね
命令のフェッチは数えないんでしょ?

プリフェッチはパイプラインみたいなもんじゃね?
2023/03/04(土) 23:58:44.62ID:D8X7oasM0
素の8086にsp使えるアドレッシングはないのでbpで…
mov ax, [bp+disp] 命令3~4バイト 8+9クロック
mov ax, [TEMP] 命令4バイト 8+6クロック
と実効アドレスの計算時間に差があったという大昔のお話
2023/03/05(日) 06:15:37.72ID:nSao/Dea0
>>568
何が?
2023/03/05(日) 06:58:01.26ID:94fNx05VM
8086には現在のような深いパイプラインは無いがそれでもEU(Execution Unit : 実行ユニット)とBIU(Bus Interface Unit : バスインタフェースユニット)は独立しており
メモリアクセスと内部のALUはそれぞれ別々に動作する
ある意味初歩的な2段パイプラインとも言える構造で単純なクロックサイクルの加算とはならない
573デフォルトの名無しさん (ワッチョイ 1302-ScW/)
垢版 |
2023/03/05(日) 07:13:34.61ID:cmZGkkdl0
>>571
>[temp]は2回だな
なぜ2回?
2023/03/05(日) 08:11:12.86ID:nSao/Dea0
>>573
temp: dw 0000h
つまりtempはメモリに置かれている
tempのREADで1回、
[]によるインダイレクトでもう1回
だろ
2023/03/05(日) 12:43:47.21ID:nmaj3sub0
>>567
昔昔はそういうものだったんよ。
Cは、
・プログラマの責任において何でもできる
・コンパイラはプログラマの意思に忠実であれ(余計な最適化なんかするんじゃねえ!)
ってこと。だから、
a=a+1;と、a++;は違う。
前者は加算命令、後者はインクリメント命令になってほしいというのが、プログラマの意志。
ただ、Cが色々な場で広く使われるようになって、最適化を進めるしかなくなったから、そんなのどうでもいいことになったけど。
2023/03/05(日) 12:47:05.12ID:s1YdjeUN0
>>574
だからさ……それを2回っていうなら、[sp+10]も2回だろ
2023/03/05(日) 13:30:59.36ID:nSao/Dea0
>>576
何で?
即値はフェッチ時点で取り込まれているのに
2023/03/05(日) 15:05:57.71ID:s1YdjeUN0
>>577
tempもtemp自体は即値だよ
[sp+10]と[temp]の違いはレジスタ相対かどうかだけ
579デフォルトの名無しさん (ワッチョイ 13ad-Qpn1)
垢版 |
2023/03/05(日) 15:07:29.13ID:YlwUczDE0
>>575
ま、しかし、昔はコンパイラの最適化がしょぼかったというのもあるな。
CPU (特に 8 bit CPU とか) がC言語等のいわゆる高級言語を全く意識して作られていないというのが最大の問題だったのかも知れないが。
2023/03/05(日) 15:41:40.37ID:nSao/Dea0
>>578
DWディレクティブで定義してるんだからリテラルの類だよ
命令コードと一緒にフェッチされる即値とは根本的に違う
2023/03/05(日) 16:48:35.64ID:0aHQQO/od
>>577
CPU仕様によるが
68000では8ビット範囲以内のディスプレースメントは命令中に含まれてたが
8086はどうだっけ…
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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