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/04/21(金) 16:20:56.29ID:cgpIrgwq0
>>1
大儀である
2023/04/21(金) 16:21:57.14ID:5coQdqNr0
久々に麻呂のクソースを見たいでおじゃるか?
2023/04/21(金) 22:04:31.33ID:euEROcVR0
久々に来たけど、C言語はもう人気が無いんかね・・・
2023/04/21(金) 22:53:09.84ID:kZ6jl2XB0
人気って
C言語で作れなんて非効率的なことする人はそういないのでは?
C言語じゃないとダメな環境を除いて
2023/04/21(金) 23:38:19.84ID:Ro9IllZr0
各分野に適したものがあるならそれを使うに越したことは無い。
C が本当に「適している」と言える分野ってそんなに広くないじゃろ……。

どういう言語が適しているのかよくわからんかちょうどよい言語なければ長い物にまかれることになるわけだけど、
様々な分野でそれぞれのよりよい言語が生まれて「長い物」の価値が薄れるならそれは喜ばしいことだと思う。
2023/04/22(土) 00:24:12.00ID:PKFQM5A+0
プログラムをする人が、コンピュータの基本的な知識が無いまましてしまうから
簡単な記述で出来る言語が登場したからかね?
単純に同じ演算を繰り返して比較すると、C言語は処理速度が一番速いとのこと
データを処理するには適しているかと
2023/04/22(土) 01:13:10.92ID:pp00Xtk80
FFTやらせたら、どの言語が一番速いだろうか
2023/04/22(土) 01:14:00.87ID:BwPMbYSuM
Cの知識はC++をする時に当然必要になる
CはTIOBE言語ランキングで2位で、C++は4位だ
逆に使えない奴はモグリだろw
2023/04/22(土) 03:04:47.05ID:WcjcWdD/0
Cを知り、アセンブラを知って、ハードアーキテクチャが分かる
2023/04/22(土) 07:44:16.17ID:rMU69DRU0
ハードの入り口に立つというだけ
Cより遙かに深い世界の
2023/04/22(土) 12:23:54.03ID:pp00Xtk80
それにしても、ネットは広大だわ。
13デフォルトの名無しさん (ワッチョイ 1146-0EuI)
垢版 |
2023/04/22(土) 16:05:32.27ID:QfqbbaWF0
Cの奥地が広いと言うならネットはなお広いではないか。
2023/04/22(土) 16:39:16.87ID:rMU69DRU0
デジタル3年
アナログ5年
高周波10年
なんて言うね

で、おまえらCはどのくらいでおぼえた?
仕事で使えるレベルになるまでに
2023/04/22(土) 18:14:06.16ID:ZOFRvMNu0
>>14
高周波は、あの分布定数の立体回路が謎に満ちていましたよね、あれ、どうやって設計するんだろう?
2023/04/22(土) 18:24:03.40ID:RQNj/O5w0
この世にはプログラミング言語はPHPとJavascriptしか無いと思ってるエンジニア()がたくさんいるから
Pythonの存在も知ってるけどあれはオシャレな感じがしないしオタクがやるものだと思ってる
2023/04/22(土) 19:05:57.81ID:Ul/bNVNnd
>>14
蟹飯の本は事前に読んでたけど、半年かかった
周りが旧帝工学系院卒ばっかだったから勉強したわ
おれ、旧帝数学だったからポインタとか分からんかった
でも、今ではわしの方が崇められる
日々「チャラい関数、マクロで被せろ」を軸に頑張っとる
18デフォルトの名無しさん (アウウィフ FF21-1cZQ)
垢版 |
2023/04/23(日) 18:42:16.06ID:y593Lq73F
PHPはホントごみ
2023/04/24(月) 12:59:52.39ID:6nEVjUPW0
親を殺されたのか
かわいそうに
2023/04/24(月) 14:15:55.03ID:U9n/COjud
https://mevius.5ch.net/test/read.cgi/tech/1672191630/436-
>>436
>>499
https://mevius.5ch.net/test/read.cgi/tech/1681777958/14
21デフォルトの名無しさん (オイコラミネオ MMb1-U1Ip)
垢版 |
2023/04/24(月) 18:03:05.84ID:IXNCOIDlM
int (func) (int n)
みたいに関数に()付けるのって何の意味(機能)ですか?
2023/04/24(月) 18:08:06.16ID:MExTF0xDd
関数ポインタ
2023/04/24(月) 20:21:25.09ID:TGYcq0jn0
違う! 関数そのもの
#define func(x) (func)(x)
マクロではない「本物の」funcを呼び出すのに使う
2023/04/24(月) 21:25:50.42ID:4M8+MweU0
int (func) (int n) となると宣言の文脈だからそれも違うだろう。

>>21 その記述だけでは a*b+c を (a*b)+c と書いたのと同じで、少なくともその括弧自体には何の効果もない。
何か意味があると思うなら書いた人に聞くしかない。
2023/04/24(月) 21:43:56.47ID:IXNCOIDlM
いやまあ愚痴なんだけど教科書や入門書ってなんでか知らんけど関数ポインタもったいつけて教えたがらないよね…
2023/04/24(月) 23:20:26.15ID:MovxHIrx0
素人さんには関数ポインタはむずいだろ
関数のポインタをベクトル化してジャンプテーブル代わりになるんもん
つまりスイッチケースが要らない、言う事
2023/04/24(月) 23:23:14.11ID:CIhFKz1G0
ジャンプテーブル使うのと、switch case と、
どちらが高速でしょうね?
2023/04/24(月) 23:32:25.83ID:RQPVcVj5M
>>23
それが上手く行くのは、マクロが再帰呼び出しされないような処理が入ってるからだろ
2023/04/24(月) 23:45:11.28ID:RQPVcVj5M
ジャンプテーブルを使うと、変数の引き渡しに手間が掛かる
構造体のポインタを渡すとか、引数を沢山渡すとかグローバル変数を使うとか
なので、switch文にして最適化でテーブルジャンプになるのを確認するのがベストかなと
2023/04/25(火) 08:47:58.80ID:2JpsSRmdd
gcc拡張機能のラベルのジャンプテーブルが速かった思い出
あれは規格に取り込むべきだと思う
2023/04/25(火) 10:23:58.24ID:dvdIAVRA0
それってどんなのだっけか
関数を配列にぶっこんだの?
2023/04/25(火) 10:35:38.43ID:VJ90Sqw80
FORTRANの算術GOTOみたいなもんかな
2023/04/25(火) 10:36:32.19ID:VJ90Sqw80
switch caseを最適化させるとジャンプテーブルになっていることはよくあるね
2023/04/25(火) 11:21:54.95ID:RcvlMMml0
開発環境の都合で C言語しか選択できず
C++ の virtual に相当する機構をなんとか捏造しようと
構造体に関数のポインタをメンバに持つ

あと qsort のまねっこ
(具体的な比較は外に丸投げして そういう関数がある前提でコードを書く
2023/04/25(火) 11:33:32.92ID:Y1VsObgtd
>>31
関数内のラベルをローカル配列の初期化て入れられて
goto labelarray[status];
見たいに飛べるやつ
2023/04/25(火) 12:02:12.18ID:zIgvDwJV0
>>28 (func)(x) に対して関数型マクロ func(x) の展開は起こらないよ。
2023/04/25(火) 12:24:03.71ID:VJ90Sqw80
調べてみた
Computed gotoってやつね

int main(void)
{
void *table[] = { &&L1, &&L2 };
goto *table[1];
L1: ;
L2: ;
}
2023/04/25(火) 12:27:03.54ID:VJ90Sqw80
参考
https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
2023/04/25(火) 12:52:44.87ID:HIwqDhB5d
お、そんなん出来るんか
40デフォルトの名無しさん (スプッッ Sdea-i/u1)
垢版 |
2023/04/25(火) 14:07:55.49ID:xfobd0gld
話の流れからして

#define func(arg) hoge(arg)
みたいな関数形式マクロがいた場合、
単に void func(int a){} と書くと void hoge(int a){}に置換されて死ぬ。
回避策で void (func)(int a){} としとけば展開されないよ

ってことじゃないの?
2023/04/25(火) 14:18:02.95ID:zIgvDwJV0
確かに、そういう効果はあるね。
それが必要になる状況は思い浮かばないけども。
2023/04/25(火) 18:35:24.79ID:uZ/SnCfyd
関数と同名のマクロがわざわざ定義されてるとしたらなんか事情がありそうだが

#undef func
したほうが早くね
2023/04/25(火) 18:49:03.51ID:xUlKX7o40
#undef の後に undef する前へリカバーできるようにする機構ってコンパイラの環境依存だよね

(リカバーのための仕込み)
#undef func
 :
void func()
{
}
 :
undefのリカバー (以下 func はマクロ側)
 :
2023/04/25(火) 19:09:41.44ID:uZ/SnCfyd
ひょっとして>>21って

void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));

みたいな書き方のこと?
この場合はカッコなし int *compar(const void *, const void *)
だとintへのポインタを返す関数の実体ということになり
引数宣言内に関数の実体を書くなと言われてしまうだろう
2023/04/25(火) 21:38:43.47ID:ZKj27A06M
>>26
そうやって教えないでいて唐突になんの前触れもなく使われて「これ何ですか?」って質問したら「関数ポインタも知らねえのかよ」
テック系あるある
2023/04/25(火) 21:43:41.07ID:ZKj27A06M
>>44
いや
int (*compar)(const void);
みたいな単独のやつだよ
てか引数に関数入れるのも教えたがらないよねえ😅
ほんと勿体つけるの大好き
2023/04/25(火) 22:14:03.47ID:OJFKrU7J0
要は関数ポインタ知らなくてバカにされただけのおじさんか
const voidだもんな
2023/04/25(火) 22:18:12.16ID:VJ90Sqw80
アホすぎて笑う価値もないな
2023/04/25(火) 22:25:14.13ID:T6e/oFBcd
>>46
それじゃエラーにならない?
具体的にどんな場面で使われてるのかわからんことには説明できないな
混乱する書き方だというのは同意するが
2023/04/25(火) 22:37:41.81ID:T6e/oFBcd
ああ、それで「関数」ではなく「関数へのポインタ」が定義できるのか
関数の型をtypedefしてからやったほうがわかりやすくない?
WindowsAPIでは大体そんな形になってるから真似してるけど

宣言
typedef int COMP_FUNC(const void *, const void *);

COMP_FUNC comp_A;
COMP_FUNC comp_B;

COMP_FUNC *comp_func = comp_A;


切り替える時
comp_func = comp_B;

呼び出す時
comp_func(...);
2023/04/25(火) 22:50:45.68ID:OJFKrU7J0
typedefがめっちゃ気持ち悪い宣言だな
普通はアスタリスクつけてポインタとしてtypedefするもんだと思うよ
sizeof(COMP_FUNC)がいくつになるのか見当がつかない不気味なオブジェクトだ
2023/04/25(火) 23:29:28.69ID:ug7UW9j70
sizeof は関数型の式に対して適用してはならないと制約されているから
関数だったときの結果は未定義で、常識的に考えればコンパイラはエラー扱いにするべきだと思うんだけど
gcc や clang だと何故かエラーにならず 1 を返すんだよな。
(警告は出るけど。)

検出が難しいはずもない (実際に警告は出せてるわけだし) のになんでこうなってんだろ。
1 でなんか便利なことある?
2023/04/26(水) 02:32:17.99ID:2SSTMM1B0
まあ、入門書は比較的難しいことを書かないほうが売れそうだけどな
でもそれを勿体つけるというのは違うかと
2023/04/26(水) 03:51:37.33ID:5gh45PFo0
>>50
WINAPIの書き方はこうじゃない?

typedef int (WINAPI *COMP_FUNC)(const void *, const void *);
int WINAPI comp_A(const void *, const void *);
COMP_FUNC comp_func = comp_A;
55デフォルトの名無しさん (ワッチョイ a5cf-aV8w)
垢版 |
2023/04/26(水) 07:41:17.76ID:wJGIaQxR0
>>51
C++だとポインタじゃない方は関数メンバの宣言にも使えて便利だったりする。
2023/04/26(水) 08:44:09.62ID:dG3YoJcz0
>>54
ポイントされた関数の呼び出しで
comp_func(ptr1, ptr2); も (*comp_func)(ptr1, ptr2); も両方通るのは何でやろね
歴史的な都合?
2023/04/26(水) 08:54:20.40ID:v/InlOgJ0
前者は関数名そのものをポインタとして使い、後者はポインタを明示的に指定することで関数ポインタとして扱う
58デフォルトの名無しさん (ワッチョイ 5963-YWDm)
垢版 |
2023/04/26(水) 09:12:09.71ID:UWqGaqQz0
>>50
定義は?

COMP_FUNC comp_A
{
//ここどうやって書くんだ
}
2023/04/26(水) 09:27:27.18ID:mF8gxL160
>>58
残念ながら定義には関数型 typedef は使えない。
先に typedef を使った宣言だけ書いとけば定義の不整合を検出することはできるようになる。
2023/04/26(水) 09:46:45.42ID:UWqGaqQz0
COMP_FUNC comp_A;
COMP_FUNC comp_B;

こう書かれても仮引数や返却値の型が見えないので
可読性を落としているな
61デフォルトの名無しさん (アウアウウー Sa21-YWDm)
垢版 |
2023/04/26(水) 09:48:32.91ID:N7+hGpB4a
>>48
ほんそれ
2023/04/26(水) 10:33:18.60ID:NF11/Xrv0
>>56
* をいくつ付けても通るのは有名なネタだな。

#include <stdio.h>
int main(void) {
(**********printf)("hello, world\n");
}


関数指示子 (結果が関数型であるような式) は sizeof や & の
オペランドであるときを除いて関数ポインタに (暗黙に) 型変換されるという規則があって、
普通に printf("hello, world\n"); とか書いてあるときでもこの printf は関数ポインタに変換されてる。
関数呼出しは関数に対してではなく関数ポインタに対して行われる。

関数ポインタに * を付けると関数指示子になるけどそれもやっぱり関数ポインタに変換されるので
* をいくつつけても結果は関数ポインタという変なことになる。
2023/04/26(水) 11:39:43.86ID:N7+hGpB4a
そもそもポインタに代入するときも
int a(int b)
{
return b + 1;
}

int (*f)(int) = &a;
じゃなくて
int (*f)(int) = a;
で通るからな
2023/04/26(水) 13:38:42.38ID:UWqGaqQz0
f(0); //こうできるしな
2023/04/26(水) 14:31:03.82ID:dG3YoJcz0
>>57
comp_func は 関数のポインタとして宣言されてる変数っすよ

まぁ >>62 だということで納得
2023/04/26(水) 17:00:12.69ID:NF11/Xrv0
余談だが >>62 はあくまでも C の場合の話で、
C++ では名前解決の話が合わさって複雑になってる。
関数呼出しのときに関数名を括弧で囲むかどうかで結果が変わってしまう場合がある。
https://wandbox.org/permlink/MO8NWeVmjoLTLly6

C のコードを C++ に持っていくことはそれなりにあることなので
変な書き方をしてると組み合わせの妙で引っかかることもあるかもね。
2023/04/26(水) 20:23:11.35ID:WMGk7nvid
正直どうでもいい
遠い昔Z80のニモニックでJP (HL)と書くけど本来はJP HLとなるはずじゃないかなと思ってたけどそれと同じw
68デフォルトの名無しさん (ワッチョイ 2a4b-ywdm)
垢版 |
2023/04/26(水) 20:32:10.51ID:XZbLdYRG0
まぁ普通は関数名をカッコで括ったりしないし
2023/04/26(水) 21:13:49.50ID:zbbRZmOB0
Cで関数のポインタガーとかやってる暇あったらC#のデレゲートとかラムダとか覚えた方がいいとおもった午後
70デフォルトの名無しさん (ワッチョイ 0afb-i/u1)
垢版 |
2023/04/26(水) 21:41:13.75ID:tw2MKSIb0
「min」と「max」の関数形式マクロをわざわざ定義する.hがあるらしい
2023/04/27(木) 00:02:52.04ID:6BBE08oV0
stdbool.hでも覗いてみればいい
2023/04/27(木) 05:12:28.80ID:sEk/rgYZ0
>>67
コンバイラ、甘やかしてはイカン
最初から攻める気持ちが大切
2023/04/27(木) 08:37:39.22ID:OthllRbe0
コンバイラ?
2023/04/27(木) 09:03:22.20ID:AVBMGEcwM
コンバトラーV
2023/04/27(木) 13:43:25.58ID:kFL/uqTX0
JP (HL)って8080だとPCHLだっけ
アセンブラがとことん楽するようなニモニックだったな…
2023/05/01(月) 16:24:43.62ID:8iWiof/XM
関数の引数リストの中で新たな構造体を定義するってことってできないの?
void func(struct X{int a;} b){
... something ...
}
みたいに?
構文上は可能だと思うんだけどどうなんですか?
2023/05/01(月) 18:21:57.14ID:sEB4u3D3d
構造体が使われる場所より前で定義する必要がある
2023/05/01(月) 19:09:18.47ID:Cn3LrXy/M
>>47
いみもなく勿体つけるオジサン
「関数ポインタは難しいから後でやろうね~オマジナイだよ~」
2023/05/01(月) 19:15:34.08ID:Cn3LrXy/M
>>53
それで後々になって質問すると
>>47,48みたいのが湧くでしょ
2023/05/01(月) 19:29:42.98ID:Cn3LrXy/M
未だに初っ端からコンソールにハローワールド表示させるとこから教えてるんだろうね勿体つけオジサンたちは
2023/05/01(月) 19:36:49.71ID:Cn3LrXy/M
勿体つけオジサンたちはChatGTPで「C言語で関数名に()付けるのって何ですか?」って聞いてみればいいよ
機械以下のゴミw
2023/05/01(月) 19:44:56.10ID:cY285a3R0
医者から処方された薬は指示通り飲まないとだめだぞ
2023/05/01(月) 20:12:14.98ID:kp1qtDVi0
配列に対してポインタでアクセスするとか、単純な者だと絵に描けば大体理解出来るが
構造体内のポインタ変数やら、さらに配列かして行くと、記述もすんなりとできなくなるし
ましてや別人が書いたソースで、それらが一体何をアクセスしているのか理解するのは大変だ
84デフォルトの名無しさん (スプッッ Sd3f-rFN3)
垢版 |
2023/05/01(月) 20:21:43.22ID:RHMPP4K9d
>>76
返り値のほうならなぜかgccでいけた
まあ型推論がないC言語じゃあ役に立たないんだけど

// main.c
struct {int a;} func();
int main(){
printf("%d\n", func());
}

// other.c
int func(){ return 42;}
2023/05/02(火) 02:30:44.97ID:FbQbKVUa0
void func(struct {int a;} b){
b.a = 10;
printf("%d\n", b.a);
}

tccでもこれ通るな
2023/05/02(火) 11:04:32.32ID:HpVmkNB+0
>>76
私が知る限りにおいて文法上は正しい。
しかし X の有効範囲 (スコープ) は関数内だけなので
関数の外で struct X に対応する値を生成できず、
まともな方法では適切な実引数を与えることができない。

内容が同じ構造体は「適合」するし引数が適合する関数も適合するはずなので
強引にキャストして呼出しても言語仕様に反しないと思うのだけど
適合の概念をちゃんと理解できてる自信はない……

void func(struct X{int a;} b){}

int main(void) {
struct X{int a;} b = {1};
// このキャストはたぶんアリだと思うけど自信はない
void (*f)(struct X) = (void(*)(struct X))func;
f(b);
}
2023/05/02(火) 20:11:42.15ID:ovfmjnkKd
>>76
素直に最初に構造体をtypedef しとけば楽だと思うんですが
文法上で言えばstruct Xとだけ書いといて後でstruct Xの中身を定義しても正しい
もちろんそれでは関数スタックのサイズを計算できないのでエラーになるだろうが
2023/05/03(水) 14:42:04.19ID:wz1HqF7Da
Cは
struct Hoge {int a;} b;

struct {int a;} b;
を区別しない
2023/05/03(水) 15:45:19.73ID:1ndhLr9O0
>>88
名前の有無が違うし、変数名を変えて並べれば違う型になるし、明らかに違うと思うんだけど
何をもって「区別しない」なんて言うのか。
2023/05/03(水) 18:10:57.61ID:1ndhLr9O0
>>86
「内容が同じ構造体は「適合」する」について確認すると策定中の C23 から
内容に加えてタグ名まで同じ場合に限り適合する(compatible になる)ように変更されるようで、
現時点では正しくない模様。
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3037.pdf
2023/05/04(木) 00:37:13.28ID:zfmlH8qj0
>>90
厳格な方向に改定してんのね。
今までが緩すぎたからしょうがないね。
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
初期化は自動変数と静的変数で変わるんでしょ?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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