1 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 23:32:27.83 ID:yWVViPyIM.net] !extend:checked:vvvvv:1000:512 (新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C2x ドラフト www.open-std.org/jtc1/sc22/wg14/www/docs/n2731.pdf C99 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 www.kouno.jp/home/c_faq/ JPCERT C コーディングスタンダード https://www.jpcert.or.jp/sc-rules/ ※前スレ C言語なら俺に聞け 158 https://mevius.5ch.net/test/read.cgi/tech/1640401906/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
830 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 09:45:19.90 ID:B9k8N7vL0.net] >>805 そういうプロセッサーはあるよ(ディスコンしてるけど) https://i.imgur.com/Lqs3ejR.jpg Z80 の裏レジスタは裏側のレジスタを直接触れなくてモヤモヤしたけどこいつは他のバンクのレジスタも直接さわれるからちょっと便利 PCとかもメモリー空間に見えてるプロセッサーもあったような気がするけど具体的なプロセッサー名を思い出せない >>806 それはちょっと話が違う 単にアドレッシングモードとしてゼロページやダイレクトページが短いコードで扱えると言うだけのことでメモリーはあくまでもメモリー 例えば6800はPSH AでAレジスタをスタックにプッシュ出来るけどゼロページの内容を直接
831 名前:プッシュ出来るわけじゃない 6502 のインダイレクト・インデックストYぐらいの機能ならまあベースレジスタをメモリー上に置けるとは言えるけど [] [ここ壊れてます]
832 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 09:47:13.53 ID:B9k8N7vL0.net] >>817 しつこいのは君かと そもそも左辺値なんて言語仕様で定義されてるんだから仕様書で反論できない時点でお前の負け
833 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 10:26:09.32 ID:2yXQoOg9d.net] IDコロコロ
834 名前:はちみつ餃子 mailto:sage [2022/12/11(日) 10:45:16.87 ID:ftKoc+Hh0.net] >>819 べつに勝ち負けを競っているわけじゃない。 根拠 (この場合は言語仕様) に基づく解釈の妥当性がそれで変わることはないので納得しない誰かがいても不都合もない。 5ch に書き込むのはただの暇つぶしだ。 どうせほかに話題もないんだからしつこくてもいいんじゃね。 反応するかどうかは知らんけど。
835 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 11:25:34.59 ID:RuZtb54i0.net] >>821 そういうレスは流石にしつこいわ
836 名前:デフォルトの名無しさん (ワッチョイ 87bb-3TNT) mailto:sage [2022/12/11(日) 15:02:48.86 ID:51+9+dkC0.net] ブレークブレークw
837 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 15:25:03.37 ID:jc+ZhrAU0.net] みんな仲良くしなよ
838 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 17:37:29.66 ID:kiLLcra70.net] ポインタは卒業した。コンパイラあるんだから、ググるより書いて結果を見たほうが早いぞ。 何十回も繰り返せばわかるはず。
839 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 17:42:03.60 ID:kiLLcra70.net] 亀レスだが機械語を知らないと、いい高級言語は書けない、ってのはわからん。 機械語と高級言語は別物だろう。 機械語を簡単に理解できる知能水準の人は、高級言語を新しく学習したときも たやすく理解できる、 というのが実態なのに、ネットでは背びれ尾ひれついて、「ハードウェアを知らないと、〜」みたいな 論調が市民権を得ているな。
840 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 18:08:31.63 ID:3kpvLkL20.net] CやC++はアセンブラレベルが理解出来ないとそもそも実装が無茶苦茶だったりするけど ポインタとかが無いJavaとかはそこまでアセンブラレベルでどうのこうのってのは無いが それでもコンピュータ的な知識が皆無な奴は論理演算を理解出来なかったりするし ビットシフトみたいなことやってると、何でこんな書き方しているの?みたいな事言う奴出てくるからなぁw
841 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 18:39:34.39 ID:jc+ZhrAU0.net] それがメモリー上二銅格納されてるか位は知っておいた方が良いよ 配列データをソートする時、どうやると効率的かがすぐ分かる
842 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 18:40:10.49 ID:jc+ZhrAU0.net] メモリー上にどう格納
843 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 18:50:45.41 ID:DhbhWaSTM.net] 2の補数表現の知識は機械語の範疇だろう スタックもそうだ Cの仕様にスタックなんて言葉は出てこないからな register指定も完全に機械語だ タイマとか割り込みを扱う場合は機械語の知識も必要だな setjmp longjmpも何が保存されてるのか理解するには機械語の知識が必要だ 要するに機械語の知識は必要だ
844 名前:はちみつ餃子 mailto:sage [2022/12/11(日) 19:18:24.83 ID:ftKoc+Hh0.net] >>825 ポインタ演算は未定義動作を簡単に引き起こせてしまうので 十分に理解できてない状態で実際に動作させてみるというのはあまりあてにならない。 ある程度は理解した上で実際にやってみたら納得しやすいってことならわかるけど。
845 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 19:19:01.91 ID:HcYuyEaDa.net] 何十年前の話題を蒸し返してるのか知らんけど今のコンパイラは賢いからregisterとか使う必要ないぞ むしろ人間が余計な指示を出すことで効率が悪くなる可能性すらあるからハードウェアの知識が云々とかいう老害理論はパイプラインとかキャッシュとかを全て把握してから言ってくれ 君たちの時代は終わったんだよ
846 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 19:29:49.83 ID:vn3Pz69o0.net] register なんてあてにならんもん、使ってる奴いなかったと思うよ 本当に速くしたい所は、それこそインラインアセンブラ使ったり アセンブルしたルーチン呼んでたし
847 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 19:33:50.07 ID:HcYuyEaDa.net] >>833 コンパイラが本当に愚直な時は最適化無しで使ってたぞ
848 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 19:38:52.22 ID:vn3Pz69o0.net] それは失礼した
849 名前:はちみつ餃子 mailto:sage [2022/12/11(日) 19:39:00.70 ID:ftKoc+Hh0.net] 少なくとも gcc とか clang くらいのモダンな処理系ではコンパイラの判断のほうが賢いわな。 低レイヤのコードだと人手で指定を付けたいときもあるかもしれんが そういう分野ではどうせ処理系の拡張がなきゃどうにもならんので register キーワード程度のあやふやなものひとつを言語仕様に入れてもあまり役に立たない。 C++ では register は削除された (機能は削除されたがキーワードとしては予約語のまま) わけだし、 C でもその内に削除されるんじゃないかな。
850 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 20:04:06.71 ID:8Gp9TgZBa.net] register なんて要らんとか昔からずーっと言われてるけど つけたらつけたで速くなったのその目で見たやつも居るでしょ? gcc と gprof だけで頑張ってたとき確かに速くなったけど だから register は有効有用使うべきとは言わないけどね
851 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 21:31:25.77 ID:OhnENqmv0.net] >>830 >setjmp longjmpも何が保存されてるのか理解するには機械語の知識が必要だ 基本スタックポインタとプログラムカウンタだけだと思っていましたが、まあレジスタ全部と他何を保存してましたっけ?
852 名前:ハノン mailto:sage [2022/12/11(日) 22:26:47.72 ID:OhnENqmv0.net] >>836 >C++ では register は削除された (機能は削除されたがキーワードとしては予約語のまま) auto のように別の形で復活しそうですね あと、asm はどうなりましたか?
853 名前:デフォルトの名無しさん mailto:sage [2022/12/11(日) 22:34:58.44 ID:IkAIpxjPM.net] >>838 基本レジスタ全部だな(OSが使うレジスタは含まず) 他は無いはずだけど ただ、戻り値にレジスタを使ってる場合は、そのレジスタは書き換えられてるだろう
854 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 06:30:06.98 ID:ychPXO7Q0.net] メジャーどころのCPUは大抵、戻り値はレジスタだね
855 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 07:28:31.07 ID:v0et11DOM.net] 呼出規約 https://ja.wikipedia.org/wiki/%E5%91%BC%E5%87%BA%E8%A6%8F%E7%B4%84
856 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 14:27:00.05 ID:Y3syqvcfd.net] static記憶クラス指定子の理解はできますが、いざプログラムを組んでみると、使い方がわかりません。
857 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 14:36:59.78 ID:jnrvptAKa.net] >>841 CPU関係あるか?
858 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 14:37:08.19 ID:RmZ1ojDx0.net] わかるものを使えばいいよ
859 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 15:05:24.79 ID:BWUj5Mhq0.net] 意訳 メジャーどころのCPU(に対応したCコンパイラ)は大抵、戻り値はレジスタだね ではないかと VCだとコンパイルオプションで変化した記憶がある
860 名前:はちみつ餃子 mailto:sage [2022/12/12(月) 16:42:43.35 ID:J7ftRWn10.net] >>844 呼び出し規約 (を含む ABI) の策定はアーキテクチャを設計したところが主導するもんじゃないのかな。 CPU の特性に反した使い方を基本にされても困るだろうし。 ざっと調べた感じだとよく使われている System V ABI はインテルが議長の委員会で決める体制っぽい。 マイクロソフト (Windows) は引数の渡し方がちょっと違う規約でやってて 文句も出てない (出てないよね?) からそんなに強い強制力があるわけでもないんだろうけど、 CPU ごとに常識的な使い方というものはあるだろう。
861 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 16:59:57.60 ID:RmZ1ojDx0.net] B言語でも戻り値はレジスタだったし
862 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 19:01:13.79 ID:xR631HBma.net] >>847 マイクロソフトが作ってるハードはSurfaceとかだろ?
863 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 19:19:51.33 ID:m7KoqGgA0.net] DOS時代にグラフィックライブラリとかをMASMでアセンブルして出来たobjファイルを Cコンパイラで作ったobjとをリンクさせて Cからアセンブラのルーチン呼び出したりしてたけど、 COBOLやFORTRANで作った関数をリンクさせて Cで呼び出したりも出来るの?
864 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 19:31:09.72 ID:BWUj5Mhq0.net] FORTRANなら呼べると思うが、COBOLは分からない FORTRANやCOBOLからならCの関数は呼べたと思う
865 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 19:34:09.58 ID:2yJi4NkT0.net] objファイルは流石に無理があるけどDLLや静的ライブラリでも作れば良いだけでは? gfortranならexe以外にもDLL等が作成出来る
866 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 19:37:26.25 ID:BWUj5Mhq0.net] 受け渡しのデータ型も割と近くないかな?
867 名前:デフォルトの名無しさん (ワッチョイ a701-3npV) mailto:sage [2022/12/12(月) 19:39:34.73 ID:qCai2YYC0.net] 引数の積みかたやらスタックフレームの巻き戻しはどっちがやるか等の約束事が シンプルに固定されてるDLLなら他所言語への持ち出しや持ち入れがやりやすいわね
868 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 20:17:18.59 ID:munrOkPw0.net] >>828 まあ・・C言語を触るぐらいだから、一般的には大学とかのコンピュータサイエンス教科を 履修しているのが前提だろうから、そこはあえて省略したのですが・・ 昔の高校生は頭がよかったけど。 今は「仕事でC言語を触らせてくれる身分」になるためには基本、情報系の大卒でしょうし・・
869 名前:デフォルトの名無しさん mailto:sage [2022/12/12(月) 20:18:59.06 ID:munrOkPw0.net] >>828 配列のソートってメモリ意識しますかね。フラグメンテーションとか考えたこともないな・・。 単純に演算オーダー(log O^n とか・・)そんな感じである程度予測を立てて、あとは扱うデータ次第かと。
870 名前:はちみつ餃子 mailto:sage [2022/12/12(月) 21:58:34.14 ID:J7ftRWn10.net] アルゴリズムのレベルではある程度の効率は事前に考えるけど 断片化とかキャッシュヒットとかはチューニングが必要な状況になるまで考えないな。 むしろ考慮したくなっても意識的に忘れるようにする。 いわゆる「早すぎる最適化」の一種だから。 当然ながら必要になったときには知っている必要はあるんだけどそんな機会は多くないよね。 普通の (アルゴリズムのレベルでは充分に配慮された) プログラムを書いて極端に効率が悪いようなら メモリアロケータやキャッシュの設計のほうが悪い。 (そうは言っても目の前にあるものがそうなってるなら自分のほうが合わさないとしょうがないんだろうけどさ……)
871 名前:ハノン mailto:sage [2022/12/12(月) 22:18:23.35 ID:1Of7Vyge0.net] >>847 win32api はなぜ PASCAL にしたんでしょうかね?
872 名前:ハノン mailto:sage [2022/12/12(月) 22:21:28.35 ID:1Of7Vyge0.net] >>847 AMD64 は AMD が呼び出し規約まで決めちゃったけれども、普通は OS 屋が決めるものという気がしますけどね
873 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT) mailto:sage [2022/12/12(月) 23:05:07.66 ID:J7ftRWn10.net] >>839 register というキーワードが将来に転用 (repurposing) 出来るようにというのは書かれている。 https://timsong-cpp.github.io/cppwp/n4659/diff.cpp14.dcl.dcl auto という名前が新しい用途にぴったり (少なくとも不自然ではない) なので それと同じくらいに register という名前が丁度良い場面というのは全く想像がつかないんだけど 思いもよらぬ形で上手いこと使われることはあるかもしれんね。 メンバ関数の宣言のときの default とか delete とかも考えたやつは天才じゃん……と私は思ったよ。
874 名前:デフォルトの名無しさん (ワッチョイ 7f63-KKgq) mailto:sage [2022/12/12(月) 23:08:20.90 ID:BWUj5Mhq0.net] switch文のdefaultはたまに綴りを間違えてしまうw
875 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT) mailto:sage [2022/12/12(月) 23:14:51.65 ID:J7ftRWn10.net] >>861 あれの問題点は綴りを間違えてもラベルという扱いになってしまってエラーとして検出されないところなんよね。 処理系やオプションによっては使われていないラベルとして警告が出たりはするんだけど。
876 名前:デフォルトの名無しさん (スフッ Sdff-d44j) mailto:sage [2022/12/12(月) 23:35:39.10 ID:zHXfNaq5d.net] 転用とかややこしいだけだから勘弁 自動でautoだからあんまり気にすんなよ、ちなc++ではこんな意味だよと、またややこしい補足が増えるだけ むしろアンスコ付きの変な名前の方がかえってキーワードなんだなと分かりやすい、ソースは醜くなるけど、それは今更
877 名前:デフォルトの名無しさん (ワッチョイ 7fcf-FUlb) mailto:sage [2022/12/13(火) 00:08:19.11 ID:HbzfEbfW0.net] auto も B言語の名残りだか後方互換だかで、 Bではデータ型がなくて、変数=整数が文脈により、ポインタとしても使われた その storage classesとして、automatic, external, internal の3種類があった main() { extrn putchar, n, v; auto i, c, col, a; (略) putchar('*n*n'); } v[2000]; n 2000; という風に auto で変数を宣言していた
878 名前:デフォルトの名無しさん (スフッ Sdff-d44j) mailto:sage [2022/12/13(火) 00:29:54.37 ID:+JwZZYrvd.net] 他に触る言語で明示的にauto宣言するのはbcかな、オモチャみたいなもんでPOSIXも有名無実で仕様なんぞ無いに等しいが ポインタは明示的に触らないけど、エミュる時は配列の添字にauto変数(整数)突っ込むからむしろCよりBっぽい
879 名前:デフォルトの名無しさん (ワッチョイ 7f63-KKgq) mailto:sage [2022/12/13(火) 00:36:12.95 ID:FXPyPtyo0.net] 可変長で必要に応じて伸び縮みする配列とか、 桁数制限無しの整数型や計算誤差のない実数型とか 誰か作って(人任せ)
880 名前:デフォルトの名無しさん mailto:sage [2022/12/13(火) 06:01:01.43 ID:d0KqwuA/0.net] > 桁数制限無しの整数型 つGMP
881 名前:デフォルトの名無しさん mailto:sage [2022/12/13(火) 07:11:07.69 ID:ZjPntofYa.net] >>858 当時流行ってたからだろ
882 名前:デフォルトの名無しさん mailto:sage [2022/12/13(火) 07:11:26.57 ID:4+XH+KhI0.net] >>866 >桁数制限無しの整数型 https://mevius.5ch.net/test/read.cgi/tech/1434079972/84
883 名前:デフォルトの名無しさん mailto:sage [2022/12/13(火) 13:48:16.74 ID:aee1RRAhM.net] 計算誤差の無い実数型って不可能だけどなw decimalを使うと2進数は10進数の浮動小数点数を正確に表現出来ない問題を解消できる ratio(分数)を使うと、1/3とかをそのまま保持出来るから誤差が出ない ちなみに、Common Lispは分数を凄い簡単に扱えるしbignumも使える Cでもそうなって欲しいもんだ
884 名前:デフォルトの名無しさん mailto:sage [2022/12/13(火) 13:59:48.87 ID:7PNjtjtua.net] なぜ分数や多倍長整数が必要な案件にCなんかを使うのか
885 名前:デフォルトの名無しさん mailto:sage [2022/12/14(水) 12:00:46.68 ID:erx97Ujd0.net] 虚数や複素数も扱えてたよね あまり使い道はないかも知れないが
886 名前:デフォルトの名無しさん mailto:sage [2022/12/14(水) 13:40:07.30 ID:XaqmHtNn0.net] 区間を分割して評価、終了判定がintegerpで判定とか細かい所で色々楽はできるだろう 単にスケールしても済むし、何回もやるなら任意精度でない有理型くらい構造体とgcdさえ書ければ誰でも書けるだろ 用途が違うし別にclは推さんが、標準の一つであるcltl2はあらゆるプログラマに貴重な書 浮動小数点演算に関しても複素関数の豊富なプロット載せて定義やブランチカット選びの良し悪しにかなりページ割いて、その図の生成に使ったpsコード生成コードも載ってる つーか>>866 はbcって言って欲しいだけでしょ、おまえら釣られすぎ
887 名前:デフォルトの名無しさん mailto:sage [2022/12/14(水) 14:04:41.21 ID:XaqmHtNn0.net] <cmath.h>徹底解剖みたいな文献って無いんだろうか
888 名前:デフォルトの名無しさん mailto:sage [2022/12/14(水) 14:17:47.17 ID:XaqmHtNn0.net] complex.hだった 最近触り始めたpythonでcmathだから素で間違えた んでc++はmath.hが<cmath>と…
889 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT) mailto:sage [2022/12/14(水) 16:18:53.52 ID:YAu9ihh40.net] math.h と cmath とは事情がややこしいので単に名前が変わっただけとは思わないほうがいい。 math.h の関数は多相化されてなくてマクロで多相化された版は tgmath.h にある。 cmath の多相化にはテンプレートが使われている。
890 名前:デフォルトの名無しさん mailto:sage [2022/12/14(水) 19:29:35.78 ID:XaqmHtNn0.net] Cのtgmathの方が(実装的な意味で)エグいよね よくマクロの真髄みたいに色んな実装が紹介されるし、ちゃんと動いてるんだろうけど ちょっと訳がわからないものは避けたい… _Genericでスッキリ書けたりしないのだろうか
891 名前:デフォルトの名無しさん mailto:sage [2022/12/14(水) 20:13:04.33 ID:h6lYzG45d.net] ヘッダに直書きされてるから目につく機会が多いだけで、内部的にやっても同じロジックが隠れるだけか 気にし出せばきりがないようにも思う
892 名前:デフォルトの名無しさん mailto:sage [2022/12/14(水) 20:45:14.60 ID:QXbvEgmH0.net] >>874 <ccmath>?
893 名前:はちみつ餃子 mailto:sage [2022/12/15(木) 14:40:26.12 ID:xFKc8Du50.net] >>877 _Generic で素直に分岐すれば問題なくかけるよ。 tgmath.h が規格に入ったとき (C99) は規格の範囲内でやる方法は無かったので 処理系の拡張を使ったり新たな拡張を作ったりしてなんとかなったのだがやっぱりそれは あかんやろと思ったのか C11 で _Generic を入れることになった。 ただ、処理系は C99 に厳密なモードを持つことがあるからそのモードで動かしたときに ヘッダ内の _Generic についていちいち警告なりエラーなりが出るのもよろしくないし、 #ifdef で分けるのも二度手間だし、 旧来通りの実装で残すのはそれなりに合理的なんだと思う。 ありがたいことに普通に使う分には標準ヘッダの実体を気にする必要はないのだから忘れておくのが幸せだろう。
894 名前:デフォルトの名無しさん [2022/12/21(水) 10:08:23.47 ID:537DsEmx0.net] // エラーを報告するための関数 // printfと同じ引数を取る void error(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); exit(1); } これってprintfをerrorに変えただけって認識でok
895 名前:デフォルトの名無しさん [2022/12/21(水) 10:08:47.18 ID:537DsEmx0.net] すまん誤爆した
896 名前:デフォルトの名無しさん [2022/12/21(水) 10:11:35.91 ID:537DsEmx0.net] これってprintfをerrorに変えただけって認識でok? error("引数の個数が正しくありません");と fprintf(stderr, "引数の個数が正しくありません\n"); の違いを誰か教えてくれ
897 名前:はちみつ餃子 mailto:sage [2022/12/21(水) 10:21:03.43 ID:6CmfCawf0.net] >>881-883 その認識でいいけどそれに加えて最後に exit で終わっているから 復旧不可能なエラーを報告するための関数なんだろ。
898 名前:デフォルトの名無しさん mailto:sage [2022/12/21(水) 10:21:33.71 ID:LOXcnIHB0.net] 呼び出したら、死ぬ?
899 名前:デフォルトの名無しさん mailto:sage [2022/12/21(水) 10:31:04.10 ID:Fs8T+fBed.net] そのerrorならexit以外そうじゃね perror(msg)はもう少し賢くて fprintf(stderror, "%s: %s\n", msg, strerror(errno)) 相当(by k&r2e)
900 名前:デフォルトの名無しさん [2022/12/21(水) 10:34:02.36 ID:537DsEmx0.net] >>884 こんな時間にありがとう、助かる。 fprintf(stderr, "引数の個数が正しくありません\n");と同じってことやな これにexitを加えて関数にしたのがerrorってことやね わざわざerror関数にする必要性がわからんかったから助かったわ
901 名前:デフォルトの名無しさん mailto:sage [2022/12/21(水) 10:37:12.34 ID:LOXcnIHB0.net] 私なら、error()を呼び出した側でexit()呼ぶなあ
902 名前:デフォルトの名無しさん mailto:sage [2022/12/21(水) 10:39:53.43 ID:Fs8T+fBed.net] ステータス選べるしな わざわざexitに渡すステータス引数を拵えるくらいならexit読んだ方が早い
903 名前:デフォルトの名無しさん mailto:sage [2022/12/21(水) 10:51:42.39 ID:Fs8T+fBed.net] >>881 あ、地味にfprintf(stderr, "\n")でフラッシュしてるのに気付いた あるいはfmtへの\n付け忘れ防止配慮か 基本stderrはこまめにフラッシュされるものと思ってるけど、fflushや"\n"で念を入れても損は無いな
904 名前:はちみつ餃子 mailto:sage [2022/12/21(水) 11:33:17.33 ID:6CmfCawf0.net] 言語仕様では exit で終了とか main の終端に到達した場合に全てのオープンされているファイルはクローズする (そのときに全ての出力ストリームをフラッシュする) というのは保証してる。 エラーが起きている状況でどこまで信用できるかよくわからんから念押ししても損はないだろうけど。
905 名前:デフォルトの名無しさん [2022/12/21(水) 15:19:19.23 ID:537DsEmx0.net] codepad.org/noY0x7K2 これの70行目と79行目の*ってただただ関数でポインタを扱うよってだけ? なんか関数ポインタと似ててどうなんやって思った int (*func1)(char*, int);
906 名前:デフォルトの名無しさん mailto:sage [2022/12/21(水) 15:23:54.32 ID:WXW0EqS+d.net] なんか質問者はexit呼ばないんだったら関数化しないでええやろって思ってそうで怖いな 設計方針次第でもあるが心配になるな
907 名前:デフォルトの名無しさん [2022/12/21(水) 15:35:25.72 ID:537DsEmx0.net] >>893 今学習段階だからかなりの無知なんや、すまん
908 名前:デフォルトの名無しさん [2022/12/21(水) 15:51:20.06 ID:537DsEmx0.net] あと上のURLのプログラムのcallocではメモリ解放してないけど大丈夫なのか?
909 名前:はちみつ餃子 mailto:sage [2022/12/21(水) 15:56:02.50 ID:6CmfCawf0.net] >>892 返却値の型が Token* であるという意味。 でも文法的には * は宣言子に含まれていて Token の側じゃなく関数名がある側のグループなんよ。 だから右側に寄せて書く習慣になってる。 C の宣言の文法が無茶苦茶なのはイマサラな話なので……。 可変長引数の扱いも低レイヤの事情が見え隠れするような古の設計なので 歴史的事情を知らんとわけわからんのもしょうがないとは思う。
910 名前:デフォルトの名無しさん (ワッチョイ 7e02-evpg) mailto:sage [2022/12/21(水) 16:08:16.37 ID:5pWmYDMC0.net] 一貫性が大事って意味ならそう思う、特にdiagnosticなエラー(最後まで残る)は 俺は手入力で適当なエラーメッセージ書くのは極力控えてる、例えば数学関数書いてるなら errno = EDOM; perror(__func__); →my_func: Argument to the math function out of domain. 的な 手続き的なルーチン(main)なら__FILE__/__LINE__とかで 用意されてるシンボル定数で意味論が合うなら活用すべき EDOMなんかは好きに使っていいけど、システム、IO関連のエラーは意味が直感的でなかったり、規約に厳密に従わないとerrno見るcallerが騙されたりでバグの素なので、ちゃんとマニュアル参照のこと
911 名前:デフォルトの名無しさん (ワッチョイ 2a04-e5AJ) [2022/12/21(水) 16:09:52.42 ID:537DsEmx0.net] >>896 こりゃかなわん。 基礎から出直してくる
912 名前:デフォルトの名無しさん (ワッチョイ 7e02-evpg) mailto:sage [2022/12/21(水) 16:10:45.37 ID:5pWmYDMC0.net] ああ、当たり前だけどerrnoを上書きする前に気付いてないフラグ立ってないかif(!errno)チェックは忘れずに 割と立ってる事がある()
913 名前:デフォルトの名無しさん (スップ Sd8a-UQjj) mailto:sage [2022/12/21(水) 16:16:43.94 ID:WXW0EqS+d.net] >>895 勿論使い終わったら解放する必要があるので解放関数を用意してあげよう
914 名前:デフォルトの名無しさん mailto:sage [2022/12/21(水) 17:55:00.19 ID:j8NGwdcp0.net] >>895 exit() したら解放されるからいいんじゃん って言う層が一定数いる
915 名前:デフォルトの名無しさん mailto:sage [2022/12/21(水) 18:13:15.89 ID:3kYobt3Gd.net] 今、息してるのか?
916 名前:デフォルトの名無しさん mailto:sage [2022/12/21(水) 18:21:41.76 ID:LOXcnIHB0.net] 一日一回再起動すれば大丈夫
917 名前:デフォルトの名無しさん mailto:sage [2022/12/21(水) 21:42:34.64 ID:MxQdxJ6G0.net] 再起動なんてちまちましたことやってられるかい 電源ぶっこ抜いて入れ直すんだよ、それか蹴れば直る
918 名前:デフォルトの名無しさん mailto:sage [2022/12/22(木) 11:43:33.39 ID:kpFE4WK60.net] アプリ(強制)終了後に使ったファイル削除→このファイルは使用中です。 OSで保証されてないならアプリ側でやるしか無いじゃん。
919 名前:デフォルトの名無しさん mailto:sage [2022/12/22(木) 13:27:28.75 ID:LbsYIb+eM.net] 誰かがこのPCを使っている
920 名前:デフォルトの名無しさん mailto:sage [2022/12/22(木) 13:35:11.18 ID:KHPfY9lXd.net] LANなら充分にあり得ることだな
921 名前:デフォルトの名無しさん (ワッチョイ 9710-Hnc0) mailto:sage [2022/12/22(木) 19:42:13.17 ID:/Ar1RYH70.net] プロセス終了に関しちゃ今時のOSでハンドル握りっぱなしにはならんでしょ
922 名前:デフォルトの名無しさん mailto:sage [2022/12/22(木) 20:28:13.17 ID:Q5govio9d.net] /* 文字列を逆順にして返す関数 */ #include <stdio.h> #include <string.h> void reverse(char *ss); int main(void) { char tt[]= "programing game"; reverse(tt); printf("tt=%s\n",tt); return 0; } void reverse(char *ss) { int wk,pos1=0,pos2; pos2=strlen(ss)-1; while (pos1<pos2) { wk=*(ss+pos1) *(ss+pos1)=*(ss+pos2); *(ss+pos2)=wk; ++pos1; --pos2; } } このプログラム、gccだとコンパイル出来ますが、clangだと以下のエラーになります。なぜでしょうか? ~/CCR/UserFiles/sample26.c:22:3: error: invalid operands to binary expression ('int' and 'char *') *(ss+pos1)=*(ss+pos2); ^~~~~~~~~~ 1 error generated
923 名前:はちみつ餃子 mailto:sage [2022/12/22(木) 20:40:06.89 ID:KT1tc7ko0.net] >>909 wk=*(ss+pos1) の後にセミコロンが抜けてる。
924 名前:デフォルトの名無しさん mailto:sage [2022/12/22(木) 20:43:53.45 ID:Q5govio9d.net] ありがとうございます。コピペミスでした。
925 名前:はちみつ餃子 mailto:sage [2022/12/22(木) 21:11:31.21 ID:KT1tc7ko0.net] 事例としては面白いよ。 セミコロンが抜けても一応は式の形式として成立するから 型が合わないというところがエラーとして報告されちゃうんだな。
926 名前:デフォルトの名無しさん mailto:sage [2022/12/22(木) 22:10:59.69 ID:dL3lthyL0.net] 昔のコンパイラならエラーなしで通してだろうな
927 名前:デフォルトの名無しさん mailto:sage [2022/12/22(木) 22:43:34.75 ID:K5vPIqXq0.net] ナウいヤングな文字列の掛け算はサポート外なんだわ strcatで頑張れ
928 名前:デフォルトの名無しさん mailto:sage [2022/12/22(木) 23:40:21.52 ID:bege0WAi0.net] 昔のコンパイラだと=*が乗算代入だったんだけどな
929 名前:デフォルトの名無しさん mailto:sage [2022/12/23(金) 08:27:13.83 ID:msM3WKDD0.net] exit on free 論争か・・・ そういう論争があったというのは知っているが どっちに帰着したのか知らない
930 名前:デフォルトの名無しさん mailto:sage [2022/12/23(金) 08:52:05.54 ID:FPNxo7old.net] RAIIでexitするやついたら匙投げる