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

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

    Строковые литералы и массивы в функции (const-корректность)

    Вот функция:

    1. stock TextForPlayer(playerid, str[], time, type, color = COLOR_ORANGE)
    2. {
    3. switch(type)
    4. {
    5. case 0:
    6. {
    7. new
    8. Text:textdraw = TextDrawCreate(323.748016, 214.666656, str);
    9. TextDrawLetterSize(textdraw, 0.782181, 2.924167);
    10. TextDrawAlignment(textdraw, 2);
    11. TextDrawColor(textdraw, color);
    12. TextDrawSetShadow(textdraw, 0);
    13. TextDrawSetOutline(textdraw, 1);
    14. TextDrawBackgroundColor(textdraw, 255);
    15. TextDrawFont(textdraw, 3);
    16. TextDrawShowForPlayer(playerid, textdraw);
    17. SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
    18. }
    19. case 1:
    20. {
    21. new
    22. Text:textdraw = TextDrawCreate(630.286926, 320.916778, str);
    23. TextDrawLetterSize(textdraw, 0.600394, 2.194999);
    24. TextDrawAlignment(textdraw, 3);
    25. TextDrawColor(textdraw, color);
    26. TextDrawSetShadow(textdraw, 0);
    27. TextDrawSetOutline(textdraw, 1);
    28. TextDrawBackgroundColor(textdraw, 255);
    29. TextDrawFont(textdraw, 3);
    30. TextDrawShowForPlayer(playerid, textdraw);
    31. SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
    32. }
    33. }
    34. }


    и, например при использовании в этой команде:

    1. cmd:time(playerid)
    2. {
    3. new
    4. hour,
    5. minute;
    6. gettime(hour, minute);
    7. static
    8. fmt_str[] = "%02d:%02d";
    9. new
    10. string[sizeof(fmt_str)-8+4+1];
    11. format(string, sizeof(string), fmt_str, hour, minute);
    12. TextForPlayer(playerid, string, 4000, 1, COLOR_ORANGE);
    13. }


    все нормально и работает, как должно работать.

    А при использовании таким образом:

    1. public OnPlayerDeath(playerid, killerid, reason)
    2. {
    3. TextForPlayer(playerid, "WASTED", 4000, 0, COLOR_RED);
    4. return true;
    5. }


    от компилятора прилетает предупреждение:

    1. C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(1508) : warning 239: literal array/string passed to a non-const parameter


    и ясно почему - const-корректность.

    Но вот как сделать поддержку и массивов, и строковых литералов?

  2. #2
    Аватар для Kovshevoy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±
    Так как ты передаешь str и он никак не изменяется в функции, то просто сделай так
    1. stock TextForPlayer(playerid, const str[], time, type, color = COLOR_ORANGE)
    2. {
    3. switch(type)
    4. {
    5. case 0:
    6. {
    7. new
    8. Text:textdraw = TextDrawCreate(323.748016, 214.666656, str);
    9. TextDrawLetterSize(textdraw, 0.782181, 2.924167);
    10. TextDrawAlignment(textdraw, 2);
    11. TextDrawColor(textdraw, color);
    12. TextDrawSetShadow(textdraw, 0);
    13. TextDrawSetOutline(textdraw, 1);
    14. TextDrawBackgroundColor(textdraw, 255);
    15. TextDrawFont(textdraw, 3);
    16. TextDrawShowForPlayer(playerid, textdraw);
    17. SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
    18. }
    19. case 1:
    20. {
    21. new
    22. Text:textdraw = TextDrawCreate(630.286926, 320.916778, str);
    23. TextDrawLetterSize(textdraw, 0.600394, 2.194999);
    24. TextDrawAlignment(textdraw, 3);
    25. TextDrawColor(textdraw, color);
    26. TextDrawSetShadow(textdraw, 0);
    27. TextDrawSetOutline(textdraw, 1);
    28. TextDrawBackgroundColor(textdraw, 255);
    29. TextDrawFont(textdraw, 3);
    30. TextDrawShowForPlayer(playerid, textdraw);
    31. SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
    32. }
    33. }
    34. }


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

    Перечитай тему еще раз.
    Клик-клак
    Последний раз редактировалось Kovshevoy; 26.12.2019 в 20:02.

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от Kovshevoy Посмотреть сообщение
    Так как ты передаешь str и он никак не изменяется в функции, то просто сделай так
    1. stock TextForPlayer(playerid, const str[], time, type, color = COLOR_ORANGE)
    2. {
    3. switch(type)
    4. {
    5. case 0:
    6. {
    7. new
    8. Text:textdraw = TextDrawCreate(323.748016, 214.666656, str);
    9. TextDrawLetterSize(textdraw, 0.782181, 2.924167);
    10. TextDrawAlignment(textdraw, 2);
    11. TextDrawColor(textdraw, color);
    12. TextDrawSetShadow(textdraw, 0);
    13. TextDrawSetOutline(textdraw, 1);
    14. TextDrawBackgroundColor(textdraw, 255);
    15. TextDrawFont(textdraw, 3);
    16. TextDrawShowForPlayer(playerid, textdraw);
    17. SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
    18. }
    19. case 1:
    20. {
    21. new
    22. Text:textdraw = TextDrawCreate(630.286926, 320.916778, str);
    23. TextDrawLetterSize(textdraw, 0.600394, 2.194999);
    24. TextDrawAlignment(textdraw, 3);
    25. TextDrawColor(textdraw, color);
    26. TextDrawSetShadow(textdraw, 0);
    27. TextDrawSetOutline(textdraw, 1);
    28. TextDrawBackgroundColor(textdraw, 255);
    29. TextDrawFont(textdraw, 3);
    30. TextDrawShowForPlayer(playerid, textdraw);
    31. SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
    32. }
    33. }
    34. }
    1. C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3525) : error 035: argument type mismatch (argument 3)
    2. C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3540) : error 035: argument type mismatch (argument 3)



    1. new
    2. Text:textdraw = TextDrawCreate(323.748016, 214.666656, str);

    1. new
    2. Text:textdraw = TextDrawCreate(630.286926, 320.916778, str);


    Ты думаешь я не пробовал?

    Судя по всему, TextDrawCreate не может работать с константами, либо я что-то делаю не так.
    Последний раз редактировалось SteveStage; 26.12.2019 в 20:36.

  4. #4
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Это очередной баг с const-корректностью в сампе.

    Библиотека fixes.inc поможет решить данную проблему.

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    1. C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\pawno\include\fixes.inc(5891) : fatal error 111: user error: _ALS_OnFilterScriptInit defined


    1. //#include <jit>
    2. #include <crashdetect>
    3. #include <a_samp>
    4. #include <a_mysql>
    5. #include <foreach>
    6. #include <mxdate>
    7. #include <Pawn.CMD>
    8. #include <sscanf2>
    9. #include <streamer>
    10. #include <random_switch>
    11. #include <fixes>


    P.S. Я нашел, где задефайнено "_ALS_OnFilterScriptInit", и это оказался инклуд sscanf2, но как это исправлять, я не знаю.

    Можно ли вырезать исправление const-корректности из инклуда? если да, то как? я нашел там только исправления в стандартных функциях и инклудах (a_http, a_object etc.)
    Последний раз редактировалось SteveStage; 26.12.2019 в 23:23.

  6. #6
    Аватар для MassonNN
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    Инклуд fixes закинь перед foreach. Вырезать можно, но сложно.

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

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

    Цитата Сообщение от MassonNN Посмотреть сообщение
    Инклуд fixes закинь перед foreach. Вырезать можно, но сложно.
    Да я его ставил прям после a_samp - безрезультатно

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Проблема была в том, что в стандартных инклудах так же нарушена const-корректность. Можно её исправлять вручную, а можно поискать готовые решения, по типу того, что скинули выше.
    Закрыто.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

 

 

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

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

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

Ваши права

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