alliedmodders / amxmodx

AMX Mod X - Half-Life 1 Scripting and Administration
http://www.amxmodx.org/
489 stars 197 forks source link

STATIC VARIABLE INSIDE STOCK .INC NOT WORKS PLEASE FIX IT #1012

Closed UnrealKaraulov closed 2 years ago

UnrealKaraulov commented 2 years ago

Code inside .inc

stock rm_base_plugin_id()
{
    static pluginid = -1;

    if (pluginid != -1)
    {   
        log_amx("USE STATIC! %d", pluginid);
        return pluginid;
    }

    new num_of_plugins = get_pluginsnum()
    for (new i = 0; i < num_of_plugins; ++i)
    {
        if (get_func_id("RM_RegisterPlugin",i) >= 0)
        {
            pluginid = i;
            break;
        }
    }

    return pluginid;
}

I need cache pluginid value for speedup. But I can't see 'USE STATIC! ' message in console.

Why static not works as I need (like in c/c++ language)

OciXCrom commented 2 years ago

static pluginid; pluginid = -1;

Giferns commented 2 years ago

@OciXCrom no, your variant will reset variable each call

@UnrealKaraulov у тебя проблема в коде ниже (оно не находит функцию и соотвественно индекс остаётся тем же самым), а не в статике. Ты блин достал уже всех капсом фигачить "спасите помогите". Никто тебя серьёзно не воспринимает. Не знаю, на какую помощь ты вообще надеешься.

stock rm_base_plugin_id()
{
    static pluginid = -1

    server_print("%i", pluginid)

    pluginid = random_num(0, 5555)
}

результат

14:30:23 test
14:30:23 -1
14:30:24 test
14:30:24 2494
14:30:24 test
14:30:24 2178
14:30:24 test
14:30:24 4941
14:30:25 test
14:30:25 2352
14:30:25 test
14:30:25 3317
UnrealKaraulov commented 2 years ago

@Giferns если бы не находило, то плагины бы из https://c-s.net.ua/forum/topic92412s20.html#entry1145313 не работали. ( https://github.com/UnrealKaraulov/RERUNEMOD/blob/9ded4df867a6948a44fe5b780d37f2bbb2114c98/include/rm_api.inc#L46 ) так что не пиши глупости пока не разберешься

@OciXCrom not works


stock rm_base_plugin_id()
{
    static pluginid; pluginid = -1;

    if (pluginid != -1)
    {   
        log_amx("USE STATIC! %d", pluginid); 
        return pluginid;
    }

    new num_of_plugins = get_pluginsnum()
    for (new i = 0; i < num_of_plugins; ++i)
    {
        if (get_func_id("RM_RegisterPlugin",i) >= 0)
        {
            pluginid = i;
            break;
        }
    }

    return pluginid;
}

in your case pluginid anyway always == -1

from https://github.com/UnrealKaraulov/RERUNEMOD/blob/main/include/rm_api.inc

WPMGPRoSToTeMa commented 2 years ago

You're probably talking about caching across different plugins, aren't you?

UnrealKaraulov commented 2 years ago

You're probably talking about caching across different plugins, aren't you? Yes

inc :

stock rm_base_plugin_id()
{
    static pluginid; pluginid = -1;

    if (pluginid != -1)
    {   
        log_amx("USE STATIC! %d", pluginid); 
        return pluginid;
    }

    new num_of_plugins = get_pluginsnum()
    for (new i = 0; i < num_of_plugins; ++i)
    {
        if (get_func_id("RM_RegisterPlugin",i) >= 0)
        {
            pluginid = i;
            break;
        }
    }

    return pluginid;
}

In sma files: call rm_base_plugin_id( );

I need do cache "pluginid" variable.

static variable not works in amxmodx :(

WPMGPRoSToTeMa commented 2 years ago

You may achieve that via xvars.

Giferns commented 2 years ago

@UnrealKaraulov

RUКакие глупости я пишу? Это ты не объясняешь кейс использования. Разработчик, блин. Залез к тебе в репозиторий рунмода. rm_base_plugin_id() ты используешь в rm_register_rune() Ты судя по всему не понимаешь, как это работаеь. Каждый плагин, который использует rm_register_rune(), у тебя будет иметь свой собственный rm_base_plugin_id() со своим собственным static pluginid = -1; Не одна переменная на всех. На каждый плагин своя переменная с данным именем. Она не одна общая на всех. Если бы была бы общей, тогда бы да, первый вызов у тебя определял индекс, и последующие вызовы использовали бы кеш. Чтобы использовать одну переменную, нужен xvar, как выше написали. Но я тебе по секрету скажу, наворотил ты в этом рунмоде что-то страшное.

EN@UnrealKaraulov What nonsense am I writing? You do not explain the use case. Damn developer. Climbed into your runmod repository. rm_base_plugin_id () you use in rm_register_rune () You don't seem to understand how it works. Every plugin that uses rm_register_rune (), you will have its own rm_base_plugin_id () with its own static pluginid = -1; Not one variable at all. Each plugin has its own variable with the given name. It is not the same at all. If it were common, then yes, the first call you have determined the index, and subsequent calls would use the cache. To use one variable, you need xvar, as written above. But I'll tell you a secret, you've done something terrible in this runmod.
UnrealKaraulov commented 2 years ago

@Giferns понял уже, просто надеялся что статические переменные тут работают как в C++ каком-нибудь)

кстати если сделать так:

public pluginid;
public rm_base_plugin_id()
{
    static pluginid = -1;

    if (pluginid != -1)
    {   
        log_amx("USE STATIC! %d", pluginid); 
        return pluginid;
    }

    new num_of_plugins = get_pluginsnum()
    for (new i = 0; i < num_of_plugins; ++i)
    {
        if (get_func_id("RM_RegisterPlugin",i) >= 0)
        {
            pluginid = i;
            break;
        }
    }

    return pluginid;
}

То в 10% случаев переменная становится реально статической и плагин на некоторое время сохраняется в памяти. Хоть какая оптимизация 🤣 🤣 🤣 🤣 🤣 🤣 🤣 🤣

То есть добавить с таким же именем "public pluginid;" а в функции уже "static pluginid;") магия AMX MOD X ?))

Giferns commented 2 years ago

@UnrealKaraulov https://forums.alliedmods.net/showthread.php?t=138880