PDA

Просмотр полной версии : [Вопрос] Наилучшие варианты?



Betta
01.09.2017, 10:02
Приветствую. Задался вопросом, как и почему реализовывать данные функции:


К примеру я хочу показать навыки какого-либо скилла игроку, приведу два примера реализации:


static const SkillPositionPoint[5][] =
{
{""},
{"|"},
{"||"},
{"|||"},
{"||||"}
};

Или:


stock GetSkillPoint(playerid, point)
{
new string[5];
switch(point)
{
case 0: string = "";
case 1: string = "|";
case 2: string = "||";
case 3: string = "|||";
case 4: string = "||||";
}
return string;
}



И второе. У меня есть координаты территорий, я могу их записать в тот-же static const или в enum:


enum coord_p
{
Float:area_x,
Float:area_y,
Float:area_z,
Float:area_a
}
new area_coord[5][coord_p];

static const area_coord[5][4] =
{
{x,y,z,a},
{x,y,z,a},
{x,y,z,a},
{x,y,z,a},
{x,y,z,a}
};

Потом уже обращаться к этим ячейкам для определения позиции игрока (к примеру).

И вопрос, который требует ответа: какие варианты лучше и по каким причинам?

DeimoS
01.09.2017, 11:17
1) Первый, так как в первом случае ты вносишь информацию в сегмент данных и напрямую с ним работаешь, а во втором случае ты сначала вносишь информацию в сегмент данных, после создаёшь в стэке массив, извлекаешь из сегмента данных записанную ранее информацию и только потом обращаешься к информации в массиве.

2) Первый, так как читаемость такого кода:

area_coord[area_x], area_coord[area_y], area_coord[area_z], area_coord[area_a]
гораздо выше, нежели у

area_coord[0], area_coord[1], area_coord[2], area_coord[3]
ибо без лишних затруднений понятно какая ячейка какую информацию хранит

Betta
01.09.2017, 11:26
2) Первый, так как читаемость такого кода:

area_coord[area_x], area_coord[area_y], area_coord[area_z], area_coord[area_a]
гораздо выше, нежели у

area_coord[0], area_coord[1], area_coord[2], area_coord[3]
ибо без лишних затруднений понятно какая ячейка какую информацию хранит

А если у меня нет проблем с читаемостью кода? Ведь в первом примере мне нужно загружать данные о территориях в эти переменные, а во втором варианте они сразу прописаны и к ним нужно лишь обратиться. Читаемость кода меня не смущает, тем более в таком варианте. Меня больше интересует скорость выполнения и легкость обращения для машины.

DeimoS
01.09.2017, 11:41
Ведь в первом примере мне нужно загружать данные о территориях в эти переменные

Эмм, с чего ты так решил? Принцип работы с массивом в первом варианте совершенно такой же

enum coord_p
{
Float:area_x,
Float:area_y,
Float:area_z,
Float:area_a
}
new area_coord[5][coord_p] =
{
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33}
};
enum не делает ничего сверхъестественное и не меняет логику работы массива. В нём просто создаются именные константы, которые являются теми же самыми ячейками, что и во втором случае. Код из первого случая равносилен этому:

const
area_x = 0,
area_y = 1,
area_z = 2,
area_a = 3,
area_coord_sizeof = 4;// Константы можно назвать как угодно. Главное - их значение, которое равносильно номерам ячеек


new Float:area_coord[5][area_coord_sizeof] =
{
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33}
};

printf("%f", area_coord[0][area_y]);//Обращение

И с макросом:

#define area_x 0
#define area_y 1
#define area_z 2
#define area_a 3
#define area_coord_sizeof 4

new Float:area_coord[5][area_coord_sizeof] =
{
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33},
{22.33, 22.33, 22.33, 22.33}
};

printf("%f", area_coord[0][area_y]);//Обращение

То бишь, как я и говорил, на выходе это остаётся всё тот же двумерный массив и не более. А уже обёртка в виде enum, констант или макросов никак на его работоспособность не влияет. Она нужна лишь для тебя, дабы тебе было проще с этим кодом работать через неделю/месяц/год (не приходилось выискивать сам массив, дабы понять что же в ячейках хранится).

Ну и enum упрощает работу в случае, если ты решишь в один массив записать данные разных типов. Но перечисление (enum) является лишь синтаксической обёрткой, которая придумана с целью упростить жизнь. На деле у тебя всегда остаётся лишь массив

VVWVV
01.09.2017, 12:09
1) Лучше использовать одну строку, а вне всего лишь устанавливать нуль-символ там, где это необходимо.


const _MAX_POINTS = 6;
stock strcpy(dest[], const source[], maxlength = sizeof dest)
{
dest[0] = EOS;
return strcat(dest, source, maxlength);
}

stock GetSkillPoint(dest[], point)
{
static const _format[] = "||||||";
strcpy(dest, _format, point+1);
}
main()
{
new buffer[_MAX_POINTS];
GetSkillPoint(buffer, 2);
printf("%s", buffer);
}

Betta
01.09.2017, 12:27
Эмм, с чего ты так решил? Принцип работы с массивом в первом варианте совершенно такой же
Имелось ввиду то, что в этом случае мне нужно будет присвоить этим ячейкам значение. Будь у меня 100 или даже 1000 территорий, мне их нужно будет сохранить в базу данных (к примеру) и потом загружать при инициализации мода записывая в них. А так спасибо, очень полезная информация. При много благодарен.

- - - Добавлено - - -


1) Лучше использовать одну строку, а вне всего лишь устанавливать нуль-символ там, где это необходимо.


const _MAX_POINTS = 6;
stock strcpy(dest[], const source[], maxlength = sizeof dest)
{
dest[0] = EOS;
return strcat(dest, source, maxlength);
}

stock GetSkillPoint(dest[], point)
{
static const _format[] = "||||||";
strcpy(dest, _format, point+1);
}
main()
{
new buffer[_MAX_POINTS];
GetSkillPoint(buffer, 2);
printf("%s", buffer);
}


Не знал о таком способе. Спасибо)

DeimoS
01.09.2017, 13:04
Имелось ввиду то, что в этом случае мне нужно будет присвоить этим ячейкам значение. Будь у меня 100 или даже 1000 территорий, мне их нужно будет сохранить в базу данных (к примеру) и потом загружать при инициализации мода записывая в них. А так спасибо, очень полезная информация. При много благодарен.

Ну так и что? Массив остаётся массивом что в первом случае, что во втором. Просто в случае с enum ты указываешь не числовой номер ячейки, а именной. И если тебе нужно заранее хранить данные в массиве, тебе придётся в любом случае присваивать значение ячейкам.
В общем, enum никак не влияет на сам скрипт. Он лишь изменяет принцип обращения к массиву в исходном коде. В .amx оба варианта будут работать по идентичной схеме.