PDA

Просмотр полной версии : [Прочее] warning 224: indeterminate array size in "sizeof" expression (symbol "maxlength")



SteveStage
22.10.2019, 22:33
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(2176) : warning 224: indeterminate array size in "sizeof" expression (symbol "maxlength")
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(2180) : warning 224: indeterminate array size in "sizeof" expression (symbol "maxlength")
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(2184) : warning 224: indeterminate array size in "sizeof" expression (symbol "maxlength")
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


3 Warnings.

Как меня задолбали эти 3 варнинга, а главное, что размер строки то указан верно, но нет, sizeof всё равно считает размер неверным!

Код:
https://pastebin.com/D8pmJPAL

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


stock LogicWord(number, name_orig[], name1[], name2[], name3[], size)
{
if(number % 10 == 1 && number != 11)
{
strmid(name_orig, name1, 0, size+1);
}
if(number % 10 >= 2 && number % 10 <= 4 && number <= 12 && number >= 14)
{
strmid(name_orig, name2, 0, size+1);
}
if(number % 10 >= 5 && number % 10 <= 9 || number >= 11 && number <= 20 || number % 10 == 0)
{
strmid(name_orig, name3, 0, size+1);
}
return true;
}

DeimoS
23.10.2019, 10:36
stock LogicWord(number, name_orig[], const name1[], const name2[], const name3[], size, maxlength = sizeof(name_orig))
{
if(number % 10 == 1 && number != 11)
{
strmid(name_orig, name1, 0, size+1, maxlength);
}
if(number % 10 >= 2 && number % 10 <= 4 && number <= 12 && number >= 14)
{
strmid(name_orig, name2, 0, size+1, maxlength);
}
if(number % 10 >= 5 && number % 10 <= 9 || number >= 11 && number <= 20 || number % 10 == 0)
{
strmid(name_orig, name3, 0, size+1, maxlength);
}
return 1;
}

Оператор sizeof работает по двум принципам:
1) Когда он находится в блоке кода (от открывающейся фигурной скобки "{" до закрывающейся "}" внутри функций), размер массива подставляется на место sizeof прямо при компиляции. То есть, если у тебя будет массив из 20-и ячеек и ты пропишешь sizeof на этот массив, то в .amx на месте sizeof уже будет число 20.
2) Когда он указывается впараметрах функции в качестве значения по умолчанию для параметра (как у меня в функции, для параметра "maxlength"). В этом случае, если для параметра не указывать значение в ручную, то sizeof будет определять размер "на лету", по ходу работы сервера.


В твоём изначальном варианте код strmid "разворачивается" при компиляции в такой код:
strmid(name_orig, name3, 0, size+1, sizeof(name_orid));
Но так как sizeof тут работает по первому принципу и размер массива name_orig в параметрах не указан - компилятор сообщает о том, что он не может определить размер. И тут есть несколько рещений:
1) Тот, что я выше предоставил.
2) Указать для параметра name_orig размер
stock LogicWord(number, name_orig[24], const name1[], const name2[], const name3[], size)
{
if(number % 10 == 1 && number != 11)
{
strmid(name_orig, name1, 0, size+1);
}
if(number % 10 >= 2 && number % 10 <= 4 && number <= 12 && number >= 14)
{
strmid(name_orig, name2, 0, size+1);
}
if(number % 10 >= 5 && number % 10 <= 9 || number >= 11 && number <= 20 || number % 10 == 0)
{
strmid(name_orig, name3, 0, size+1);
}
return 1;
}
3) Указать для параметра "maxlength" функции strmid размер вручную, но он должен быть не больше фактического размера массива name_orig, ибо иначе может произойти выход за пределы массива.
stock LogicWord(number, name_orig[], const name1[], const name2[], const name3[], size)
{
if(number % 10 == 1 && number != 11)
{
strmid(name_orig, name1, 0, size, size+1);
// Если ты в параметр size передашь число 24, то массив, который указывается на месте "name_orig" при вызове функции, должен иметь размер 25
}
if(number % 10 >= 2 && number % 10 <= 4 && number <= 12 && number >= 14)
{
strmid(name_orig, name2, 0, size, size+1);
}
if(number % 10 >= 5 && number % 10 <= 9 || number >= 11 && number <= 20 || number % 10 == 0)
{
strmid(name_orig, name3, 0, size, size+1);
}
return 1;
}

SteveStage
23.10.2019, 20:16
Понятно, большое спасибо