ページ 11

サンプルを実行するとエラー

Posted: 2010年12月21日(火) 21:30
by polpol
以下のサンプルを実行するとエラーになります。

コード:

 

#include <stdio.h>
#include <stdlib.h>

#define M  3  /* 宣教師の数 */
#define C  3  /* 人食い人の数 */
#define B  2  /* ボートの定員 */

int np, solution;
unsigned char mb[(B+1)*(B+2)/2], cb[(B+1)*(B+2)/2],
	mh[2*(M+1)*(C+1)], ch[2*(M+1)*(C+1)], flag[M+1][C+1];

void found(int n)  /* 解の表示 */
{
	int i;
	static char mmm[] = "MMMMMMMMMM", ccc[] = "CCCCCCCCCC";

	printf("解 %d\n", ++solution);
	for (i = 0; i <= n; i++) {
		printf("%4d  %-*.*s %-*.*s  /  %-*.*s %-*.*s\n",
			i, M, mh[i], mmm, C, ch[i], ccc,
			   M, M - mh[i], mmm, C, C - ch[i], ccc);
	}
}

void try(void)  /* 再帰的に試す */
{
	static i = 0;
	int j, m, c;

	i++;
	for (j = 1; j < np; j++) {
		if (i & 1) {  /* 奇数回目は向こうに行く */
			m = mh[i - 1] - mb[j];  c = ch[i - 1] - cb[j];
		} else {      /* 偶数回目はこちらに来る */
			m = mh[i - 1] + mb[j];  c = ch[i - 1] + cb[j];
		}
		if (m < 0 || c < 0 || m > M || c > C ||
				(flag[m][c] & (1 << (i & 1)))) continue;
		mh[i] = m;  ch[i] = c;
		if (m == 0 && c == 0) found(i);
		else {
			flag[m][c] |= 1 << (i & 1);  try();
			flag[m][c] ^= 1 << (i & 1);
		}
	}
	i--;
}

int main()
{
	int m, c;

	np = 0;
	for (m = 0; m <= B; m++) for (c = 0; c <= B - m; c++)
		if (m == 0 || m >= c) {
			mb[np] = m;  cb[np] = c;  np++;
		}
	for (m = 0; m <= M; m++) for (c = 0; c <= C; c++)
		if ((m > 0 && m < c) || (m < M && M - m < C - c))
			flag[m][c] |= 1 | 2;
	mh[0] = M;  ch[0] = C;  flag[M][C] |= 1;
	solution = 0;  try();
	if (solution == 0) printf("解はありません.\n");
	return EXIT_SUCCESS;
}

エラー内容は

1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(28) : warning C4091: '' : 変数が何も宣言されていないときは、'void' の左辺を無視します。
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(28) : error C2143: 構文エラー : ';' が 'try' の前にありません。
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(28) : error C2059: 構文エラー : 'try'
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(29) : error C2143: 構文エラー : ';' が '{' の前にありません。
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(29) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)


原因が分かる方よろしくお願いします

Re: サンプルを実行するとエラー

Posted: 2010年12月21日(火) 21:36
by みけCAT
・C++では、tryは予約語です。
・staticの後に型の名前がありません。

コード:

#include <stdio.h>
#include <stdlib.h>
 
#define M  3  /* 宣教師の数 */
#define C  3  /* 人食い人の数 */
#define B  2  /* ボートの定員 */
 
int np, solution;
unsigned char mb[(B+1)*(B+2)/2], cb[(B+1)*(B+2)/2],
    mh[2*(M+1)*(C+1)], ch[2*(M+1)*(C+1)], flag[M+1][C+1];
 
void found(int n)  /* 解の表示 */
{
    int i;
    static char mmm[] = "MMMMMMMMMM", ccc[] = "CCCCCCCCCC";
 
    printf("解 %d\n", ++solution);
    for (i = 0; i <= n; i++) {
        printf("%4d  %-*.*s %-*.*s  /  %-*.*s %-*.*s\n",
            i, M, mh[i], mmm, C, ch[i], ccc,
               M, M - mh[i], mmm, C, C - ch[i], ccc);
    }
}
 
void _try(void)  /* 再帰的に試す */
{
    static int i = 0;
    int j, m, c;
 
    i++;
    for (j = 1; j < np; j++) {
        if (i & 1) {  /* 奇数回目は向こうに行く */
            m = mh[i - 1] - mb[j];  c = ch[i - 1] - cb[j];
        } else {      /* 偶数回目はこちらに来る */
            m = mh[i - 1] + mb[j];  c = ch[i - 1] + cb[j];
        }
        if (m < 0 || c < 0 || m > M || c > C ||
                (flag[m][c] & (1 << (i & 1)))) continue;
        mh[i] = m;  ch[i] = c;
        if (m == 0 && c == 0) found(i);
        else {
            flag[m][c] |= 1 << (i & 1);  _try();
            flag[m][c] ^= 1 << (i & 1);
        }
    }
    i--;
}
 
int main()
{
    int m, c;
 
    np = 0;
    for (m = 0; m <= B; m++) for (c = 0; c <= B - m; c++)
        if (m == 0 || m >= c) {
            mb[np] = m;  cb[np] = c;  np++;
        }
    for (m = 0; m <= M; m++) for (c = 0; c <= C; c++)
        if ((m > 0 && m < c) || (m < M && M - m < C - c))
            flag[m][c] |= 1 | 2;
    mh[0] = M;  ch[0] = C;  flag[M][C] |= 1;
    solution = 0;  _try();
    if (solution == 0) printf("解はありません.\n");
    return EXIT_SUCCESS;
}

Re: サンプルを実行するとエラー

Posted: 2010年12月21日(火) 21:45
by polpol
>みけCATさん
上のコードで実行してもエラーになりました
エラー内容


1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(25) : warning C4091: '' : 変数が何も宣言されていないときは、'void' の左辺を無視します。
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(25) : error C2143: 構文エラー : ';' が '__try' の前にありません。
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(25) : error C2059: 構文エラー : '__try'
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(26) : error C2143: 構文エラー : ';' が '{' の前にありません。
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(26) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\console2\test.cpp(62) : error C2059: 構文エラー : '('

Re: サンプルを実行するとエラー

Posted: 2010年12月21日(火) 21:56
by みけCAT
これでも駄目ですか?
だめなら、他の原因を考えないといけません。

コード:

#include <stdio.h>
#include <stdlib.h>
 
#define M  3  /* 宣教師の数 */
#define C  3  /* 人食い人の数 */
#define B  2  /* ボートの定員 */
 
int np, solution;
unsigned char mb[(B+1)*(B+2)/2], cb[(B+1)*(B+2)/2],
    mh[2*(M+1)*(C+1)], ch[2*(M+1)*(C+1)], flag[M+1][C+1];
 
void found(int n)  /* 解の表示 */
{
    int i;
    static char mmm[] = "MMMMMMMMMM", ccc[] = "CCCCCCCCCC";
 
    printf("解 %d\n", ++solution);
    for (i = 0; i <= n; i++) {
        printf("%4d  %-*.*s %-*.*s  /  %-*.*s %-*.*s\n",
            i, M, mh[i], mmm, C, ch[i], ccc,
               M, M - mh[i], mmm, C, C - ch[i], ccc);
    }
}
 
void torai()  /* 再帰的に試す */
{
    static int i = 0;
    int j, m, c;
 
    i++;
    for (j = 1; j < np; j++) {
        if (i & 1) {  /* 奇数回目は向こうに行く */
            m = mh[i - 1] - mb[j];  c = ch[i - 1] - cb[j];
        } else {      /* 偶数回目はこちらに来る */
            m = mh[i - 1] + mb[j];  c = ch[i - 1] + cb[j];
        }
        if (m < 0 || c < 0 || m > M || c > C ||
                (flag[m][c] & (1 << (i & 1)))) continue;
        mh[i] = m;  ch[i] = c;
        if (m == 0 && c == 0) found(i);
        else {
            flag[m][c] |= 1 << (i & 1);  torai();
            flag[m][c] ^= 1 << (i & 1);
        }
    }
    i--;
}
 
int main()
{
    int m, c;
 
    np = 0;
    for (m = 0; m <= B; m++) for (c = 0; c <= B - m; c++)
        if (m == 0 || m >= c) {
            mb[np] = m;  cb[np] = c;  np++;
        }
    for (m = 0; m <= M; m++) for (c = 0; c <= C; c++)
        if ((m > 0 && m < c) || (m < M && M - m < C - c))
            flag[m][c] |= 1 | 2;
    mh[0] = M;  ch[0] = C;  flag[M][C] |= 1;
    solution = 0;  torai();
    if (solution == 0) printf("解はありません.\n");
    return EXIT_SUCCESS;
}

Re: サンプルを実行するとエラー

Posted: 2010年12月21日(火) 21:59
by 初級者
tryの呪縛から逃れましょう。

Re: サンプルを実行するとエラー

Posted: 2010年12月21日(火) 22:03
by polpol
できました^^;ありがとうございます。