Member 14010153 Ответов: 3

Выражение перед токеном '{'


у меня есть небольшая проблема
перед кодом
/*
 * CP143, Herman Kamper, 2018.
 */

#ifndef MAP_H_INCLUDED
#define MAP_H_INCLUDED

#define MAP_SIZE 12

enum MapEntryEnum {EMPTY, WALL, START, END};
typedef enum MapEntryEnum MapEntry;

struct PositionStruct
{
    int row;
    int col;
};
typedef struct PositionStruct Position;

#endif // MAP_H_INCLUDED

код ошибки:
#define myMAP { {WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL}, {WALL,START,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,END,EMPTY,EMPTY,WALL}, {WALL,EMPTY,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,WALL,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,WALL,EMPTY,WALL,EMPTY,WALL,WALL,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,WALL,WALL,WALL,EMPTY,WALL,EMPTY,EMPTY,EMPTY,EMPTY,WALL}, {WALL,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,EMPTY,WALL,WALL,EMPTY,WALL}, {WALL,WALL,WALL,WALL,WALL,EMPTY,WALL,EMPTY,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,WALL,WALL,WALL,WALL,WALL,EMPTY,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,EMPTY,EMPTY,WALL,EMPTY,EMPTY,EMPTY,WALL,EMPTY,EMPTY,WALL}, {WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL} }

дает ожидаемое выражение ошибки перед помощью токена '{'

Что я уже пробовал:

Я попробовал переместить его и использовать знак"="

3 Ответов

Рейтинг:
22

OriginalGriff

Для того чтобы объявить а #define макрос, который занимает более одной строки, каждая частичная строка должна заканчиваться на '\'
Без этого ваша декларация заканчивается, и остальная часть вашего кода компилируется так, как если бы это был "нормальный код".


Member 14010153

пробовал, но не работает, что это одна строка

Рейтинг:
10

Rick York

На самом деле, myMap не обязательно должен быть макросом. Возможно, было бы лучше, если бы это было не так, чтобы вы могли заполнить данные по-разному. Вот пересмотренная версия кода Мистера Паллини, когда он не является макросом.

enum MapTypes
{
    WALL = 1,
    EMPTY,
    START,
    END
};

const int ITEMS = 12;

typedef MapTypes	maprow[ITEMS];

maprow MyMap[] =
{
	{ WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL },
	{ WALL,START,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,END,EMPTY,EMPTY,WALL },
	{ WALL,EMPTY,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,EMPTY,WALL },
	{ WALL,EMPTY,WALL,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,WALL,EMPTY,WALL },
	{ WALL,EMPTY,WALL,EMPTY,WALL,EMPTY,WALL,WALL,WALL,WALL,EMPTY,WALL },
	{ WALL,EMPTY,WALL,WALL,WALL,EMPTY,WALL,EMPTY,EMPTY,EMPTY,EMPTY,WALL },
	{ WALL,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,EMPTY,WALL,WALL,EMPTY,WALL },
	{ WALL,WALL,WALL,WALL,WALL,EMPTY,WALL,EMPTY,WALL,WALL,EMPTY,WALL },
	{ WALL,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,WALL,EMPTY,WALL },
	{ WALL,EMPTY,WALL,WALL,WALL,WALL,WALL,EMPTY,WALL,WALL,EMPTY,WALL },
	{ WALL,EMPTY,EMPTY,EMPTY,WALL,EMPTY,EMPTY,EMPTY,WALL,EMPTY,EMPTY,WALL },
	{ WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL }
};

void DoMapTest()
{
	TCHAR buffer[32] = { 0 };
	size_t m, n;
	size_t rows = sizeof( MyMap ) / sizeof( MyMap[0] );
	for( n = 0; n < rows; ++n )
	{
		buffer[0] = 0;
		for( m = 0; m < ITEMS; ++m )
		{
			switch( MyMap[n][m] )
			{
			case WALL :  _tcscat( buffer, _T( "*" ) ); break;
			case EMPTY : _tcscat( buffer, _T( " " ) ); break;
			case START : _tcscat( buffer, _T( "s" ) ); break;
			case END :   _tcscat( buffer, _T( "e" ) ); break;
			}
		}
		_tprintf( _T( "%2d: %s\n" ), n + 1, buffer );
	}
}
и его выход :
 1: ************
 2: *s     *e  *
 3: * ******** *
 4: * *     ** *
 5: * * * **** *
 6: * *** *    *
 7: *     * ** *
 8: ***** * ** *
 9: *       ** *
10: * ***** ** *
11: *   *   *  *
12: ************
Это будет работать в режиме Unicode, если вы этого хотите.


Рейтинг:
0

CPallini

Определение макроса выглядит правильным. Однако вы не показываете нам окружающий код (например, как это делается WALL определены, и так далее).
Следующая программа:

#include <stdio.h>

#define WALL 1
#define EMPTY 2
#define START 3
#define END 4

#define ITEMS 12

#define myMAP { {WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL}, {WALL,START,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,END,EMPTY,EMPTY,WALL}, {WALL,EMPTY,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,WALL,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,WALL,EMPTY,WALL,EMPTY,WALL,WALL,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,WALL,WALL,WALL,EMPTY,WALL,EMPTY,EMPTY,EMPTY,EMPTY,WALL}, {WALL,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,EMPTY,WALL,WALL,EMPTY,WALL}, {WALL,WALL,WALL,WALL,WALL,EMPTY,WALL,EMPTY,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,WALL,WALL,WALL,WALL,WALL,EMPTY,WALL,WALL,EMPTY,WALL}, {WALL,EMPTY,EMPTY,EMPTY,WALL,EMPTY,EMPTY,EMPTY,WALL,EMPTY,EMPTY,WALL}, {WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL} }

int main()
{
  int map[][ITEMS] = myMAP;

  size_t m,n;

  for (n=0; n<sizeof(map)/sizeof(map[0]); ++n)
  {
    for (m=0; m<ITEMS; ++m)
      printf("%d ", map[m][n]);
    printf("\n");
  }
}

выходы:
1 1 1 1 1 1 1 1 1 1 1 1 
1 3 2 2 2 2 2 1 2 2 2 1 
1 2 1 1 1 1 2 1 2 1 2 1 
1 2 1 2 2 1 2 1 2 1 2 1 
1 2 1 2 1 1 2 1 2 1 1 1 
1 2 1 2 2 2 2 2 2 1 2 1 
1 2 1 2 1 1 1 1 2 1 2 1 
1 1 1 2 1 2 2 2 2 2 2 1 
1 4 1 1 1 2 1 1 1 1 1 1 
1 2 1 1 1 2 1 1 1 1 2 1 
1 2 2 2 2 2 2 2 2 2 2 1 
1 1 1 1 1 1 1 1 1 1 1 1