PDA

Просмотр полной версии : [Вопрос] string



Union
19.11.2020, 11:19
Безопасно ли возвращать стринг таким способом?


stock GetVehicleModelName(model, name[], size = sizeof(name))
{
if (!(400 < model < 611)) {
return -1;
}

return strunpack(name, gVehicleInfo[model - 400][e_zviName], size);
}



P.S. Видел в инклуде "zvehinfo" от ziggi

punkochel
19.11.2020, 12:21
Безопасно ли возвращать стринг таким способом?


stock GetVehicleModelName(model, name[], size = sizeof(name))
{
if (!(400 < model < 611)) {
return -1;
}

return strunpack(name, gVehicleInfo[model - 400][e_zviName], size);
}



P.S. Видел в инклуде "zvehinfo" от ziggi

Это всё равно что:

stock GetVehicleModelName(model, name[], size = sizeof(name))
{
if (!(400 < model < 611)) {
return -1;
}

strunpack(name, gVehicleInfo[model - 400][e_zviName], size);
return 1;
}

Просто в случае реализации функции у ziggi, возвращает не просто 1, а длину распакованной строки.
Здесь же по сути ты в функцию передаешь массив, который заполняется данными.



Например, в этом варианте все элементы массива value станут равны 1:

stock OtherFunction() {

new value[10];
for(new i; i < sizeof(value); i++)
printf("value[%i] = %i", i, value[i]); // Тут все элементы будут равны 0;

GetData(value);
for(new i; i < sizeof(value); i++)
printf("value[%i] = %i", i, value[i]); // Тут все элементы будут равны 1;

return 1;
}

stock GetData(array[], size = sizeof(array)) {

for(new i; i < size; i++) {

array[i] = 1;
}
return 1;
}

Seviel
19.11.2020, 12:26
Строка которую ты используешь, она не создается заново, а передается ссылка в параметре name. Грубо говоря выходит так:


new string[32]; // - Вот ты создал массив(строку)
GetVehicleModelName(562, string);

stock GetVehicleModelName(model, name[], size = sizeof(name)) // - И тут в параметре "name" ссылка на массив "string"
{
if (!(400 < model < 611)) {
return -1;
}

return strunpack(name, gVehicleInfo[model - 400][e_zviName], size);
}


Так работают параметры массивы в pawn, но обычные переменные дублируются. Например в твоем параметре model если изменить значение, то оно заменится только в функции, а если изменить значение name, то изменится значение массива string.

И если что ты возвращаешь через return не массив, а количество символов.