1 名前:デフォルトの名無しさん (ワッチョイ 0f63-sFbk) mailto:sage [2023/04/21(金) 14:05:20.18 ID:rqj2HSDF0.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 C23 最新ドラフト https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.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言語なら俺に聞け 160 https://mevius.5ch.net/test/read.cgi/tech/1672191630/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
91 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-By2c) mailto:sage [2023/05/04(木) 00:37:13.28 ID:zfmlH8qj0.net] >>90 厳格な方向に改定してんのね。 今までが緩すぎたからしょうがないね。
92 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 01:26:39.82 ID:KJPnL+/P0.net] >>91 あ、ごめん書き方が悪かった。 これまではタグ及び内容が同じでも適合しなかったところ、 C23 から適合するようになるという話。 有効になるプログラムが増えるので、どちらかというと緩くなる変更。
93 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 04:12:02.40 ID:W+5O3yqN0.net] 急に凄くレベル低い話して申し訳ないんだけど #include <stdio.h> int main() { int a[101] = {}; a[0] = 2; a[1] = 3; for (int i = 4; i < 1000; i++) { int r = 1, j; for (j = 0; j <= 100 && a[j] != 0; j++) { if ((i % a[j]) == 0) { r = 0; break; } } printf("%d %d %d %d %d \n", i, j, a[j], i % a[j], r); if (r) a[j + 1] = i; } for (int i = 0; i < 100; i++) printf("%d ", a[i]); } なんでこれ上手く動かないんだろう
94 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 05:17:57.46 ID:P5ZkmciJ0.net] このスレいつもレベル低いから大丈夫でしょ 上手く動かない?そもそもそのコードはどう動いて欲しいのか読み取れないんだよな 日頃から入出力を意識して書けって言われてない?まるで実践できてないからダメか
95 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 07:37:53.19 ID:6SJC1K3b0.net] >>93 二つ目の for ループから抜ける条件の一つが「a[j]がゼロ」なのに、そのループから抜けた直後で i % a[j] とかやってて、jが2のときにa[2]が0でループから抜けるから、ゼロ除算で落ちる それとこっちは直接の原因ではないけど、int a[101]と宣言すると a[0]~a[100]までしかアクセスできないのにa[102]までアクセスする可能性があるようなコードになってるのもダメだな
96 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 08:36:39.17 ID:Hj8mrajJd.net] とりあえず初期化するとき int a[101] = {0,1,2}; と書いたほうが楽じゃん ちなみに初期値がない部分は0になる 後はめんどくさいから明日読むわ
97 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 08:46:33.13 ID:Hj8mrajJd.net] 間違えた int a[101] = {1,2}; か ちなみに int a[101] = {}; ではまったく初期化されないからこのプログラムでは[0][1]以外のところには0ではなく不定値が入ってるのでうまく動かないのはそれなんじゃね int a[101] = {0}; と書いておけば省略した部分もすべての要素が0で初期化されるよ
98 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 09:36:07.29 ID:GmhF7zKn0.net] >>93 i と j ってわかりづらいから j は k に置き換えて言うけど i=4 のとき k=0 で 4%2 となり割り切れるため、何もせずに次 i=5 のとき k=2 で a[k]==0 なので k のループを抜ける(このときk==2でa[2]) 抜けた後のif (r) a[k + 1] = i; で a[3] = 5 になっていて a[2] は 0 のまま で0除算でドボン まずはif (r) a[k + 1] = i; ではなく if (r) a[k] = i; だね
99 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 09:58:25.07 ID:GmhF7zKn0.net] >>93 それとこれって素数を見つけるプログラムと思うけど、 1000までの間に163個あるっぽい a の要素数はそれ以上必要 (0除算している部分のprintfがデバッグ用のように、デバッグで100までに制限しているのかもしれないけど) 一応言っておくと0除算でドボンは本質とはちょっと違うからね if (r) a[j] = i; printf("%d %d %d %d %d \n", i, j, a[j], i % a[j], r); とa[j] への代入とデバッグ用のprintfの位置を入れ替えれば0除算は起きないから
100 名前:デフォルトの名無しさん (ワッチョイ 572d-wHlW) mailto:sage [2023/05/04(木) 10:19:34.63 ID:W+5O3yqN0.net] >>95-99 丁寧な解説、ありがとうございます。 >>95 ,99 printfの中で0で割ってる可能性に気づいてなかったです。 a[k + 1]に代入しておかしくなってたので、原因を突き止めようとしたら 新しいバグを作ってしまっていました。 >>97 私の使ってるコンパイラだとどれでも int a[101] = {}; でなぜか全部0が入ります。そんなものかと思って通してました。
101 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 11:22:57.44 ID:qhvAhFwp0.net] 初期化は自動変数と静的変数で変わるんでしょ?
102 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 12:22:57.41 ID:gcRtXg3v0.net] 右辺のない変数宣言だけのパターンでは変わってくるけど 静的だろうが自動だろうが 初期化の = { } は 省略部以降すべて0 → 全部0フィル でしょ
103 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 12:26:03.41 ID:ZxdTo52k0.net] 初期化って必ず初期値を設定するものとばかり思ってた
104 名前:デフォルトの名無しさん [2023/05/04(木) 12:29:51.46 ID:ocVXr2wXd.net] 配列を「={};」で初期化したときの挙動は全要素が0埋めされるとC言語規格で決まってる
105 名前:はちみつ餃子 mailto:sage [2023/05/04(木) 12:50:52.53 ID:zfmlH8qj0.net] C17 までは初期化子が 0 個の状況は規定されていない。 一個以上が必要。 0 個を許容するとしたら処理系の拡張。 C23 からは >>102 の説明で正しい。
106 名前:デフォルトの名無しさん mailto:sage [2023/05/05(金) 01:44:39.83 ID:Dgp4PAAq0.net] むかしニコ動で動画上げたらそのこと教えてくれた人いたな 今でも覚えてるわ
107 名前:デフォルトの名無しさん mailto:sage [2023/05/08(月) 08:20:55.10 ID:o4wr0iPb0.net] なので 全省略せずに = { 0 }; と書くことは多いね
108 名前:デフォルトの名無しさん (ワッチョイ 9354-ouLR) mailto:sage [2023/05/10(水) 14:54:20.05 ID:Sp9BCNLV0.net] 規制解除テスト
109 名前:デフォルトの名無しさん mailto:sage [2023/05/12(金) 07:37:29.65 ID:uK8Qnmg70.net] https://ideone.com/Kj806d うちの環境(tcc)だと ビット操作の実行時間: 0.634000秒 一時変数の利用の実行時間: 0.444000秒 ポインタの利用の実行時間: 0.471000秒 になるんですね、最適化が弱いにしても完全に想像と逆の結果になって驚いてる
110 名前:デフォルトの名無しさん mailto:sage [2023/05/12(金) 08:42:01.03 ID:7oN7jOgdd.net] ポインタのそれ交換できてるか?
111 名前:はちみつ餃子 mailto:sage [2023/05/12(金) 08:58:12.44 ID:AJ54S3Uh0.net] CPU の性質も考慮する必要がある。 ビット演算はメモリのロード/ストアとは並列化できない分が効いて遅くなるんじゃないかと思う。 間接参照があればその分だけ遅くなるのも自然だし、想像通りだろ。
112 名前:デフォルトの名無しさん [2023/05/12(金) 08:58:57.96 ID:dEJrL9Tpd.net] gcc(-O2)で見てみたら核の部分はswap_bitsが6命令、swap_tempが4命令になってるね swap_bits: .LFB0: .cfi_startproc endbr64 cmpq %rsi, %rdi je .L1 movl (%rdi), %eax xorl (%rsi), %eax movl %eax, (%rdi) xorl (%rsi), %eax movl %eax, (%rsi) xorl %eax, (%rdi) .L1: ret .cfi_endproc swap_temp: .LFB1: .cfi_startproc endbr64 cmpq %rsi, %rdi je .L4 movl (%rdi), %eax movl (%rsi), %edx movl %edx, (%rdi) movl %eax, (%rsi) .L4: ret .cfi_endproc
113 名前:デフォルトの名無しさん mailto:sage [2023/05/12(金) 22:24:54.99 ID:josTNWjFd.net] ビット演算はそりゃ遅いだろ 読んで演算して書く よりも 読んで書く のほうが早いに決まってるじゃん
114 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 123e-tcUg) mailto:sage [2023/05/12(金) 23:57:42.36 ID:AJ54S3Uh0.net] ビット演算バージョンの特徴は一時的な格納場所が不要なところにある。 レジスタに空きが無いときにメモリに退避するよりはビット演算のほうが マシということはありうると思う。 素朴なアーキテクチャだとメモリの読み書きが (レジスタと比べて) だいぶん遅かったり レジスタの数が少なかったりするし。 色々な条件が絡み合うので「決まってる」とまでは言い切れない。
115 名前:デフォルトの名無しさん (スプープ Sd1f-Ynfg) mailto:sage [2023/05/13(土) 07:20:30.86 ID:q/ntHDOzd.net] この件の場合は 関数の形でメモリから読んで書くことは確定だからそれ以上の最適化は不可能なので決まってるのだ
116 名前:デフォルトの名無しさん (スッップ Sd1f-paFp) mailto:sage [2023/05/13(土) 12:31:34.66 ID:scApfF3jd.net] 大昔の技術 今使うやつはアホ ビット演算の方が有意に速い事なんか無いよ
117 名前:デフォルトの名無しさん (ワッチョイ 335f-eWQc) mailto:sage [2023/05/13(土) 13:31:03.33 ID:77gpFXkp0.net] 論理演算はマシン語1命令だろw
118 名前:デフォルトの名無しさん (テテンテンテン MM7f-PaoB) mailto:sage [2023/05/13(土) 14:34:03.15 ID:ToDbeQGOM.net] std::swap使えばマシン語のxchgを使ってくれそうな気がするけどね xchg使うのが最速だろう Cにはstd::swapに相当するもんが無いな
119 名前:デフォルトの名無しさん (スッップ Sd1f-paFp) mailto:sage [2023/05/13(土) 15:37:18.91 ID:trdeSgBWd.net] >>117 movだけなら演算ポートを使わないで済む >>118 マシン語のxchgは非常に遅い
120 名前:デフォルトの名無しさん (スプープ Sd1f-Ynfg) mailto:sage [2023/05/13(土) 18:27:17.14 ID:0CcYb4xxd.net] >>117 初心者が陥りやすい錯覚だな 「何もしない(NOPのことではない)」よりも速い命令はないのだ
121 名前:デフォルトの名無しさん (ワッチョイ cf34-TSnC) mailto:sage [2023/05/13(土) 18:39:48.47 ID:Er9DBy9d0.net] >>117 やめとけ 言ってわかる相手じゃない 何もかも機械がやってくれるから 自分の頭で考える必要はないって手合いだぞ
122 名前:デフォルトの名無しさん (スッップ Sd1f-paFp) mailto:sage [2023/05/13(土) 18:43:02.66 ID:trdeSgBWd.net] ×自分の頭で考える必要はない ○アホが工夫すると遅くなる
123 名前:デフォルトの名無しさん (スッップ Sd1f-paFp) mailto:sage [2023/05/13(土) 18:46:13.79 ID:trdeSgBWd.net] 今では通用しない技術を偉そうに語る 老害の典型 ==>はちみつ
124 名前:デフォルトの名無しさん (ワッチョイ cf34-TSnC) mailto:sage [2023/05/13(土) 18:50:59.33 ID:Er9DBy9d0.net] 身に覚えのあるやつがファビョってるね ん~いい返事だ
125 名前:デフォルトの名無しさん (テテンテンテン MM7f-PaoB) mailto:sage [2023/05/13(土) 22:00:35.83 ID:8DjxrcvEM.net] >>119 遅いってのは、レジスタを余計に1つ消費する方法よりも更にデメリットが有るぐらい遅いのか?
126 名前:デフォルトの名無しさん mailto:sage [2023/05/13(土) 22:53:11.07 ID:w2ITJ0dJd.net] 最適化されてもmovより遅くならない程度で決して速くなることはない おそらくもっと複雑な処理の途中でレジスタが全て使用中の場合にレジスタをスタック等に退避することなく値を交換するテクニックとして使われたら速くなるのかもしれんが こんなシンプルなコードでは起きないだろう
127 名前:デフォルトの名無しさん mailto:sage [2023/05/13(土) 23:18:57.76 ID:6X/C93dk0.net] xorスワップは昔クヌースのメモリを使わないGCのマーク&スイープ手法だかで多用されてた気がする 当時はこれが神が作りしコードかあみたいに感動しかなかった
128 名前:デフォルトの名無しさん mailto:sage [2023/05/13(土) 23:46:50.93 ID:TLDrNKkXM.net] >>126 普通のコードだとレジスタは常に足りてないだろ ベンチマーク的なコードは本当の速度を表してないな Benchmarks gameとかそれぐらい複雑なコードを複数動かしてやっと分かるもんだろうね
129 名前:はちみつ餃子 mailto:sage [2023/05/13(土) 23:49:44.86 ID:vqN1nVlv0.net] >>125 現代的な CPU だと直接的に使われるレジスタのほかに内部にはもっと多くのレジスタがあって 見かけ上はレジスタを余計に消費していても実際には一時的に割り当てられるレジスタなことがある。 いわるゆる「機械語」も CPU 内部ではさらに分解されてよりよい命令列に置き換えられるので 同じ機械語でも文脈によって違うことをしてる。 複雑すぎて詳細な挙動を事前に
130 名前:\測するのは無理。 xchg が存在するからには有用な場面もあるんだろうとは思うが、 結局のところは実際にやってみないとよくわからん。 [] [ここ壊れてます]
131 名前:デフォルトの名無しさん mailto:sage [2023/05/14(日) 01:15:20.67 ID:XjDIggiO0.net] xchgはスピンロックを作るときに使うよね
132 名前:デフォルトの名無しさん mailto:sage [2023/05/14(日) 07:12:36.39 ID:YUNKAbGY0.net] 変数のswapって、マシン語に限らずどこででも高い頻度で使うぞ
133 名前:デフォルトの名無しさん mailto:sage [2023/05/14(日) 11:51:05.47 ID:eMKrHX/5d.net] >>129 つまり 有用な場面を知らないわけだ レジスタを節約するためでも微妙な高速化のためでもないから
134 名前:デフォルトの名無しさん mailto:sage [2023/05/14(日) 19:49:42.92 ID:9VZQjQ6WM.net] アトミックのことかな はちみつ氏のレスは慎重で丁寧だし、噛みつく必要はないだろう
135 名前:デフォルトの名無しさん mailto:sage [2023/05/14(日) 19:54:24.09 ID:B0168DkC0.net] そもそもアセンブラででも書かない限りある値がレジスタに維持される期間は人間の考えとは異なるんだよなぁ
136 名前:デフォルトの名無しさん (ワッチョイ cf34-TSnC) mailto:sage [2023/05/14(日) 22:22:28.93 ID:YUNKAbGY0.net] 人間の考えw 人情っすか?
137 名前:デフォルトの名無しさん (ワッチョイ cf63-ZkZz) mailto:sage [2023/05/14(日) 23:14:42.36 ID:fNcGY7kH0.net] レジスター猫
138 名前:デフォルトの名無しさん (ワッチョイ 0310-ZkZz) mailto:sage [2023/05/15(月) 07:45:53.34 ID:wYJ4tfRu0.net] シュレーディンガーのレジスター猫猫
139 名前:デフォルトの名無しさん (ワッチョイ cf46-1d5q) [2023/05/15(月) 10:53:41.51 ID:Ro1LlfRG0.net] レンジ猫?
140 名前:デフォルトの名無しさん (ワッチョイ 3302-Cej3) mailto:sage [2023/05/15(月) 11:26:46.74 ID:qSKQiR6e0.net] 猫は電子レンジで乾かせません
141 名前:デフォルトの名無しさん (ワッチョイ ffad-ZkZz) [2023/05/15(月) 11:51:40.11 ID:Bppn4Lb30.net] じゃあ何なら乾かせるんですか?
142 名前:デフォルトの名無しさん (ラクッペペ MM7f-fulC) mailto:sage [2023/05/15(月) 12:00:56.43 ID:Uo8X26KHM.net] タオルとドライヤー
143 名前:デフォルトの名無しさん (ワッチョイ ff97-7xmi) mailto:sage [2023/05/15(月) 12:22:52.88 ID:L2eqquJo0.net] 愛情を込めて暖める
144 名前:デフォルトの名無しさん (スプープ Sd1f-Ynfg) mailto:sage [2023/05/15(月) 20:16:31.37 ID:8Cq/OAued.net] つまんないボケはどうつっこんでもつまんない
145 名前:デフォルトの名無しさん (スプッッ Sd07-zj+H) mailto:sage [2023/05/16(火) 08:51:47.45 ID:gG4dlKgfd.net] 技術ないやつが妬みで荒らしてるだけだからな
146 名前:デフォルトの名無しさん mailto:sage [2023/05/16(火) 15:56:44.97 ID:mGp2Y9l5a.net] DJNZがatomicだと思っていた時期が私にもありました
147 名前:デフォルトの名無しさん (ワッチョイ c301-Np+b) mailto:sage [2023/05/16(火) 20:31:19.40 ID:afLAkRaY0.net] 日本はC言語さえ難しいエンジニアもいるんだよな
148 名前:デフォルトの名無しさん mailto:sage [2023/05/16(火) 20:55:13.02 ID:bTPsQg7Pd.net] >>137 おお、読み出すまで値が確定しないレジスタ 乱数発生専用レジスタですね わかります
149 名前:デフォルトの名無しさん (スプッッ Sd1f-zj+H) mailto:sage [2023/05/17(水) 07:09:46.32 ID:s9zxu+xkd.net] 異分野からきた地頭のいい人がCも使えるようになると おまえら仕事取られるぞ
150 名前:デフォルトの名無しさん (ワッチョイ 0310-ZkZz) mailto:sage [2023/05/17(水) 07:46:38.82 ID:BUhbFeo00.net] 外国人労働者が来たら、AI化されたら、昔から色んな業種で何度も言われてるわな。
151 名前:デフォルトの名無しさん mailto:sage [2023/05/17(水) 13:27:27.48 ID:hbqXME+r0.net] いろんな分野で確かに仕事を奪われている
152 名前:デフォルトの名無しさん mailto:sage [2023/05/17(水) 16:15:47.93 ID:ZA2j/mjnd.net] > AI化されたら ここム板だよな
153 名前:デフォルトの名無しさん mailto:sage [2023/05/17(水) 19:23:47.84 ID:HVYpBx2Dd.net] >>148 恐れるに足らん こっちは守護だぞ幕府が後ろ盾だぞ
154 名前:デフォルトの名無しさん (スププ Sdea-i/qU) [2023/05/24(水) 06:34:08.09 ID:TwXy7dIZd.net] 前回のこのスレの投稿で関数名に()をつける場合があるという意味がわかった。#undefを使わなく てもいいように関数に()をつける場合がある。 例 ans = (sqr)(n); という具合に。
155 名前:デフォルトの名無しさん (ワッチョイ 6746-3pER) [2023/05/24(水) 07:05:53.93 ID:ea8bFP4r0.net] void laugh(笑);
156 名前:デフォルトの名無しさん (ワンミングク MMbf-4z7j) mailto:sage [2023/05/31(水) 15:57:04.61 ID:fnFbD7jZM.net] 誰か笑いをとめてやってくれ
157 名前:デフォルトの名無しさん mailto:sage [2023/05/31(水) 16:11:38.59 ID:ck+UIxN/0.net] abort();
158 名前:デフォルトの名無しさん mailto:sage [2023/05/31(水) 18:02:31.09 ID:vB7s5b6d0.net] GotoBlueScreen();
159 名前:デフォルトの名無しさん mailto:sage [2023/05/31(水) 18:16:26.97 ID:i7J0Z4vH0.net] __halt();
160 名前:デフォルトの名無しさん mailto:sage [2023/05/31(水) 21:00:07.40 ID:ck+UIxN/0.net] void a() __attribute__((naked)); void a() { asm(" halt"); } int main(void) { a(); }
161 名前:デフォルトの名無しさん mailto:sage [2023/05/31(水) 21:19:20.18 ID:soKXUOD/0.net] [STOP]+[A]
162 名前:デフォルトの名無しさん [2023/06/03(土) 19:40:08.42 ID:hD2oGIQP0.net] 文字列処理用のリングバッファ作ったんですが、同じ処理をint型でも行いたいです。 当たり前ですが、同じプログラムをint型に変えればできると思います。 ですが、処理自体は同じなので、共通化できないものでしょうか? C++ではテンプレート関数を使えばできるようですが、純粋なC言語では難しいですか?
163 名前:蟻人間 mailto:sage [2023/06/03(土) 19:48:40.44 ID:Pce1Bw+fd.net] >>161 #defineと#includeを使えばできるよ。
164 名前:デフォルトの名無しさん (ワッチョイ 916e-aXLw) mailto:sage [2023/06/03(土) 20:14:57.23 ID:SlTHxzvh0.net] 俺的には#includeよりtypedefかな
165 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c23e-N/Lw) mailto:sage [2023/06/03(土) 20:15:08.00 ID:uQ0tYGRP0.net] もしくは void* と型の大きさにする形で型を消去してしまう (たとえば qsort のように) という選択肢もある。 間違った使い方をしても (型が消えているので) コンパイル時にエラーとして検出しづらくなる可能性があるけど。 まあどちらにしても C でやるのは煩雑。 使う型が二種類だけであることがわかっている状況だと仮定してよいなら 共通化しようとするよりもコピペしたほうがかえって楽というのもよくあること。
166 名前:>>161 mailto:sage [2023/06/03(土) 20:37:32.54 ID:hD2oGIQP0.net] 勉強目的なので、試してみます。 #defineでやるやり方は何となくわかるのですが、#includeよりtypedefとはどういうことですか? void*もよくわからないので、こっちはまだ早そうです。
167 名前:デフォルトの名無しさん mailto:sage [2023/06/03(土) 20:59:14.37 ID:SlTHxzvh0.net] >>165 //fig1 #define ITERATOR int* ITERATOR enq, deq; //fig2 typedef int* ITERATOR; ITERATOR enq, deq; fig1ではdeqがポインタではなくなってしまうが fig2ならこうした問題が起こらない
168 名前:163 mailto:sage [2023/06/04(日) 12:47:37.50 ID:u2u7Kc0T0.net] あ、言い間違えてんの今気がついたw - #include + #define すまんこ
169 名前:デフォルトの名無しさん mailto:sage [2023/06/04(日) 21:00:21.62 ID:/SPLhkOjM.net] リストなどのコンテナ実装でデータの実態へはvoid*でポインタ指定すれば何でも格納できる 基本的にこれで汎用化できる
170 名前:デフォルトの名無しさん mailto:sage [2023/06/04(日) 21:37:23.80 ID:wPljDWped.net] リングバッファくらい簡単なのはその都度作ればいいんじゃないと思う 細かく改良していけばスキルアップになるぞ
171 名前:デフォルトの名無しさん mailto:sage [2023/06/04(日) 22:10:36.35 ID:AabPy4gc0.net] 初心者質問失礼します scanf_sやfopen_sなどの関数が含まれたソースをgcc 9.4.0でコンパイルすると失敗するのですがこれは仕様でしょうか? これらの関数はC11で定義されていますが基本的にMSVCでしか使えないという感じでしょうか?
172 名前:デフォルトの名無しさん mailto:sage [2023/06/04(日) 22:33:01.16 ID:ktuQYTFv0.net] やれやれ…初心者質問あるあるだけ回答しておこうか 「失敗する」とは一体をもって判断したのか。そもそも処理系から何かメッセージは出ていなかったのか。初心者と自覚するなら質問に主観は一切不要だからそれを書きなよ
173 名前:蟻人間 mailto:sage [2023/06/04(日) 22:34:54.92 ID:iTf1qDcyd.net] -std=c11
174 名前:はちみつ餃子 mailto:sage [2023/06/04(日) 23:06:52.44 ID:MHoxWKtY0.net] >>170 C11 で規定されているけれど仕様としてはオプショナルなもの。 つまり処理系はそれを提供しなくても仕様準拠を名乗れる。 ただし、提供するならばマクロ __STDC_LIB_EXT1__ も定義しておくことになってる。 そんで使うときにはヘッダのインクルード前に __STDC_WANT_LIB_EXT1__ を define しておく必要がある。 MSVC は C11 が発行される前から scanf_s などを提供していた (というかマイクロソフトがこれらを標準に入れるように働きかけていた) のでバージョンによっては __STDC_WANT_LIB_EXT1__ を定義するという手順を介さなくても使えるのかもしれない。 私は MSVC を使ってないのでよう知らん。
175 名前:デフォルトの名無しさん mailto:sage [2023/06/04(日) 23:52:26.98 ID:AabPy4gc0.net] >>171 失礼しました gccでコンパイルしたところfopen_sという関数は定義されていないという趣旨のエラーが出た形です 以下詳細になります 環境:WSL2 Ubuntu コマンド(bash):gcc sample.c -o sample.out 出力: /home/hoge/Code/sample.c:17:13: warning: implicit declaration of function ‘fopen_s’; did you mean ‘fopen’? [-Wimplicit-function-declaration] 17 | if((error=fopen_s(&fp,filename,"r")) != 0){ | ^~~~~~~ | fopen /usr/bin/ld: /tmp/ccIXo3dN.o: in function `main': /home/hoge/Code/sample.c:17: undefined reference to `fopen_s' collect2: error: ld returned 1 exit status
176 名前:デフォルトの名無しさん mailto:sage [2023/06/04(日) 23:59:42.49 ID:AabPy4gc0.net] >>172 >>173 ありがとうございます! アドバイスを参考に以下のように変更しましたが174と同様のエラーが出ます(T_T) コマンドを以下のように変更 gcc -std=c11 sample.c -o sample.out ソースファイルの先頭に以下を記述 #define __STDC_WANT_LIB_EXT1__ 1
177 名前:デフォルトの名無しさん [2023/06/05(月) 00:18:53.38 ID:6AEqxzj80.net] なんか人気のfopen_s関数について https://blog.ef67daisuki.club/2017/04/%E3%81%AA%E3%82%93%E3%81%8B%E4%BA%BA%E6%B0%97%E3%81%AEfopen_s%E9%96%A2%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
178 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 10:37:04.03 ID:ejs/048Ga.net] legacy_stdio_definitions.lib
179 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 18:03:48.62 ID:7VR84C5ud.net] fopen_sって初めて知った MS社内だけで通じる方言って感じでイヤな感じだな fopenで書くようにしたほうがいい
180 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 18:11:20.30 ID:7VR84C5ud.net] だいたいwinAPIはファイルを開く時はCreateFile()系を標準にする方針だと思ってたんだが なんでfopenのパチモノを作るのか理解に苦しむ
181 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 18:32:16.74 ID:OwVyUwPA0.net] 世界征服に決まってるだろ
182 名前:蟻人間 mailto:sage [2023/06/05(月) 18:47:37.75 ID:Fd2GxywXd.net] CreateFile はファイルロックの制御が細かくできたり、ファイルがすでに存在する場合の 処理や、セキュリティなどを考慮した処理など細かい設定ができる。 WindowsではfopenはCreateFileで実装されてるようだ。
183 名前:デフォルトの名無しさん (ワッチョイ 82ad-rilk) mailto:sage [2023/06/05(月) 19:09:52.27 ID:SzwJbur+0.net] >>179 CreateFileなんかで書いたら移植のとき困るだろ そもそもプラットフォーム気にせず書けるようにCライブラリとして標準化させようとしているんだし Windowsは移植性を考慮しないならCreateFile系のほうが柔軟に高度なプログラミングが出来るからCreateFile系使えと言っているだけ
184 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 20:35:19.71 ID:ZwQJL2Eg0.net] APIを使うと毎回特権リングを呼び出すから、 小さい読み書きが多いとオーバーヘッドになる Cランタイムはバッファを使って特権リングの 呼び出しを減らしている
185 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 20:40:56.74 ID:LsGdvfPCd.net] >>182 標準化しようとするなら引数や戻り値をfopenに似せるべきだ これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ
186 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 20:52:58.24 ID:SzwJbur+0.net] >>184 あくまでCライブラリとして標準化 古い関数に仕様を合わせる必要はないべ >これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ 仕様を読まない初心者が悪いと思うんだが
187 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 20:54:52.49 ID:OwVyUwPA0.net] 委員長、読まなきゃ使えない関数は捨てられてしまうと思います!
188 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 20:58:18.67 ID:SzwJbur+0.net] 初めて使う関数なら一度は仕様見ろよ
189 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 21:10:47.13 ID:OwVyUwPA0.net] じゃあ、使う必要が出てきたら読むことにします 当分、読むことなさそう
190 名前:デフォルトの名無しさん (スッププ Sda2-KKRM) mailto:sage [2023/06/05(月) 21:43:17.97 ID:EJphWr1dd.net] >>185 必要はある 今回のようにfopen_sをfopenに書き換えようとする(または逆)場合に変なミスを誘発する 大した理由もなく戻り値を変更すべきじゃない(またはfopenの名前を使うべきじゃない)
191 名前:デフォルトの名無しさん [2023/06/05(月) 23:26:16.43 ID:wc9Gft1n0.net] >>168 void*について学習してきました。 キャストしないと使えないようですが、キャストする型の指定はswitch-caseや#ifなどで分岐する感じでしょうか? それとももっと賢いやり方がありますか?