PDA

Просмотр полной версии : [Вопрос] Строковые литералы и массивы в функции (const-корректность)



SteveStage
26.12.2019, 19:17
Вот функция:

stock TextForPlayer(playerid, str[], time, type, color = COLOR_ORANGE)
{
switch(type)
{
case 0:
{
new
Text:textdraw = TextDrawCreate(323.748016, 214.666656, str);
TextDrawLetterSize(textdraw, 0.782181, 2.924167);
TextDrawAlignment(textdraw, 2);
TextDrawColor(textdraw, color);
TextDrawSetShadow(textdraw, 0);
TextDrawSetOutline(textdraw, 1);
TextDrawBackgroundColor(textdraw, 255);
TextDrawFont(textdraw, 3);
TextDrawSetProportional(textdraw, 1);
TextDrawShowForPlayer(playerid, textdraw);
SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
}
case 1:
{
new
Text:textdraw = TextDrawCreate(630.286926, 320.916778, str);
TextDrawLetterSize(textdraw, 0.600394, 2.194999);
TextDrawAlignment(textdraw, 3);
TextDrawColor(textdraw, color);
TextDrawSetShadow(textdraw, 0);
TextDrawSetOutline(textdraw, 1);
TextDrawBackgroundColor(textdraw, 255);
TextDrawFont(textdraw, 3);
TextDrawSetProportional(textdraw, 1);
TextDrawShowForPlayer(playerid, textdraw);
SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
}
}
}

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

cmd:time(playerid)
{
new
hour,
minute;
gettime(hour, minute);
static
fmt_str[] = "%02d:%02d";
new
string[sizeof(fmt_str)-8+4+1];
format(string, sizeof(string), fmt_str, hour, minute);
TextForPlayer(playerid, string, 4000, 1, COLOR_ORANGE);
}

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

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

public OnPlayerDeath(playerid, killerid, reason)
{
TextForPlayer(playerid, "WASTED", 4000, 0, COLOR_RED);
return true;
}

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

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

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

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

Kovshevoy
26.12.2019, 19:59
Так как ты передаешь str и он никак не изменяется в функции, то просто сделай так

stock TextForPlayer(playerid, const str[], time, type, color = COLOR_ORANGE)
{
switch(type)
{
case 0:
{
new
Text:textdraw = TextDrawCreate(323.748016, 214.666656, str);
TextDrawLetterSize(textdraw, 0.782181, 2.924167);
TextDrawAlignment(textdraw, 2);
TextDrawColor(textdraw, color);
TextDrawSetShadow(textdraw, 0);
TextDrawSetOutline(textdraw, 1);
TextDrawBackgroundColor(textdraw, 255);
TextDrawFont(textdraw, 3);
TextDrawSetProportional(textdraw, 1);
TextDrawShowForPlayer(playerid, textdraw);
SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
}
case 1:
{
new
Text:textdraw = TextDrawCreate(630.286926, 320.916778, str);
TextDrawLetterSize(textdraw, 0.600394, 2.194999);
TextDrawAlignment(textdraw, 3);
TextDrawColor(textdraw, color);
TextDrawSetShadow(textdraw, 0);
TextDrawSetOutline(textdraw, 1);
TextDrawBackgroundColor(textdraw, 255);
TextDrawFont(textdraw, 3);
TextDrawSetProportional(textdraw, 1);
TextDrawShowForPlayer(playerid, textdraw);
SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
}
}
}


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

Перечитай тему еще раз.
Клик-клак (http://pro-pawn.ru/showthread.php?16434-const-%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C)

SteveStage
26.12.2019, 20:29
Так как ты передаешь str и он никак не изменяется в функции, то просто сделай так

stock TextForPlayer(playerid, const str[], time, type, color = COLOR_ORANGE)
{
switch(type)
{
case 0:
{
new
Text:textdraw = TextDrawCreate(323.748016, 214.666656, str);
TextDrawLetterSize(textdraw, 0.782181, 2.924167);
TextDrawAlignment(textdraw, 2);
TextDrawColor(textdraw, color);
TextDrawSetShadow(textdraw, 0);
TextDrawSetOutline(textdraw, 1);
TextDrawBackgroundColor(textdraw, 255);
TextDrawFont(textdraw, 3);
TextDrawSetProportional(textdraw, 1);
TextDrawShowForPlayer(playerid, textdraw);
SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
}
case 1:
{
new
Text:textdraw = TextDrawCreate(630.286926, 320.916778, str);
TextDrawLetterSize(textdraw, 0.600394, 2.194999);
TextDrawAlignment(textdraw, 3);
TextDrawColor(textdraw, color);
TextDrawSetShadow(textdraw, 0);
TextDrawSetOutline(textdraw, 1);
TextDrawBackgroundColor(textdraw, 255);
TextDrawFont(textdraw, 3);
TextDrawSetProportional(textdraw, 1);
TextDrawShowForPlayer(playerid, textdraw);
SetTimerEx("@_TextForPlayerTD", time, false, "dd", playerid, _:textdraw);
}
}
}


C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3525) : error 035: argument type mismatch (argument 3)
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3540) : error 035: argument type mismatch (argument 3)


new
Text:textdraw = TextDrawCreate(323.748016, 214.666656, str);
new
Text:textdraw = TextDrawCreate(630.286926, 320.916778, str);

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

Судя по всему, TextDrawCreate не может работать с константами, либо я что-то делаю не так.

execution
26.12.2019, 21:41
Это очередной баг с const-корректностью в сампе.

Библиотека fixes.inc (https://github.com/Open-GTO/sa-mp-fixes) поможет решить данную проблему.

SteveStage
26.12.2019, 21:47
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\pawno\include\fixes.inc(5891) : fatal error 111: user error: _ALS_OnFilterScriptInit defined

//#include <jit>
#include <crashdetect>
#include <a_samp>
#include <a_mysql>
#include <foreach>
#include <mxdate>
#include <Pawn.CMD>
#include <sscanf2>
#include <streamer>
#include <random_switch>
#include <fixes>

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

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

MassonNN
26.12.2019, 23:51
Инклуд fixes закинь перед foreach. Вырезать можно, но сложно.

SteveStage
26.12.2019, 23:59
Я нашел решение (https://github.com/sampctl/samp-stdlib)


Инклуд fixes закинь перед foreach. Вырезать можно, но сложно.

Да я его ставил прям после a_samp - безрезультатно

DeimoS
27.12.2019, 05:06
Проблема была в том, что в стандартных инклудах так же нарушена const-корректность. Можно её исправлять вручную, а можно поискать готовые решения, по типу того, что скинули выше.
Закрыто.