Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 3 из 3
  1. #1
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±

    warning 224: indeterminate array size in "sizeof" expression (symbol "maxlength")

    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

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

    PHP код:
    stock LogicWord(numbername_orig[], name1[], name2[], name3[], size)
    {
        if(
    number 10 == && number != 11)
        {
            
    strmid(name_origname10size+1);
        }
        if(
    number 10 >= && number 10 <= && number <= 12 && number >= 14)
        {
            
    strmid(name_origname20size+1);
        }
        if(
    number 10 >= && number 10 <= || number >= 11 && number <= 20 || number 10 == 0)
        {
            
    strmid(name_origname30size+1);
        }
        return 
    true;

    Последний раз редактировалось SteveStage; 22.10.2019 в 22:48.

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1. stock LogicWord(number, name_orig[], const name1[], const name2[], const name3[], size, maxlength = sizeof(name_orig))
    2. {
    3. if(number % 10 == 1 && number != 11)
    4. {
    5. strmid(name_orig, name1, 0, size+1, maxlength);
    6. }
    7. if(number % 10 >= 2 && number % 10 <= 4 && number <= 12 && number >= 14)
    8. {
    9. strmid(name_orig, name2, 0, size+1, maxlength);
    10. }
    11. if(number % 10 >= 5 && number % 10 <= 9 || number >= 11 && number <= 20 || number % 10 == 0)
    12. {
    13. strmid(name_orig, name3, 0, size+1, maxlength);
    14. }
    15. return 1;
    16. }


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


    В твоём изначальном варианте код strmid "разворачивается" при компиляции в такой код:
    1. strmid(name_orig, name3, 0, size+1, sizeof(name_orid));

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

    3) Указать для параметра "maxlength" функции strmid размер вручную, но он должен быть не больше фактического размера массива name_orig, ибо иначе может произойти выход за пределы массива.
     Пример
    1. stock LogicWord(number, name_orig[], const name1[], const name2[], const name3[], size)
    2. {
    3. if(number % 10 == 1 && number != 11)
    4. {
    5. strmid(name_orig, name1, 0, size, size+1);
    6. // Если ты в параметр size передашь число 24, то массив, который указывается на месте "name_orig" при вызове функции, должен иметь размер 25
    7. }
    8. if(number % 10 >= 2 && number % 10 <= 4 && number <= 12 && number >= 14)
    9. {
    10. strmid(name_orig, name2, 0, size, size+1);
    11. }
    12. if(number % 10 >= 5 && number % 10 <= 9 || number >= 11 && number <= 20 || number % 10 == 0)
    13. {
    14. strmid(name_orig, name3, 0, size, size+1);
    15. }
    16. return 1;
    17. }
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Понятно, большое спасибо

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •