Русское сообщество по скриптингу

Run time error 5: memory access  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Run time error 5: memory access

Сообщение trojanranson » 02 фев 2021, 20:17

Displaying debug trace (plugin "test_savemoney.amxx", version "unknown")
L 02/02/2021 - 16:11:36: [AMXX] Run time error 5: memory access
L 02/02/2021 - 16:11:36: [AMXX] [0] test_savemoney.sma::SQL_Handler (line 95)
Ошибка вот тут
Код: Выделить всё
if(!is_user_connected(data[1])  ||  g_isLoad[data[1]]) 

Помогите исправить ошибку. :zzz:
Нашел плагин в интернете был заточен под ammo для зомбимода.
Сделал что бы сохранял деньги для csdm и выдавало во время спавна.
Код: Выделить всё
#include <amxmodx>
#include <sqlx>
#include <reapi>
#include <hamsandwich>

enum _:ques {INSTALL_PLUGIN, LOAD_MONEY, SAVE_MONEY, PRUNED};

new bool:g_isLoad[MAX_PLAYERS  + 1];

new Handle:g_sql_tuple;
static szQuery[1024];

static StartBonus = 16000; //first connect bonus

public plugin_init(){
    RegisterHam(Ham_Spawn,"player","PlayerSpawn")
    set_task(1.0, "PluginCfg");    
}
public PluginCfg()
{
    new szHost[64], szUser[32], szPasswd[32], szDb[32];
    get_cvar_string("amx_sql_host", szHost, charsmax(szHost));
    get_cvar_string("amx_sql_user", szUser, charsmax(szUser));
    get_cvar_string("amx_sql_pass", szPasswd, charsmax(szPasswd));
    get_cvar_string("amx_sql_db", szDb, charsmax(szDb));
    
    g_sql_tuple 
= SQL_MakeDbTuple(szHost, szUser, szPasswd, szDb);
    
    new data
[3];
    data[0] = INSTALL_PLUGIN;
    formatex(szQuery, charsmax(szQuery), "CREATE TABLE IF NOT EXISTS `money_manager_trojan` (`id` int(11) NOT NULL AUTO_INCREMENT, `Name` varchar(33) NOT NULL, `money` int(10) NOT NULL, `SteamID` varchar(25) NOT NULL UNIQUE, `LastConnect` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
    SQL_ThreadQuery(g_sql_tuple, "SQL_Handler", szQuery, data, sizeof(data));
    
    SQL_SetCharset
(g_sql_tuple, "utf8");
    
    data
[0] = PRUNED;
    formatex(szQuery, charsmax(szQuery), "DELETE FROM `money_manager_trojan` WHERE `LastConnect` < (UNIX_TIMESTAMP(NOW()) - %d)", (30 * 86400)); // delete players after 30 days
    SQL_ThreadQuery(g_sql_tuple, "SQL_Handler", szQuery, data, sizeof(data));
}
public client_connect(id)
    g_isLoad[id] = false;

public client_disconnected(id)
{
    if(is_user_bot(id) || is_user_hltv(id) || !g_isLoad[id]) 
    return
; 
    
    new money 
= get_member(id, m_iAccount);
    new szName[56]; get_user_name(id, szName, charsmax(szName));
    new szAuthid[64]; get_user_authid(id, szAuthid, charsmax(szAuthid));
    
    new szNewName
[33];
    SQL_QuoteString(Empty_Handle, szNewName, charsmax(szNewName), szName);
    
    formatex
(szQuery, charsmax(szQuery), "INSERT INTO `money_manager_trojan` (`Name`, `money`, `SteamID`, `LastConnect`) \
    VALUES ('%s', '%d', '%s', UNIX_TIMESTAMP(NOW())) \
    ON DUPLICATE KEY UPDATE `Name` = '%s', `money` = '%d', `LastConnect` = UNIX_TIMESTAMP(NOW())"
,
    szNewName, money, szAuthid, szNewName, money);
    
    SQL_ThreadQuery
(g_sql_tuple, "SQL_Handler", szQuery);
    
    g_isLoad
[id] = false;
}
public PlayerSpawn(id){
    if(is_user_bot(id) || is_user_hltv(id) || g_isLoad[id] || !is_user_connected(id))
    return HAM_IGNORED;
    
    new data
[3];
    data[0] = LOAD_MONEY;
    data[1] = id
    data
[2] = get_user_userid(id);
    
    
//new szName[32]; get_user_name(id, szName, charsmax(szName));
    new szAuthid[64]; get_user_authid(id, szAuthid, charsmax(szAuthid));
    //log_amx("[Money Manager] Р—апрос РЅР° Р·Р°РіСЂСѓР·РєСѓ РґРµРЅРµРі РґР»СЏ: %s | %s", szName, szAuthid);

    formatex(szQuery, charsmax(szQuery), "SELECT * FROM `money_manager_trojan` WHERE `SteamID` = '%s'", szAuthid);
    SQL_ThreadQuery(g_sql_tuple, "SQL_Handler", szQuery, data, sizeof(data));
    
    return HAM_IGNORED
;
}
public SQL_Handler(failstate, Handle:query, err[], errcode, data[], datasize)
{
    if(failstate == TQUERY_SUCCESS)
    {
        switch(data[0])
        {
            case LOAD_MONEY:
            {                        
                if
(!is_user_connected(data[1])  ||  g_isLoad[data[1]]) 
                return  0
;
                
                if
(data[2] != get_user_userid(data[1]))
                {
                    log_amx("[Money Manager] Р—агрузка РґСЂСѓРіРѕРјСѓ РёРіСЂРѕРєСѓ");
                    return  0;
                    
                
}
                
                new szName
[32]; get_user_name(data[1], szName, charsmax(szName));
                
                if
(SQL_NumResults(query) > 0)
                {
                    rg_add_account(data[1], SQL_ReadResult(query, 2), AS_SET);
                    log_amx("[Money Manager] Р—агружено %d РґРµРЅРµРі РґР»СЏ РёРіСЂРѕРєР° %s", SQL_ReadResult(query, 2), szName);
                    client_print_color(data[1], print_chat, "^3[^4Money Manager^3]^1 Р’ам РЅР°С‡РёСЃР»РµРЅС‹ РІС‹С€Рё РґРµРЅСЊРіРё: ^4+%d$", SQL_ReadResult(query, 2))
                }
                else 
                
{
                    rg_add_account(data[1], StartBonus, AS_SET);
                    log_amx("[Money Manager] Р˜РіСЂРѕРє %s РїРѕР»СѓС‡РёР» СЃС‚артовый РєР°РїРёС‚ал %d", szName, StartBonus);
                    client_print_color(data[1], print_chat, "^3[^4Money Manager^3]^1 Р’С‹ РЅРѕРІС‹Р№ РёРіСЂРѕРє Рё РїРѕР»СѓС‡Р°РµС‚Рµ РЅР° СЃС‚арте:^4+%d$", StartBonus)
                }
                
                g_isLoad
[data[1]] = true;
            }
            case PRUNED:
            {
                new pruned = SQL_AffectedRows(query);
                if(pruned) log_amx("[Pruned] Removed %d players!", pruned);
            }
            case INSTALL_PLUGIN, SAVE_MONEY: { }
        }
    }
    else    log_amx("[State #%d] РћС€РёР±РєР° [#%d] %s", data[0], errcode, err);
    return PLUGIN_CONTINUE;
}

public plugin_end()
    SQL_FreeHandle(g_sql_tuple);
 
Последний раз редактировалось trojanranson 05 фев 2021, 03:09, всего редактировалось 1 раз.
amxx просто хобби для себя.
Аватара пользователя
trojanranson
 
Сообщения: 102
Зарегистрирован: 07 мар 2020, 23:15
Откуда: г.Херосн
Благодарил (а): 33 раз.
Поблагодарили: 14 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Пиво с рыбкой

Re: Run time error 5: memory access

Сообщение nekruxa » 02 фев 2021, 21:55

Есть оригинал, чтобы посмотреть что там?
Аватара пользователя
nekruxa
 
Сообщения: 147
Зарегистрирован: 20 апр 2020, 12:43
Благодарил (а): 13 раз.
Поблагодарили: 28 раз.
Языки программирования: Я ничего не знаю

Re: Run time error 5: memory access

Сообщение trojanranson » 02 фев 2021, 22:37

nekruxa писал(а):Есть оригинал, чтобы посмотреть что там?

вот от куда брал Вы должны зарегистрироваться, чтобы видеть ссылки.
Код: Выделить всё
#include <amxmodx>
#include <sqlx>

new const TASKID = 11575757;

new bool:g_isLoad[33];

native zp_get_user_ammo_packs(id);
native zp_set_user_ammo_packs(id, amount);

enum _:ques { INSTALL_PLUGIN, LOAD_AMMO, SAVE_AMMO, PRUNED };
new Handle:g_sql_tuple, szQuery[1024];

public plugin_init()
    set_task(1.0, "PluginCfg");

public PluginCfg()
{
    new szHost[64], szUser[32], szPasswd[32], szDb[32];
    get_cvar_string("amx_sql_host", szHost, charsmax(szHost));
    get_cvar_string("amx_sql_user", szUser, charsmax(szUser));
    get_cvar_string("amx_sql_pass", szPasswd, charsmax(szPasswd));
    get_cvar_string("amx_sql_db", szDb, charsmax(szDb));
    
    g_sql_tuple 
= SQL_MakeDbTuple(szHost, szUser, szPasswd, szDb);
    
    new data
[3];
    
    data
[0] = INSTALL_PLUGIN;
    formatex(szQuery, charsmax(szQuery), "CREATE TABLE IF NOT EXISTS `zp_ammo_manager` (`id` int(11) NOT NULL AUTO_INCREMENT, `Name` varchar(33) NOT NULL, `Ammo` int(10) NOT NULL, `SteamID` varchar(25) NOT NULL UNIQUE, `LastConnect` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
    SQL_ThreadQuery(g_sql_tuple, "SQL_Handler", szQuery, data, sizeof(data));
    
    SQL_SetCharset
(g_sql_tuple, "utf8");
    
    data
[0] = PRUNED;
    formatex(szQuery, charsmax(szQuery), "DELETE FROM `zp_ammo_manager` WHERE `LastConnect` < (UNIX_TIMESTAMP(NOW()) - %d)", (30 * 86400)); // delete players after 30 days
    SQL_ThreadQuery(g_sql_tuple, "SQL_Handler", szQuery, data, sizeof(data));
}

public client_connect(id)
    g_isLoad[id] = false;

public client_putinserver(id)
{
    if(is_user_bot(id) || is_user_hltv(id)) return;
    
    zp_set_user_ammo_packs
(id, 0);
    set_task(3.0, "LoadAmmo", id+TASKID);
}

public LoadAmmo(taskid)
{
    new id = taskid - TASKID;
    
    if
(!is_user_connected(id) || g_isLoad[id]) return;
    
    new data
[3];
    
    data
[0] = LOAD_AMMO;
    data[1] = id;
    data[2] = get_user_userid(id);
    
    new szName
[32]; get_user_name(id, szName, charsmax(szName));
    new szAuthid[25]; get_user_authid(id, szAuthid, charsmax(szAuthid));
    
    log_amx
("[Ammo Manager] Запрос на загрузку аммо для: %s | %s", szName, szAuthid);
    
    formatex
(szQuery, charsmax(szQuery), "SELECT * FROM `zp_ammo_manager` WHERE `SteamID` = '%s'", szAuthid);
    SQL_ThreadQuery(g_sql_tuple, "SQL_Handler", szQuery, data, sizeof(data));
}

public client_disconnected(id)
{
    if(is_user_bot(id) || is_user_hltv(id) || !g_isLoad[id]) return;
    
    remove_task
(id+TASKID);
    
    new ammo 
= zp_get_user_ammo_packs(id);
    
    new szName
[32]; get_user_name(id, szName, charsmax(szName));
    new szAuthid[25]; get_user_authid(id, szAuthid, charsmax(szAuthid));
    
    new szNewName
[64];
    SQL_QuoteString(Empty_Handle, szNewName, charsmax(szNewName), szName);
    
    formatex
(szQuery, charsmax(szQuery), "INSERT INTO `zp_ammo_manager` (`Name`, `Ammo`, `SteamID`, `LastConnect`) \
    VALUES ('%s', '%d', '%s', UNIX_TIMESTAMP(NOW())) \
    ON DUPLICATE KEY UPDATE `Name` = '%s', `Ammo` = '%d', `LastConnect` = UNIX_TIMESTAMP(NOW())"
,
    szNewName, ammo, szAuthid, szNewName, ammo);
    
    SQL_ThreadQuery
(g_sql_tuple, "SQL_Handler", szQuery);
    
    g_isLoad
[id] = false;
}

public SQL_Handler(failstate, Handle:query, err[], errcode, data[], datasize)
{
    if(failstate == TQUERY_SUCCESS)
    {
        switch(data[0])
        {
            case LOAD_AMMO:
            {
                new id = data[1];
                
                if
(!is_user_connected(id) || g_isLoad[id]) return 0;
                
                if
(data[2] != get_user_userid(id))
                {
                    log_amx("[Ammo Manager] Загрузка другому игроку");
                    return 0;
                }
                
                new szName
[32]; get_user_name(id, szName, charsmax(szName));
                
                if
(SQL_NumResults(query) > 0)
                {
                    zp_set_user_ammo_packs(id, SQL_ReadResult(query, 3));
                    log_amx("[Ammo Manager] Загружено %d аммо для игрока %s", SQL_ReadResult(query, 3), szName);
                }
                else // first connect
                {
                    zp_set_user_ammo_packs(id, 50); // start bonus
                    log_amx("[Ammo Manager] Игрок %s получил стартовый бонус", szName);
                }
                
                g_isLoad
[id] = true;
            }
            case PRUNED:
            {
                new pruned = SQL_AffectedRows(query);
                if(pruned) log_amx("[Pruned] Removed %d players!", pruned);
            }
            case INSTALL_PLUGIN, SAVE_AMMO: { }
        }
    }
    else    log_amx("[State #%d] Error [#%d] %s", data[0], errcode, err);
    return PLUGIN_CONTINUE;
}

public plugin_end()
    SQL_FreeHandle(g_sql_tuple);
amxx просто хобби для себя.
Аватара пользователя
trojanranson
 
Сообщения: 102
Зарегистрирован: 07 мар 2020, 23:15
Откуда: г.Херосн
Благодарил (а): 33 раз.
Поблагодарили: 14 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Пиво с рыбкой

Re: Run time error 5: memory access

Сообщение RevCrew » 05 фев 2021, 00:20

Если еще актуально то сделайте
server_print(data[0], data[1], data[2]) в SQL_Handler
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Run time error 5: memory access

Сообщение trojanranson » 05 фев 2021, 03:38

RevCrew писал(а):Если еще актуально то сделайте
server_print(data[0], data[1], data[2]) в SQL_Handler

А как по тем знакам понять что не так? :-)
Сердечко, смайлик , знак вопроса.
Точные знаки уже по дню распишу какие были:D
amxx просто хобби для себя.
Аватара пользователя
trojanranson
 
Сообщения: 102
Зарегистрирован: 07 мар 2020, 23:15
Откуда: г.Херосн
Благодарил (а): 33 раз.
Поблагодарили: 14 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Пиво с рыбкой

Re: Run time error 5: memory access

Сообщение RevCrew » 05 фев 2021, 11:46

trojanranson, у вас ошибка с доступ к памяти

Добавлено спустя 35 секунд:
возможно вам стоит ввести переменную как в данном случае
Код: Выделить всё
new id data[1];
                
                if(!
is_user_connected(id) || g_isLoad[id]) return 0;
                
                if(
data[2] != get_user_userid(id))
                {
                    
log_amx("[Ammo Manager] Загрузка другому игроку");
                    return 
0;
                } 
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Run time error 5: memory access

Сообщение trojanranson » 05 фев 2021, 12:46

RevCrew писал(а):trojanranson, у вас ошибка с доступ к памяти

Добавлено спустя 35 секунд:
возможно вам стоит ввести переменную как в данном случае
Код: Выделить всё
new id = data[1];
                
                if
(!is_user_connected(id) || g_isLoad[id]) return 0;
                
                if
(data[2] != get_user_userid(id))
                {
                    log_amx("[Ammo Manager] Загрузка другому игроку");
                    return 0;
                

Если вы про это new id = data[1];
То тогда ошибка в этом месте будет
Я ее убрал думал может дело в ней было или дебаг покажет чего нового но нет)

Добавлено спустя 13 минут 35 секунд:
Может поможет в этом деле
В начале была вот такая ошибка, когда деньги выдавались при входе на сервер.
L 01/28/2021 - 17:00:29: [MySQL] Invalid info tuple handle: 0
L 01/28/2021 - 17:00:29: [AMXX] Displaying debug trace (plugin "test_savemoney.amxx", version "unknown")
L 01/28/2021 - 17:00:29: [AMXX] Run time error 10: native error (native "SQL_ThreadQuery")
L 01/28/2021 - 17:00:29: [AMXX] [0] test_savemoney.sma::client_putinserver (line 53)
Я гуглил и все что вычитал это сделать через спавн.
Тип игрок еще нормально не вошел а ему уже деньги суют)
amxx просто хобби для себя.
Аватара пользователя
trojanranson
 
Сообщения: 102
Зарегистрирован: 07 мар 2020, 23:15
Откуда: г.Херосн
Благодарил (а): 33 раз.
Поблагодарили: 14 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Пиво с рыбкой

Re: Run time error 5: memory access

Сообщение RevCrew » 05 фев 2021, 13:40

trojanranson, ну конечно, у вас же задержка стоит set_task(1.0, "PluginCfg"); а игрок не ждет одну секунду а сразу заходит
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Run time error 5: memory access

Сообщение trojanranson » 06 фев 2021, 00:35

RevCrew писал(а):trojanranson, ну конечно, у вас же задержка стоит set_task(1.0, "PluginCfg"); а игрок не ждет одну секунду а сразу заходит

Так как понять эту ошибку ? В каких примерно причинах она может появляться? Что не нравиться ему в data[1] там где индекс игроков. Он не может получить доступ к памяти чего именно. Капец и не где почитать описании про ошибку :(
amxx просто хобби для себя.
Аватара пользователя
trojanranson
 
Сообщения: 102
Зарегистрирован: 07 мар 2020, 23:15
Откуда: г.Херосн
Благодарил (а): 33 раз.
Поблагодарили: 14 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Пиво с рыбкой

Re: Run time error 5: memory access

Сообщение nekruxa » 06 фев 2021, 10:37

Неправильно выделена память, что-то типа того:
new szText[50]
formatex(szText, 100, "Err")
Аватара пользователя
nekruxa
 
Сообщения: 147
Зарегистрирован: 20 апр 2020, 12:43
Благодарил (а): 13 раз.
Поблагодарили: 28 раз.
Языки программирования: Я ничего не знаю

След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7