[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[WitchTech 00516] Re: -= 演算子の数式展開はバグ?
- Subject: [WitchTech 00516] Re: -= 演算子の数式展開はバグ?
- From: a_hirata@siscom.or.jp (平田 敦)
- Date: Fri, 10 Nov 2000 15:01:47 +0900
Imagawaさん、Kitanoさん、Bootsさん、のなかさん、レスありがとうござい
ます。
Imagawa,Akira さんは書きました:
>a = 10;
>b = 5;
>c =3;
>a -= b - c;
>はちゃんと8を返します(^^;
そうなんですか・・・もしかして、初回出荷のLSICに含まれるバグなのかも
しれませんね。Imagawaさんは、アップデートして、最新版を使われてます?
ちなみに、私の環境では、他の方から御指摘のあった方法
a -= (b-c)
でも同様のエラーとなったので、
あきらめて、
a = a - b + c
としました。
この問題は、Cマガジンの電脳パズル(楊貴妃問題)をWWで実行させた際に生
じました。そして、まだ正常にうごかない・・・(涙)なにがわるいんだ
ろ。既に一回目の処理でおかしなことになっちゃうんです。
以下にWW用のソースを掲載します。
(ここから)
/* WonderWitch用に修正 */
#include <stdio.h>
#include <sys/bios.h>
int key_scan()
{
switch (key_hit_check()){
case KEY_START:
text_put_string(10,10,"STARTキーがおされたにゃん");
text_put_string(10,11,"しばらくで終了するにゃん");
sys_wait(100);
bios_exit();
break;
case KEY_A:
text_put_string(10,10,"Aキーが押されたにゃん");
text_put_string(10,11,"ちょこっとウエイトっす
");
sys_wait(50);
break;
case KEY_B:
text_put_string(10,10,"Bキーがおされたにゃん");
text_put_string(10,11,"もいっかいBが押される
までまつっす");
/* while(key_hit_check() <> KEY_B); */
break;
case KEY_X1:
text_put_string(10,10,"X1キーがおされたにゃん");
break;
case KEY_X2:
text_put_string(10,10,"X2キーがおされたにゃん");
break;
case KEY_X3:
text_put_string(10,10,"X3キーがおされたにゃん");
break;
case KEY_X4:
text_put_string(10,10,"X4キーがおされたにゃん");
break;
case KEY_Y1:
text_put_string(10,10,"Y1キーがおされたにゃん");
break;
case KEY_Y2:
text_put_string(10,10,"Y2キーがおされたにゃん");
break;
case KEY_Y3:
text_put_string(10,10,"Y3キーがおされたにゃん");
break;
case KEY_Y4:
text_put_string(10,10,"Y4キーがおされたにゃん");
break;
/* case KEY_SOUND:
text_put_string(10,10,"SOUNDキーがおされたにゃん");
break;
*/
default:
break;
}
}
void main()
{
int capa[] = {88, 49, 18};
int water[3], i, j, n1, n2, tmp;
char buff[256];
text_screen_init();
/* 2回繰り返す */
for (i = 1; i <= 2; i++)
{
n1 = 0; n2 = i;
water[0] = 88; water[1] = 0; water[2] = 0;
/* 終了条件まで無限ループ */
for (j = 0;;j++)
{
/* */
key_scan();
/* */
/* 画面表示 */
/* printf("%2d:(%2d, %2d, %2d)\n", j,
water[0], water[1], water[2]); */
sprintf(buff,"%2d:(%2d, %2d, %2d)\n", j,
water[0], water[1], water[2]);
text_put_string(0, j, buff);
if (water[n1] > capa[n2] - water[n2])
{
/* 注ぎ先がいっぱいになる */
/* water[n1] -= capa[n2] - water[n2];
*/
water[n1] = water[n1] - capa[n2] +
water[n2];
water[n2] = capa[n2];
if (water[n1] < 0)
{
text_put_string(10,10,"water[
n1] < 0 !!!");
sys_wait(100);
bios_exit();
break;
}
/* 次の一手 */
tmp = 3 - n1 - n2;
n1 = n2;
n2 = tmp;
}
else
{
/* 注ぎ側が空っぽになる */
water[n2] += water[n1];
water[n1] = 0;
/* 終了条件 */
if (water[2] == 9)
break;
/* 次の一手 */
tmp = 3 - n1 - n2;
n2 = n1;
n1 = tmp;
}
}
/* printf("%2d:(79, 0, 9)\n", ++j); */
sprintf(buff,"%2d:(79, 0, 9)\n", ++j);
text_put_string(0, 1, buff);
}
}
(ここまで)
以下に、オリジナルのソースコードを掲載します。これは、CygwinB20上で
gccでコンパイルし、正常に結果を出力しました。
(ここから)
#include <stdio.h>
void main()
{
int capa[] = {88, 49, 18};
int water[3], i, j, n1, n2, tmp;
/* 2回繰り返す */
for (i = 1; i <= 2; i++)
{
n1 = 0; n2 = i;
water[0] = 88; water[1] = 0; water[2] = 0;
/* 終了条件まで無限ループ */
for (j = 0;;j++)
{
/* 画面表示 */
printf("%2d:(%2d, %2d, %2d) n1 = %2d, n2 =
%2d\n", j, water[0], water[1], water[2],n1,n2);
printf(" water[%2d]:%2d > capa[%2d]:%2d -
water[%2d]:%2d\n",
n1,
water[n1],n2,capa[n2],n2,water[n2]);
if (water[n1] > capa[n2] - water[n2])
{
/* 注ぎ先がいっぱいになる */
printf(" water[%2d]:%2d =
water[%2d]:%2d - capa[%2d]:%2d - water[%2d]:%2d\n",
n1,water[n1]-capa[n2]-water[n2],n1,water[n1],n2,capa[n2],n2,w
ater[n2]);
printf(" water[%2d] = %2d\n", n2,
capa[n2]);
water[n1] -= capa[n2] - water[n2];
water[n2] = capa[n2];
/* 次の一手 */
tmp = 3 - n1 - n2;
n1 = n2;
n2 = tmp;
}
else
{
/* 注ぎ側が空っぽになる */
printf(" water[%2d]:%2d =
water[%2d]:%2d + water[%2d]:%2d\n",
n2,water[n2]+water[n1],n2,water[n2],n1,water[n1]);
printf(" water[%2d] = 0\n",n1);
water[n2] += water[n1];
water[n1] = 0;
/* 終了条件 */
if (water[2] == 9)
break;
/* 次の一手 */
tmp = 3 - n1 - n2;
n2 = n1;
n1 = tmp;
}
}
printf("%2d:(79, 0, 9)\n", ++j);
}
}
(ここまで)
//*******************************
// 平田 敦
// a_hirata@siscom.or.jp
//*******************************
ML Archives