[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[WitchTech 00516] Re: -= 演算子の数式展開はバグ?



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