トップページ > プログラム > 2015年11月21日 > TwdaWMbW

書き込み順位&時間帯一覧

7 位/175 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000000024006



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net

書き込みレス一覧

C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
950 :デフォルトの名無しさん[sage]:2015/11/21(土) 20:49:27.24 ID:TwdaWMbW
for (size_t a = 0; a < 10; ++a) {
puts(
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
951 :デフォルトの名無しさん[sage]:2015/11/21(土) 20:51:17.95 ID:TwdaWMbW
何故か途切れたのでもう一度

for (size_t a = 0; a < 10; ++a) {
puts("dummy");
size_t b = a * a;
printf("%08p %2u\n", &b, b);
}

ループブロックの先頭以外で宣言された自動変数は、
コンパイラによってループのたびにスタックに積まれたり積まれなかったりするの?
TCCでソートの復習してたらスタックオーバーフロー起こした。GCCでは起きない。
もしかして最適化に依存する?
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
953 :デフォルトの名無しさん[sage]:2015/11/21(土) 21:10:43.44 ID:TwdaWMbW
>>952
ループのたびにアドレス変わってることを確認したから
スタックだとわかったわけで、それはないよ。
ただ再帰じゃないのにこんな動きするとは思ってもみなかった。
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
956 :デフォルトの名無しさん[sage]:2015/11/21(土) 21:22:58.54 ID:TwdaWMbW
>>955
すまんちゃんと説明する。
GCCで起きないと書いたのは「アドレスの変化も含めて」起きないってこと。
ところがTCCではアドレスが変化する。
そして対策として宣言をループの外に出したらちゃんと動いたのさ。
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
958 :デフォルトの名無しさん[sage]:2015/11/21(土) 21:30:44.34 ID:TwdaWMbW
>>957
原因は最初から特定できてるよ。
スタックサイズの違いだと主張するってことは、
スタックに積む動作が規格として正しいってこと?
それともコンパイラの実装依存?そこを知りたいわけで。
C言語なら俺に聞け(入門編)Part 130 [転載禁止]©2ch.net
962 :デフォルトの名無しさん[sage]:2015/11/21(土) 21:40:33.71 ID:TwdaWMbW
static void
mysort(void *base, size_t const num, size_t const size, bool(*comp)(void const *, void const *)) {
for (size_t a = 1; a < num; ++a) {
if (comp(base + (a - 1) * size, base + a * size)) continue;

byte t[size]; //これを
memcpy(t, base + a * size, size);
size_t b = a;
while (b > 0 && (! comp(base + (b - 1) * size, base + a * size))) --b;
memmove(base + (b + 1) * size, base + b * size, (a - b) * size);
memcpy(base + b * size, t, size);
}

return;
}
----------------------------------------
static void
mysort(void *base, size_t const num, size_t const size, bool(*comp)(void const *, void const *)) {
byte t[size]; //こうした
for (size_t a = 1; a < num; ++a) {
if (comp(base + (a - 1) * size, base + a * size)) continue;

memcpy(t, base + a * size, size);
size_t b = a;
while (b > 0 && (! comp(base + (b - 1) * size, base + a * size))) --b;
memmove(base + (b + 1) * size, base + b * size, (a - b) * size);
memcpy(base + b * size, t, size);
}

return;
} 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)



※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。