Ссылки или указатели в pawn ?

Alnet

Участник
Сообщения
39
Реакции
0
Здравствуйте, есть функция SQL_CheckGetCallback, в ее нужно передать ссылку на переменную чтоб потом записать в эту переменную нужные данные как только начнется выполнение функции:

public SQL_CheckGetCallback(Handle:owner, Handle:hndl, const String:error[], any:array)
{

}

Передавать буду через Array в any:array как передать ссылку или указатель в функцию?

MySql срабатывает не сразу (код продолжает выполняться) приходиться хитрить... мб кто понял что я хочу - помогут в моем не легком деле примерчиком? плииз.
--- Добавлено позже ---
SQL_TQuery(g_hDb, SQL_CheckGetCallback, szQuery, array);

public SQL_CheckGetCallback(Handle:owner, Handle:hndl, const String:error[], any:array)

Другими словами чтоб не плодить "public SQL_CheckGetCallback(Handle:owner, Handle:hndl, const String:error[], any:array)" в коде, нужно как-то передавать в SQL_TQuery(g_hDb, SQL_CheckGetCallback, szQuery, array); разные переменные чтоб "public SQL_CheckGetCallback(Handle:owner, Handle:hndl, const String:error[], any:array)" понимал что куда писать) Да, задача сложная... может кто поможет мне в моем не легком деле?
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Ты путаешь павн с сишкой. Тут указателей не существует. Есть рефы, что-то похожее на ссылки, которые можно передавать в функции с помощью оператора &.
PHP:
void Invol(int &iValue)
{
    iValue = iValue * iValue;
}

int iValue = 5;
Invol(iValue);
PrintToServer("%d", iValue);
Так же ты не можешь передать массив в этот коллбек, только одну переменную. Это видно из объявления.
ЗЫ: Любое нелёгкое дело станет куда проще если перестать тупить.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
@Alnet, а что нужно сделать получив ответ от бд?
 

Alnet

Участник
Сообщения
39
Реакции
0
@Alnet, а что нужно сделать получив ответ от бд?

PHP:
GetMySQL_Query(String:table[], String:key_value[], String:arg[], client = 0, String:arg_value[] = "NULLIK", bool:get = true)
{
    new String:szQuery[512];
    Format(szQuery, 512, "SELECT %s FROM %s WHERE kay='%s';", arg, table, key_value);


        new Handle:array = CreateArray(125);
        PushArrayString(array, arg);
        PushArrayCell(array, GetClientUserId(client));
   
        SQL_TQuery(g_hDb, SQL_CheckGetCallbackForAll, szQuery, array);
}

public SQL_CheckGetCallbackForAll(Handle:owner, Handle:hndl, const String:error[], any:array) //Ответ об успешности получения данных из базы
{
    if (owner == INVALID_HANDLE)
    {
        PrintToChatAll("[Test] SelectPlayer: Connection to SQL database has failed, Reason: %s", error);
        return -1;
    }

    if(hndl == INVALID_HANDLE)
    {
        PrintToChatAll("[Test] SelectPlayer: Error loading player, Reason: %s", error);
        return -1;
    }
    else
    {
        new bool:hrs = SQL_HasResultSet(hndl);
        new bool:fr = SQL_FetchRow(hndl); // (ЭТО ПРОВЕРКА НА НАЛИЧИЕ КЛЮЧА - УНИКАЛЬНОГО ОРИЕНТИРА)

        if(hrs && fr)
        {
            decl String:info[125];
            GetArrayString(array, 0, info, 125);
            new client = GetClientOfUserId(GetArrayCell(array, 1));
       
            new n = 0;
            SQL_FieldNameToNum(hndl, info, n); // узнает какая по счету ячейка name и записывает его в n
           new String:xstr[125];
            SQL_FetchString(hndl, n, xstr, 125); // Получаешь его имя с n ячейки
        
            PrintToChat(client, "Ответ: = %s", xstr);
       
            return 1;
        }
        return 0;
    }
}

xstr - ответ запроса. Нужно как-то указать в SQL_TQuery(g_hDb, SQL_CheckGetCallbackForAll, szQuery, array); - переменную куда записывать запрос. проще говоря я хочу сделать универсальную функцию GetMySQL_Query - которая будет при вызове записывать нужные данные из ответа базы в нужные переменные... осталось научить понимать в какие переменные именно записывать надо...)) очень надеюсь что я хоть чуть-чуть понятно обяснил))) С помощью этого можно избежать дублирования public SQL_CheckGetCallbackForOne, public SQL_CheckGetCallbackForTwo, SQL_CheckGetCallbackForTree и т д...
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5
@Alnet, если бы так можно было -так бы давно сделали. Нужно юзать функцию-каллбек
 

Alnet

Участник
Сообщения
39
Реакции
0
@Alnet, если бы так можно было -так бы давно сделали. Нужно юзать функцию-каллбек
получается чтоб записать ответ в нужную переменную для этой перменной нужно делать свой public SQL_CheckGetCallback ? =(( Оптимизировать никак не получиться(?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
@Alnet, ну исходя из того что везде только так - да
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Тебе они в этом случае просто нафиг не упали. Я понятия не имею зачем тебе передавать в коллбек строку имени поля, если это единственное поле в ответе от бд, оно будет иметь индекс 0. Не проще его потом просто считать, и передавать только юзер айди? К тому же ты не закрываешь то, что насоздавал, что является очень и очень и очень плохо. И исходя из твоего мышления в кусочке, что ты предоставил, в Сишке ты был бы невероятно плох.
И кстати, коллбек имеет тип void.
 
Сверху Снизу