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

Тема в разделе "Программирование / Скриптинг", создана пользователем Alnet, 27 апр 2016.

  1. Alnet

    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)" понимал что куда писать) Да, задача сложная... может кто поможет мне в моем не легком деле?
     
    Последнее редактирование: 27 апр 2016
  2. gibs

    gibs Фитиль народного волненья

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

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

    R1KO Супер-модератор

    Сообщения:
    5.972
    Симпатии:
    2.978
    @Alnet, а что нужно сделать получив ответ от бд?
     
  4. Alnet

    Alnet

    Сообщения:
    39
    Симпатии:
    0
    PHP:
    GetMySQL_Query(String:table[], String:key_value[], String:arg[], client 0String:arg_value[] = "NULLIK"bool:get true)
    {
        new 
    String:szQuery[512];
        
    Format(szQuery512"SELECT %s FROM %s WHERE kay='%s';"argtablekey_value);


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

    public 
    SQL_CheckGetCallbackForAll(Handle:ownerHandle: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, 0info125);
                new 
    client GetClientOfUserId(GetArrayCell(array, 1));
           
                new 
    0;
                
    SQL_FieldNameToNum(hndlinfon); // узнает какая по счету ячейка name и записывает его в n
               
    new String:xstr[125];
                
    SQL_FetchString(hndlnxstr125); // Получаешь его имя с 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 и т д...
     
  5. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.972
    Симпатии:
    2.978
    @Alnet, если бы так можно было -так бы давно сделали. Нужно юзать функцию-каллбек
     
  6. Alnet

    Alnet

    Сообщения:
    39
    Симпатии:
    0
    получается чтоб записать ответ в нужную переменную для этой перменной нужно делать свой public SQL_CheckGetCallback ? =(( Оптимизировать никак не получиться(?
     
  7. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.972
    Симпатии:
    2.978
    @Alnet, ну исходя из того что везде только так - да
     
  8. Alnet

    Alnet

    Сообщения:
    39
    Симпатии:
    0
    и указателей в pawn получается нет?(
     
  9. gibs

    gibs Фитиль народного волненья

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