Я знаю, я видел это, но там другой вариант, более к классическому стилю.
Вид для печати
Я знаю, я видел это, но там другой вариант, более к классическому стилю.
Пришло время снова попробовать.
Код:
#define Player. OO_TYPE(PLAYER,Player) enum E_PLAYER_Vehicle { Float:E_PLAYER_Vehicle_x, Float:E_PLAYER_Vehicle_y, Float:E_PLAYER_Vehicle_z, Float:E_PLAYER_Vehicle_a }; new Player@Vehicle[MAX_PLAYERS][E_PLAYER_Vehicle]; main() { Player.Vehicle[0].x = 10.0; }
Результат:
(error) must be lvalue (non-constant) (error) invalid expression, assumed zero (warning) expression has no effect
Я думаю проблема скорее в отсутствии макросов для @vb: и @va:
Я их нашел, но не думаю что подходят к этому варианту, либо Y-Less забыл про них, либо они не нужны и я что то не так делаю.
#define OO_TYPE(%6,%7)%0[%1] (_:@vb:@va:%6:%7@%0[%1] #define @va:%6:%7@%0[%1][@%2] %7%0[%1])[E_%6_%0_%2] #define @vb:@va:%6:%7@%0[%1][%2][@%3] %7%0[%1])[%2][E_%6_%0_%3]
Скинь весь код, что у тебя получился (и макросы, и то, как ты пытаешься их использовать)
// by Y-Less #define OO_TYPE(%6,%7)%0[%1]%2. (_:@vb:@va:%6:%7@%0[%1]%2[E_%6_%0:@vw:@vx:@vy:@vz:@vs:$E_%6_%0_] #define @va:%6:%7@%0[%1][@%2] %7%0[%1])[E_%6_%0_%2] #define @vb:@va:%6:%7@%0[%1][%2][@%3] %7%0[%1])[%2][E_%6_%0_%3] // First move the ] out as far as required. #define @vw:%9$%0]%1[ @vv:@vu:@vt:@vr:@vq$%0%1][ #define @vx:%9$%0]%1; @vv:@vu:@vt:@vr:@vq$%0%1]; #define @vy:%9$%0]%1) @vv:@vu:@vt:@vr:@vq$%0%1]) #define @vz:%9$%0]%1, @vv:@vu:@vt:@vr:@vq$%0%1], #define @vs:%9$%0]%1: @vv:@vu:@vt:@vr:@vq$%0%1]: // Second, move it in again to constrain the contents. We don't need to scan // for `[` again since it was the first one looked for above and so can't // possibly be within the square brackets. This is good, because scanning for // `[` from within `[]` is problematic. #define @vv:%9$%0;%1] %9$%0];%1 #define @vu:%9$%0)%1] %9$%0])%1 #define @vt:%9$%0,%1] %9$%0],%1 #define @vr:%9$%0:%1] %9$%0]:%1 #define @vq$ #define Player. OO_TYPE(PLAYER,Player) enum E_PLAYER_Vehicle { Float:E_PLAYER_Vehicle_x, Float:E_PLAYER_Vehicle_y, Float:E_PLAYER_Vehicle_z, Float:E_PLAYER_Vehicle_a }; new PlayerVehicle[MAX_PLAYERS][E_PLAYER_Vehicle]; { Player.Vehicle[playerid].x = 0.0; Player.Vehicle[playerid].y = 0.0; Player.Vehicle[playerid].z = 0.0; Player.Vehicle[playerid].a = 0.0; return 1; }
1) Массив должен быть назван так: Player@Vehicle.
2) Данный парсер не рассчитан на какие-либо операции, поскольку нет таковых условий, поэтому знак равно, да и в общем-то любые знаки записываются в квадратные скобки.
Вот результат работы препроцессора:
enum E_PLAYER_Vehicle { Float:E_PLAYER_Vehicle_x, Float:E_PLAYER_Vehicle_y, Float:E_PLAYER_Vehicle_z, Float:E_PLAYER_Vehicle_a }; new Player@Vehicle[MAX_PLAYERS][E_PLAYER_Vehicle]; { (_:@vb:@va:PLAYER:Player@Vehicle[playerid][E_PLAYER_Vehicle:@vw:@vv:@vu:@vt:@vr:E_PLAYER_Vehicle_x = 0.0]; (_:@vb:@va:PLAYER:Player@Vehicle[playerid][E_PLAYER_Vehicle:@vw:@vv:@vu:@vt:@vr:E_PLAYER_Vehicle_y = 0.0]; (_:@vb:@va:PLAYER:Player@Vehicle[playerid][E_PLAYER_Vehicle:@vw:@vv:@vu:@vt:@vr:E_PLAYER_Vehicle_z = 0.0]; (_:@vb:@va:PLAYER:Player@Vehicle[playerid][E_PLAYER_Vehicle:@vw:@vv:@vu:@vt:@vr:E_PLAYER_Vehicle_a = 0.0]; return 1; }
Уже очень много времени не могу понять по какому принципу пишутся препроцессорные парсеры, подскажите как можно реализовать вот такой вызов этого макроса:
SendClientMessage(playerid, COLOR(RED, 500), "Добро пожаловать!"); // Не возможно поставить пробел между аргументами SendClientMessage(playerid, COLOR(RED), "Добро пожаловать!"); // Вызов функции без второго аргумента, который по умолчанию заменяется на COLOR@RED@500
Код:
#define COLOR@RED@100<%1,%2> (%1FFCDD2%2) #define COLOR@RED@200<%1,%2> (%1EF9A9A%2) #define COLOR@RED@300<%1,%2> (%1E57373%2) #define COLOR@RED@400<%1,%2> (%1EF5350%2) #define COLOR@RED@500<%1,%2> (%1F44336%2) #define COLOR@RED@600<%1,%2> (%1E53935%2) #define COLOR@RED@700<%1,%2> (%1D32F2F%2) #define COLOR@RED@800<%1,%2> (%1C62828%2) #define COLOR@RED@900<%1,%2> (%1B71C1C%2) #define COLOR(%0,%1) (COLOR@%0@%1<0x,AA>)
Делаем две проверки на символ ','
#define COLOR@RED@100<%1,%2> (%1FFCDD2%2) #define COLOR@RED@200<%1,%2> (%1EF9A9A%2) #define COLOR@RED@300<%1,%2> (%1E57373%2) #define COLOR@RED@400<%1,%2> (%1EF5350%2) #define COLOR@RED@500<%1,%2> (%1F44336%2) #define COLOR@RED@600<%1,%2> (%1E53935%2) #define COLOR@RED@700<%1,%2> (%1D32F2F%2) #define COLOR@RED@800<%1,%2> (%1C62828%2) #define COLOR@RED@900<%1,%2> (%1B71C1C%2) #define COLOR(%1) (_:clr@aM:clr@aN:$%1) #define clr@aM:%8$%0,%1) clr@rS:COLOR@%0@%1<0x,AA>) #define clr@aN:%8$%0) clr@rS:COLOR@%0@100<0x,AA>) // 100 - default value. #define clr@rS:%1\32;%0) clr@rS:%1%0) COLOR(RED, 800)
undefined symbol "@COLOR@RED"
invalid expression, assumed zero
array must be indexed (variable "-unknown-")
too many error messages on one line