C言語なら俺に聞け 161

■ このスレッドは過去ログ倉庫に格納されています
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/05/04(木) 01:26:39.82ID:KJPnL+/P0
>>91
あ、ごめん書き方が悪かった。
これまではタグ及び内容が同じでも適合しなかったところ、 C23 から適合するようになるという話。
有効になるプログラムが増えるので、どちらかというと緩くなる変更。
2023/05/04(木) 04:12:02.40ID:W+5O3yqN0
急に凄くレベル低い話して申し訳ないんだけど
#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]);
}
なんでこれ上手く動かないんだろう
2023/05/04(木) 05:17:57.46ID:P5ZkmciJ0
このスレいつもレベル低いから大丈夫でしょ
上手く動かない?そもそもそのコードはどう動いて欲しいのか読み取れないんだよな
日頃から入出力を意識して書けって言われてない?まるで実践できてないからダメか
2023/05/04(木) 07:37:53.19ID:6SJC1K3b0
>>93
二つ目の for ループから抜ける条件の一つが「a[j]がゼロ」なのに、そのループから抜けた直後で i % a[j] とかやってて、jが2のときにa[2]が0でループから抜けるから、ゼロ除算で落ちる

それとこっちは直接の原因ではないけど、int a[101]と宣言すると a[0]~a[100]までしかアクセスできないのにa[102]までアクセスする可能性があるようなコードになってるのもダメだな
2023/05/04(木) 08:36:39.17ID:Hj8mrajJd
とりあえず初期化するとき

int a[101] = {0,1,2};
と書いたほうが楽じゃん
ちなみに初期値がない部分は0になる

後はめんどくさいから明日読むわ
2023/05/04(木) 08:46:33.13ID:Hj8mrajJd
間違えた
int a[101] = {1,2};


ちなみに int a[101] = {};
ではまったく初期化されないからこのプログラムでは[0][1]以外のところには0ではなく不定値が入ってるのでうまく動かないのはそれなんじゃね

int a[101] = {0};
と書いておけば省略した部分もすべての要素が0で初期化されるよ
2023/05/04(木) 09:36:07.29ID:GmhF7zKn0
>>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; だね
2023/05/04(木) 09:58:25.07ID:GmhF7zKn0
>>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除算は起きないから
2023/05/04(木) 10:19:34.63ID:W+5O3yqN0
>>95-99
丁寧な解説、ありがとうございます。

>>95,99
printfの中で0で割ってる可能性に気づいてなかったです。
a[k + 1]に代入しておかしくなってたので、原因を突き止めようとしたら
新しいバグを作ってしまっていました。

>>97
私の使ってるコンパイラだとどれでも
int a[101] = {};
でなぜか全部0が入ります。そんなものかと思って通してました。
2023/05/04(木) 11:22:57.44ID:qhvAhFwp0
初期化は自動変数と静的変数で変わるんでしょ?
2023/05/04(木) 12:22:57.41ID:gcRtXg3v0
右辺のない変数宣言だけのパターンでは変わってくるけど
静的だろうが自動だろうが 初期化の = { } は 省略部以降すべて0 → 全部0フィル でしょ
2023/05/04(木) 12:26:03.41ID:ZxdTo52k0
初期化って必ず初期値を設定するものとばかり思ってた
104デフォルトの名無しさん (スッップ Sdbf-rFN3)
垢版 |
2023/05/04(木) 12:29:51.46ID:ocVXr2wXd
配列を「={};」で初期化したときの挙動は全要素が0埋めされるとC言語規格で決まってる
2023/05/04(木) 12:50:52.53ID:zfmlH8qj0
C17 までは初期化子が 0 個の状況は規定されていない。
一個以上が必要。 0 個を許容するとしたら処理系の拡張。

C23 からは >>102 の説明で正しい。
2023/05/05(金) 01:44:39.83ID:Dgp4PAAq0
むかしニコ動で動画上げたらそのこと教えてくれた人いたな
今でも覚えてるわ
2023/05/08(月) 08:20:55.10ID:o4wr0iPb0
なので 全省略せずに = { 0 }; と書くことは多いね
2023/05/10(水) 14:54:20.05ID:Sp9BCNLV0
規制解除テスト
2023/05/12(金) 07:37:29.65ID:uK8Qnmg70
https://ideone.com/Kj806d

うちの環境(tcc)だと
ビット操作の実行時間: 0.634000秒
一時変数の利用の実行時間: 0.444000秒
ポインタの利用の実行時間: 0.471000秒
になるんですね、最適化が弱いにしても完全に想像と逆の結果になって驚いてる
2023/05/12(金) 08:42:01.03ID:7oN7jOgdd
ポインタのそれ交換できてるか?
2023/05/12(金) 08:58:12.44ID:AJ54S3Uh0
CPU の性質も考慮する必要がある。
ビット演算はメモリのロード/ストアとは並列化できない分が効いて遅くなるんじゃないかと思う。
間接参照があればその分だけ遅くなるのも自然だし、想像通りだろ。
112デフォルトの名無しさん (スップ Sd32-c8cy)
垢版 |
2023/05/12(金) 08:58:57.96ID:dEJrL9Tpd
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
2023/05/12(金) 22:24:54.99ID:josTNWjFd
ビット演算はそりゃ遅いだろ
読んで演算して書く
よりも
読んで書く
のほうが早いに決まってるじゃん
2023/05/12(金) 23:57:42.36ID:AJ54S3Uh0
ビット演算バージョンの特徴は一時的な格納場所が不要なところにある。
レジスタに空きが無いときにメモリに退避するよりはビット演算のほうが
マシということはありうると思う。

素朴なアーキテクチャだとメモリの読み書きが (レジスタと比べて) だいぶん遅かったり
レジスタの数が少なかったりするし。

色々な条件が絡み合うので「決まってる」とまでは言い切れない。
2023/05/13(土) 07:20:30.86ID:q/ntHDOzd
この件の場合は
関数の形でメモリから読んで書くことは確定だからそれ以上の最適化は不可能なので決まってるのだ
2023/05/13(土) 12:31:34.66ID:scApfF3jd
大昔の技術
今使うやつはアホ

ビット演算の方が有意に速い事なんか無いよ
2023/05/13(土) 13:31:03.33ID:77gpFXkp0
論理演算はマシン語1命令だろw
2023/05/13(土) 14:34:03.15ID:ToDbeQGOM
std::swap使えばマシン語のxchgを使ってくれそうな気がするけどね
xchg使うのが最速だろう
Cにはstd::swapに相当するもんが無いな
2023/05/13(土) 15:37:18.91ID:trdeSgBWd
>>117
movだけなら演算ポートを使わないで済む

>>118
マシン語のxchgは非常に遅い
2023/05/13(土) 18:27:17.14ID:0CcYb4xxd
>>117
初心者が陥りやすい錯覚だな
「何もしない(NOPのことではない)」よりも速い命令はないのだ
2023/05/13(土) 18:39:48.47ID:Er9DBy9d0
>>117
やめとけ
言ってわかる相手じゃない

何もかも機械がやってくれるから
自分の頭で考える必要はないって手合いだぞ
2023/05/13(土) 18:43:02.66ID:trdeSgBWd
×自分の頭で考える必要はない
○アホが工夫すると遅くなる
2023/05/13(土) 18:46:13.79ID:trdeSgBWd
今では通用しない技術を偉そうに語る
老害の典型
==>はちみつ
2023/05/13(土) 18:50:59.33ID:Er9DBy9d0
身に覚えのあるやつがファビョってるね
ん~いい返事だ
2023/05/13(土) 22:00:35.83ID:8DjxrcvEM
>>119
遅いってのは、レジスタを余計に1つ消費する方法よりも更にデメリットが有るぐらい遅いのか?
2023/05/13(土) 22:53:11.07ID:w2ITJ0dJd
最適化されてもmovより遅くならない程度で決して速くなることはない
おそらくもっと複雑な処理の途中でレジスタが全て使用中の場合にレジスタをスタック等に退避することなく値を交換するテクニックとして使われたら速くなるのかもしれんが
こんなシンプルなコードでは起きないだろう
2023/05/13(土) 23:18:57.76ID:6X/C93dk0
xorスワップは昔クヌースのメモリを使わないGCのマーク&スイープ手法だかで多用されてた気がする
当時はこれが神が作りしコードかあみたいに感動しかなかった
2023/05/13(土) 23:46:50.93ID:TLDrNKkXM
>>126
普通のコードだとレジスタは常に足りてないだろ
ベンチマーク的なコードは本当の速度を表してないな
Benchmarks gameとかそれぐらい複雑なコードを複数動かしてやっと分かるもんだろうね
2023/05/13(土) 23:49:44.86ID:vqN1nVlv0
>>125
現代的な CPU だと直接的に使われるレジスタのほかに内部にはもっと多くのレジスタがあって
見かけ上はレジスタを余計に消費していても実際には一時的に割り当てられるレジスタなことがある。
いわるゆる「機械語」も CPU 内部ではさらに分解されてよりよい命令列に置き換えられるので
同じ機械語でも文脈によって違うことをしてる。
複雑すぎて詳細な挙動を事前に予測するのは無理。
xchg が存在するからには有用な場面もあるんだろうとは思うが、
結局のところは実際にやってみないとよくわからん。
2023/05/14(日) 01:15:20.67ID:XjDIggiO0
xchgはスピンロックを作るときに使うよね
2023/05/14(日) 07:12:36.39ID:YUNKAbGY0
変数のswapって、マシン語に限らずどこででも高い頻度で使うぞ
2023/05/14(日) 11:51:05.47ID:eMKrHX/5d
>>129
つまり
有用な場面を知らないわけだ
レジスタを節約するためでも微妙な高速化のためでもないから
2023/05/14(日) 19:49:42.92ID:9VZQjQ6WM
アトミックのことかな
はちみつ氏のレスは慎重で丁寧だし、噛みつく必要はないだろう
2023/05/14(日) 19:54:24.09ID:B0168DkC0
そもそもアセンブラででも書かない限りある値がレジスタに維持される期間は人間の考えとは異なるんだよなぁ
2023/05/14(日) 22:22:28.93ID:YUNKAbGY0
人間の考えw
人情っすか?
2023/05/14(日) 23:14:42.36ID:fNcGY7kH0
レジスター猫
2023/05/15(月) 07:45:53.34ID:wYJ4tfRu0
シュレーディンガーのレジスター猫猫
138デフォルトの名無しさん (ワッチョイ cf46-1d5q)
垢版 |
2023/05/15(月) 10:53:41.51ID:Ro1LlfRG0
レンジ猫?
2023/05/15(月) 11:26:46.74ID:qSKQiR6e0
猫は電子レンジで乾かせません
140デフォルトの名無しさん (ワッチョイ ffad-ZkZz)
垢版 |
2023/05/15(月) 11:51:40.11ID:Bppn4Lb30
じゃあ何なら乾かせるんですか?
2023/05/15(月) 12:00:56.43ID:Uo8X26KHM
タオルとドライヤー
2023/05/15(月) 12:22:52.88ID:L2eqquJo0
愛情を込めて暖める
2023/05/15(月) 20:16:31.37ID:8Cq/OAued
つまんないボケはどうつっこんでもつまんない
2023/05/16(火) 08:51:47.45ID:gG4dlKgfd
技術ないやつが妬みで荒らしてるだけだからな
2023/05/16(火) 15:56:44.97ID:mGp2Y9l5a
DJNZがatomicだと思っていた時期が私にもありました
2023/05/16(火) 20:31:19.40ID:afLAkRaY0
日本はC言語さえ難しいエンジニアもいるんだよな
2023/05/16(火) 20:55:13.02ID:bTPsQg7Pd
>>137
おお、読み出すまで値が確定しないレジスタ
乱数発生専用レジスタですね
わかります
2023/05/17(水) 07:09:46.32ID:s9zxu+xkd
異分野からきた地頭のいい人がCも使えるようになると
おまえら仕事取られるぞ
2023/05/17(水) 07:46:38.82ID:BUhbFeo00
外国人労働者が来たら、AI化されたら、昔から色んな業種で何度も言われてるわな。
2023/05/17(水) 13:27:27.48ID:hbqXME+r0
いろんな分野で確かに仕事を奪われている
2023/05/17(水) 16:15:47.93ID:ZA2j/mjnd
> AI化されたら

ここム板だよな
2023/05/17(水) 19:23:47.84ID:HVYpBx2Dd
>>148
恐れるに足らん
こっちは守護だぞ幕府が後ろ盾だぞ
153デフォルトの名無しさん (スププ Sdea-i/qU)
垢版 |
2023/05/24(水) 06:34:08.09ID:TwXy7dIZd
前回のこのスレの投稿で関数名に()をつける場合があるという意味がわかった。#undefを使わなく
てもいいように関数に()をつける場合がある。

ans = (sqr)(n);
という具合に。
154デフォルトの名無しさん (ワッチョイ 6746-3pER)
垢版 |
2023/05/24(水) 07:05:53.93ID:ea8bFP4r0
void laugh(笑);
2023/05/31(水) 15:57:04.61ID:fnFbD7jZM
誰か笑いをとめてやってくれ
2023/05/31(水) 16:11:38.59ID:ck+UIxN/0
abort();
2023/05/31(水) 18:02:31.09ID:vB7s5b6d0
GotoBlueScreen();
2023/05/31(水) 18:16:26.97ID:i7J0Z4vH0
__halt();
2023/05/31(水) 21:00:07.40ID:ck+UIxN/0
void a() __attribute__((naked));
void a()
{
asm(" halt");
}
int main(void)
{
a();
}
2023/05/31(水) 21:19:20.18ID:soKXUOD/0
[STOP]+[A]
161デフォルトの名無しさん (ワッチョイ 6ebb-tVFH)
垢版 |
2023/06/03(土) 19:40:08.42ID:hD2oGIQP0
文字列処理用のリングバッファ作ったんですが、同じ処理をint型でも行いたいです。
当たり前ですが、同じプログラムをint型に変えればできると思います。
ですが、処理自体は同じなので、共通化できないものでしょうか?

C++ではテンプレート関数を使えばできるようですが、純粋なC言語では難しいですか?
2023/06/03(土) 19:48:40.44ID:Pce1Bw+fd
>>161
#defineと#includeを使えばできるよ。
2023/06/03(土) 20:14:57.23ID:SlTHxzvh0
俺的には#includeよりtypedefかな
2023/06/03(土) 20:15:08.00ID:uQ0tYGRP0
もしくは void* と型の大きさにする形で型を消去してしまう (たとえば qsort のように) という選択肢もある。
間違った使い方をしても (型が消えているので) コンパイル時にエラーとして検出しづらくなる可能性があるけど。

まあどちらにしても C でやるのは煩雑。
使う型が二種類だけであることがわかっている状況だと仮定してよいなら
共通化しようとするよりもコピペしたほうがかえって楽というのもよくあること。
2023/06/03(土) 20:37:32.54ID:hD2oGIQP0
勉強目的なので、試してみます。

#defineでやるやり方は何となくわかるのですが、#includeよりtypedefとはどういうことですか?
void*もよくわからないので、こっちはまだ早そうです。
2023/06/03(土) 20:59:14.37ID:SlTHxzvh0
>>165

//fig1
#define ITERATOR int*
ITERATOR enq, deq;

//fig2
typedef int* ITERATOR;
ITERATOR enq, deq;

fig1ではdeqがポインタではなくなってしまうが
fig2ならこうした問題が起こらない
2023/06/04(日) 12:47:37.50ID:u2u7Kc0T0
あ、言い間違えてんの今気がついたw
- #include
+ #define

すまんこ
2023/06/04(日) 21:00:21.62ID:/SPLhkOjM
リストなどのコンテナ実装でデータの実態へはvoid*でポインタ指定すれば何でも格納できる
基本的にこれで汎用化できる
2023/06/04(日) 21:37:23.80ID:wPljDWped
リングバッファくらい簡単なのはその都度作ればいいんじゃないと思う
細かく改良していけばスキルアップになるぞ
2023/06/04(日) 22:10:36.35ID:AabPy4gc0
初心者質問失礼します

scanf_sやfopen_sなどの関数が含まれたソースをgcc 9.4.0でコンパイルすると失敗するのですがこれは仕様でしょうか?
これらの関数はC11で定義されていますが基本的にMSVCでしか使えないという感じでしょうか?
2023/06/04(日) 22:33:01.16ID:ktuQYTFv0
やれやれ…初心者質問あるあるだけ回答しておこうか
「失敗する」とは一体をもって判断したのか。そもそも処理系から何かメッセージは出ていなかったのか。初心者と自覚するなら質問に主観は一切不要だからそれを書きなよ
2023/06/04(日) 22:34:54.92ID:iTf1qDcyd
-std=c11
2023/06/04(日) 23:06:52.44ID:MHoxWKtY0
>>170
C11 で規定されているけれど仕様としてはオプショナルなもの。
つまり処理系はそれを提供しなくても仕様準拠を名乗れる。

ただし、提供するならばマクロ __STDC_LIB_EXT1__ も定義しておくことになってる。
そんで使うときにはヘッダのインクルード前に __STDC_WANT_LIB_EXT1__ を define しておく必要がある。

MSVC は C11 が発行される前から scanf_s などを提供していた
(というかマイクロソフトがこれらを標準に入れるように働きかけていた)
のでバージョンによっては __STDC_WANT_LIB_EXT1__ を定義するという手順を介さなくても使えるのかもしれない。
私は MSVC を使ってないのでよう知らん。
2023/06/04(日) 23:52:26.98ID:AabPy4gc0
>>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
2023/06/04(日) 23:59:42.49ID:AabPy4gc0
>>172
>>173

ありがとうございます!
アドバイスを参考に以下のように変更しましたが174と同様のエラーが出ます(T_T)

コマンドを以下のように変更
gcc -std=c11 sample.c -o sample.out

ソースファイルの先頭に以下を記述
#define __STDC_WANT_LIB_EXT1__ 1
176デフォルトの名無しさん (ワッチョイ 82ad-N/Lw)
垢版 |
2023/06/05(月) 00:18:53.38ID:6AEqxzj80
なんか人気の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/
2023/06/05(月) 10:37:04.03ID:ejs/048Ga
legacy_stdio_definitions.lib
2023/06/05(月) 18:03:48.62ID:7VR84C5ud
fopen_sって初めて知った
MS社内だけで通じる方言って感じでイヤな感じだな
fopenで書くようにしたほうがいい
2023/06/05(月) 18:11:20.30ID:7VR84C5ud
だいたいwinAPIはファイルを開く時はCreateFile()系を標準にする方針だと思ってたんだが
なんでfopenのパチモノを作るのか理解に苦しむ
2023/06/05(月) 18:32:16.74ID:OwVyUwPA0
世界征服に決まってるだろ
2023/06/05(月) 18:47:37.75ID:Fd2GxywXd
CreateFile はファイルロックの制御が細かくできたり、ファイルがすでに存在する場合の
処理や、セキュリティなどを考慮した処理など細かい設定ができる。
WindowsではfopenはCreateFileで実装されてるようだ。
2023/06/05(月) 19:09:52.27ID:SzwJbur+0
>>179
CreateFileなんかで書いたら移植のとき困るだろ
そもそもプラットフォーム気にせず書けるようにCライブラリとして標準化させようとしているんだし
Windowsは移植性を考慮しないならCreateFile系のほうが柔軟に高度なプログラミングが出来るからCreateFile系使えと言っているだけ
2023/06/05(月) 20:35:19.71ID:ZwQJL2Eg0
APIを使うと毎回特権リングを呼び出すから、
小さい読み書きが多いとオーバーヘッドになる
Cランタイムはバッファを使って特権リングの
呼び出しを減らしている
2023/06/05(月) 20:40:56.74ID:LsGdvfPCd
>>182
標準化しようとするなら引数や戻り値をfopenに似せるべきだ
これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ
2023/06/05(月) 20:52:58.24ID:SzwJbur+0
>>184
あくまでCライブラリとして標準化
古い関数に仕様を合わせる必要はないべ

>これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ
仕様を読まない初心者が悪いと思うんだが
2023/06/05(月) 20:54:52.49ID:OwVyUwPA0
委員長、読まなきゃ使えない関数は捨てられてしまうと思います!
2023/06/05(月) 20:58:18.67ID:SzwJbur+0
初めて使う関数なら一度は仕様見ろよ
2023/06/05(月) 21:10:47.13ID:OwVyUwPA0
じゃあ、使う必要が出てきたら読むことにします
当分、読むことなさそう
2023/06/05(月) 21:43:17.97ID:EJphWr1dd
>>185
必要はある
今回のようにfopen_sをfopenに書き換えようとする(または逆)場合に変なミスを誘発する
大した理由もなく戻り値を変更すべきじゃない(またはfopenの名前を使うべきじゃない)
190デフォルトの名無しさん (ワッチョイ 6ebb-tVFH)
垢版 |
2023/06/05(月) 23:26:16.43ID:wc9Gft1n0
>>168
void*について学習してきました。
キャストしないと使えないようですが、キャストする型の指定はswitch-caseや#ifなどで分岐する感じでしょうか?
それとももっと賢いやり方がありますか?
2023/06/05(月) 23:46:37.21ID:pW8wFDDTd
>>190
memcpyなら型が分からなくとも無理やりコピーできる。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。