Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 8 из 8 ПерваяПервая ... 6 7 8
Показано с 71 по 75 из 75
  1. #71
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Прозрачность.
    Исключаются ситуации, в которых непонятно, каким образом рассчитывается размер форматного массива. Формула подсчёта всегда находится прямо в коде, и никуда не исчезает, в отличие от результатов, выдаваемых калькулятором.
    Поняв принципы, по которым составляется формула, можно легко прочесть саму формулу и убедиться в её корректности.
    Ну это не индивидуальное преимущество данного метода, ибо и в "ручном" подсчёте можно составлять формулу по принципу: "число_символов_в_строке_без_учёта_спецификаторов + содержимое спецификаторов по отдельности + 1". Выйдет так же "прозрачно", как и в описанном приёме подсчёта через sizeof

    Странно, что ты рассматриваешь альтернативу данному методу лишь в виде расчёта размера при помощи калькулятора и указания этого размера в виде целого числа. (считай это комментарием ко второму преимуществу)


    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Готовность к модификации.
    При изменении форматного текста вносить изменения в формулу нужно только при добавлении новых спецификаторов или изменении уже имеющихся.
    Для сравнения, при ручном подсчёте размер массива придётся пересчитывать при любом редактировании форматной строки.
    Опять же, при ручном подсчёте так же можно использовать формулы. И если пользоваться редактором, что выводит количество выделенных символов, подсчитать новый размер не составит большого труда.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Грамотное использование стека.
    Ну это тоже не является заслугой сугубо этого метода. Грамотно использовать стэк можно и при ручном расчёте точно так же, как и использовать стэк неграмотно в описанном тобой методе, подставляя в формулу рандомные значения.


    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Плохая читаемость кода.
    Например, такой код:
    PHP код:
    new string[4];
    format(stringsizeof(string), "Ваш ID: %d"playerid); 
    ... занимает меньше места и может быть проще для восприятия, чем
    PHP код:
    static const fmt_str[] = "Ваш ID: %d";
    new 
    string[sizeof(fmt_str) + (-4)];
    format(stringsizeof(string), fmt_strplayerid); 
    На самом деле "читаемость" кода - вещь субъективная. При достаточном опыте использования описываемого в данном уроке метода код из второго примера может перестать казаться сложным.
    Ну да, на примере коротких строк код выглядит вполне нормально. Но попробуй, например, вот такой вариант:
    PHP код:
    static const fmt_str[] = "INSERT INTO `hotel` (mID,mOwned,mOwner,mX,mY,mZ,mCar,eX,eY,eZ,mLock,mMoney,mOplata,mVirt,mCarDrived,cX,cY,cZ,cRZ) VALUES (%d, 'None', %d, %f, %f, %f, %d, %f, %f, %f, 0, 2000, 1000, %d, 0, %f, %f, %f, %f)";
    new 
    string[sizeof(fmt_str) + (-4) + (-33) + (-11) + (-23) + (-14) + (-55) + (-44)];// Формула от балды написана. Суть не в ней
    format(stringsizeof(string), fmt_strHotelInfo[i][mID], HotelInfo[i][mOwner], HotelInfo[i][mEnter][0], HotelInfo[i][mEnter][1], HotelInfo[i][mEnter][2], HotelInfo[i][mCar], HotelInfo[i][mExit][0], HotelInfo[i][mExit][1], HotelInfo[i][mExit][2],HotelInfo[i][mVirt],cX,cY,cZ,cRZ); 
    И убери из запроса переменные: mOwner, [mExit][0] и cY.
     А потом представь вот такой код в реализации подобного подсчёта, где запрос придётся разбить на несколько массивов
    PHP код:
    stock SavePlayer(playerid)
    {
        static 
    query[5000];
        
    query "UPDATE `accounts` SET ";
        
    format(querysizeof(query), "%sLvL=%d,"queryPlayer[playerid][pLevel]);
        
    format(querysizeof(query), "%sAdmin=%d,"queryPlayer[playerid][pAdmin]);
        
    format(querysizeof(query), "%sHelper=%d,"queryPlayer[playerid][pHelper]);
        
    format(querysizeof(query), "%spGuardCL=%d,"queryPlayer[playerid][pGuardCL]);
        
    format(querysizeof(query), "%sVip=%d,"queryPlayer[playerid][pVip]);
        
    format(querysizeof(query), "%sVipTime=%d,"queryPlayer[playerid][pVipTime]);
        
    format(querysizeof(query), "%sConnectTime=%d,"queryPlayer[playerid][pConnectTime]);
        
    format(querysizeof(query), "%sSex=%d,"queryPlayer[playerid][pSex]);
        
    format(querysizeof(query), "%sExp=%d,"queryPlayer[playerid][pExp]);
        
    format(querysizeof(query), "%sMoney=%d,"queryPlayer[playerid][pMoney]);
        
    format(querysizeof(query), "%sBankMoney=%d,"queryPlayer[playerid][pBankMoney]);
        
    format(querysizeof(query), "%sJailed=%d,"queryPlayer[playerid][pJailed]);
        
    format(querysizeof(query), "%sJailTime=%d,"queryPlayer[playerid][pJailTime]);
        
    format(querysizeof(query), "%sLeader=%d,"queryPlayer[playerid][pLeader]);
        
    format(querysizeof(query), "%sMember=%d,"queryPlayer[playerid][pMember]);
        
    format(querysizeof(query), "%sRank=%d,"queryPlayer[playerid][pRank]);
        
    format(querysizeof(query), "%sSkin=%d,"queryPlayer[playerid][pSkin]);
        
    format(querysizeof(query), "%sMutedTime=%d,"queryPlayer[playerid][pMutedTime]);
        
    format(querysizeof(query), "%sFMutedTime=%d,"queryPlayer[playerid][pFMutedTime]);
        
    format(querysizeof(query), "%sHealth=%f,"queryPlayer[playerid][pHealth]);
        
    format(querysizeof(query), "%sTut=%d,"queryPlayer[playerid][pTut]);
        
    format(querysizeof(query), "%sWarns=%d,"queryPlayer[playerid][pWarns]);
        
    format(querysizeof(query), "%sFWarns=%d,"queryPlayer[playerid][pFWarns]);
        
    format(querysizeof(query), "%sBlocks=%d,"queryPlayer[playerid][pBlocks]);
        
    format(querysizeof(query), "%sDonateMoney=%d,"queryPlayer[playerid][pDonateMoney]);
        
    format(querysizeof(query), "%sALLDonateMoney=%d,"queryPlayer[playerid][pALLDonateMoney]);
        
    format(querysizeof(query), "%sStylef=%d,"queryPlayer[playerid][pStylef]);
        
    format(querysizeof(query), "%sPiss=%d,"queryPlayer[playerid][pPiss]);
        
    format(querysizeof(query), "%sHunger=%d,"queryPlayer[playerid][pHunger]);
        
    format(querysizeof(query), "%sPit=%d,"queryPlayer[playerid][pPit]);
        
    format(querysizeof(query), "%sSleep=%d,"queryPlayer[playerid][pSleep]);
        
    format(querysizeof(query), "%sRadiation=%d,"queryPlayer[playerid][pRadiation]);
        
    format(querysizeof(query), "%sVirus=%d,"queryPlayer[playerid][pVirus]);
        
    format(querysizeof(query), "%sLastOnline=%d,"queryPlayer[playerid][pLastOnline]);
        
    format(querysizeof(query), "%sRegOnline=%d,"queryPlayer[playerid][pRegOnline]);
        
    format(querysizeof(query), "%sVampire=%d,"queryPlayer[playerid][pVampire]);
        
    format(querysizeof(query), "%sGunSkill_1=%d,"queryPlayer[playerid][pGunSkill][0]);
        
    format(querysizeof(query), "%sGunSkill_2=%d,"queryPlayer[playerid][pGunSkill][1]);
        
    format(querysizeof(query), "%sGunSkill_3=%d,"queryPlayer[playerid][pGunSkill][2]);
        
    format(querysizeof(query), "%sGunSkill_4=%d,"queryPlayer[playerid][pGunSkill][3]);
        
    format(querysizeof(query), "%sGunSkill_5=%d,"queryPlayer[playerid][pGunSkill][4]);
        
    format(querysizeof(query), "%sGunSkill_6=%d,"queryPlayer[playerid][pGunSkill][5]);
        
    format(querysizeof(query), "%sSpawn=%d,"queryPlayer[playerid][pSpawn]);
        
    format(querysizeof(query), "%sPosX=%f,"queryPlayer[playerid][pPosX]);
        
    format(querysizeof(query), "%sPosY=%f,"queryPlayer[playerid][pPosY]);
        
    format(querysizeof(query), "%sPosZ=%f,"queryPlayer[playerid][pPosZ]);
        
    format(querysizeof(query), "%sPosA=%f,"queryPlayer[playerid][pPosA]);
        
    format(querysizeof(query), "%sSpawnExit=%d,"queryPlayer[playerid][pSpawnExit]);
        
    format(querysizeof(query), "%sSlots=%d,"queryPlayer[playerid][pSlots]);
        
    format(querysizeof(query), "%sPack=%d,"queryPlayer[playerid][pPack]);
        
    format(querysizeof(query), "%sPupgrade=%d,"queryPlayer[playerid][gPupgrade]);
        
    format(querysizeof(query), "%sMask=%d,"queryPlayer[playerid][pMask]);
        
    format(querysizeof(query), "%sDiverSkill=%d,"queryPlayer[playerid][pDiverSkill]);
        
    format(querysizeof(query), "%sGuardCode=%d,"queryPlayer[playerid][pGuardCode]);
        
    format(querysizeof(query), "%sFlatKey=%d,"queryPlayer[playerid][pFlatKey]);
        
    format(querysizeof(query), "%s_Int_=%d,"queryPlayer[playerid][pInt]);
        
    format(querysizeof(query), "%sLocal=%d,"queryPlayer[playerid][pLocal]);
        
    format(querysizeof(query), "%sPhousekey=%d,"queryPlayer[playerid][pPhousekey]);
        
    format(querysizeof(query), "%sWeapon1=%d,"queryPlayer[playerid][Weapon1]);
        
    format(querysizeof(query), "%sWeapon1a=%d,"queryPlayer[playerid][Weapon1a]);
        
    format(querysizeof(query), "%sWeapon2=%d,"queryPlayer[playerid][Weapon2]);
        
    format(querysizeof(query), "%sWeapon2a=%d,"queryPlayer[playerid][Weapon2a]);
        
    format(querysizeof(query), "%sWeapon3=%d,"queryPlayer[playerid][Weapon3]);
        
    format(querysizeof(query), "%sWeapon3a=%d,"queryPlayer[playerid][Weapon3a]);
        
    format(querysizeof(query), "%sWeapon4=%d,"queryPlayer[playerid][Weapon4]);
        
    format(querysizeof(query), "%sWeapon4a=%d,"queryPlayer[playerid][Weapon4a]);
        
    format(querysizeof(query), "%sWeapon5=%d,"queryPlayer[playerid][Weapon5]);
        
    format(querysizeof(query), "%sWeapon5a=%d,"queryPlayer[playerid][Weapon5a]);
        
    format(querysizeof(query), "%sWeapon6=%d,"queryPlayer[playerid][Weapon6]);
        
    format(querysizeof(query), "%sWeapon6a=%d,"queryPlayer[playerid][Weapon6a]);
        
    format(querysizeof(query), "%sWeapon7=%d,"queryPlayer[playerid][Weapon7]);
        
    format(querysizeof(query), "%sWeapon7a=%d,"queryPlayer[playerid][Weapon7a]);
        
    format(querysizeof(query), "%sWeapon8=%d,"queryPlayer[playerid][Weapon8]);
        
    format(querysizeof(query), "%sWeapon8a=%d,"queryPlayer[playerid][Weapon8a]);
        
    format(querysizeof(query), "%sWeapon9=%d,"queryPlayer[playerid][Weapon9]);
        
    format(querysizeof(query), "%sWeapon9a=%d,"queryPlayer[playerid][Weapon9a]);
        
    format(querysizeof(query), "%sWeapon10=%d,"queryPlayer[playerid][Weapon10]);
        
    format(querysizeof(query), "%sWeapon10a=%d,"queryPlayer[playerid][Weapon10a]);
        
    format(querysizeof(query), "%sWeapon11=%d,"queryPlayer[playerid][Weapon11]);
        
    format(querysizeof(query), "%sWeapon11a=%d,"queryPlayer[playerid][Weapon11a]);
        
    format(querysizeof(query), "%sWeapon12=%d,"queryPlayer[playerid][Weapon12]);
        
    format(querysizeof(query), "%sWeapon12a=%d,"queryPlayer[playerid][Weapon12a]);
        
    format(querysizeof(query), "%sBarterSkil=%d,"queryPlayer[playerid][pBarterSkill]);
        
    format(querysizeof(query), "%sSurvSkill=%d,"queryPlayer[playerid][pSurvSkill]);
        
    format(querysizeof(query), "%sWeapSkill=%d,"queryPlayer[playerid][pWeapSkill]);
        
    format(querysizeof(query), "%sMedSkill=%d,"queryPlayer[playerid][pMedSkill]);
        
    format(querysizeof(query), "%sRepSkill=%d,"queryPlayer[playerid][pRepSkill]);
        
    format(querysizeof(query), "%sGuardClothes=%d"queryPlayer[playerid][pGuardClothes]);
        
    format(querysizeof(query), "%s WHERE Name='%s'"queryPlayer[playerid][pName]);
        
    mysql_tquery(connectionHandle,query"","");


        
    query "UPDATE `accounts` SET ";
        for(new 
    iINVNUMBERS/2-1i++)
            
    format(querysizeof(query), "%sPlayerInv_%d=%d,"queryi+1Player[playerid][pPlayerInv][i]);
        
    format(querysizeof(query), "%sPlayerInv_%d=%d"queryINVNUMBERS/2Player[playerid][pPlayerInv][INVNUMBERS/2-1]);
        
    format(querysizeof(query), "%s WHERE Name='%s'"queryPlayer[playerid][pName]);
        
    mysql_tquery(connectionHandle,query"","");


        
    query "UPDATE `accounts` SET ";
        for(new 
    i=INVNUMBERS/2INVNUMBERS-1i++)
            
    format(querysizeof(query), "%sPlayerInv_%d=%d,"queryi+1Player[playerid][pPlayerInv][i]);
        
    format(querysizeof(query), "%sPlayerInv_%d=%d"queryINVNUMBERSPlayer[playerid][pPlayerInv][INVNUMBERS-1]);
        
    format(querysizeof(query), "%s WHERE Name='%s'"queryPlayer[playerid][pName]);
        
    mysql_tquery(connectionHandle,query"","");


        
    query "UPDATE `accounts` SET ";
        for(new 
    iIDKVESTi++)
        {
            
    format(querysizeof(query), "%sSaveKvest_%d=%d,"queryi+1Player[playerid][pSaveKvest][i]);
        }
        for(new 
    i20i++)
        {
            
    format(querysizeof(query), "%sPlayerInv_%d=%d,"queryi+1Player[playerid][pPlayerGMP][i]);
        }
        
    format(querysizeof(query), "%sOtkatgun=%d,"queryPlayer[playerid][pOtkatgun]);
        
    format(querysizeof(query), "%sHeadValue=%d,"queryPlayer[playerid][pHeadValue]);
        
    format(querysizeof(query), "%sFishki=%d,"queryPlayer[playerid][pFishki]);
        
    format(querysizeof(query), "%sTimequest=%d,"queryPlayer[playerid][pTimequest]);
        
    format(querysizeof(query), "%sInfoquest=%d,"queryPlayer[playerid][pInfoquest]);
        
    format(querysizeof(query), "%sNaruch=%d,"queryPlayer[playerid][pNaruch]);
        
    format(querysizeof(query), "%sPame='%s',"queryPlayer[playerid][pPame]);
        
    format(querysizeof(query), "%sGul=%d"queryPlayer[playerid][pGul]);
        
    format(querysizeof(query), "%s WHERE Name='%s'"queryPlayer[playerid][pName]);
        
    mysql_tquery(connectionHandle,query"","");
        return 
    1;


    Чем больше спецификаторов в строке и чем больше строк, тем нереальней становится нормальная работа с кодом. И дело тут не в привычке, а в том, что довольно трудно сопоставить 13 спецификатор из строки какой-то определённой переменной, ибо приходится по всему экрану глазами водить в поисках нужных данных.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Трудоёмкость.
    И ежу понятно, что бездумно написать "new string[145];" куда проще, чем составлять формулы.
    В принципе то же самое относится и к ручному подсчёту с помощью калькулятора, да и к любому другому методу подсчёта вообще. Зачем что-то рассчитывать, если можно обойтись максимальной длиной строки ("145" или "MAX_CHATBUBBLE_LENGTH + 1" для SendClientMessage) или ещё чем-то подобным?
    Опять же, ты довольно однобоко рассматриваешь альтернативы :) Но об этом уже выше сказал
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  2. #72
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Да, пожалуй, составлять сравнение в 4 часа ночи было не самой лучшей идеей.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну это не индивидуальное преимущество данного метода, ибо и в "ручном" подсчёте можно составлять формулу по принципу: "число_символов_в_строке_без_учёта_спецификаторов + содержимое спецификаторов по отдельности + 1". Выйдет так же "прозрачно", как и в описанном приёме подсчёта через sizeof
    Добавил замечания о ручном подсчёте с использованием формул в 1-й и 2-й пункты. Правда, не уверен, что "ручной подсчёт" является самым подходящим названием, но пока что оставлю так.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Странно, что ты рассматриваешь альтернативу данному методу лишь в виде расчёта размера при помощи калькулятора и указания этого размера в виде целого числа. (считай это комментарием ко второму преимуществу)
    Если рассматривать ручной подсчёт с использованием формул, то разница между таким способом и описываемым мной сводится лишь к явному объявлению форматной строки в виде поименованного массива и использованию sizeof для автоматического подсчёта его размера.
    наверное, именно поэтому я и не пытался сделать сравнение с этим способом. Но, как я уже сказал ранее, сейчас я добавил о нём заметки.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну это тоже не является заслугой сугубо этого метода. Грамотно использовать стэк можно и при ручном расчёте точно так же, как и использовать стэк неграмотно в описанном тобой методе, подставляя в формулу рандомные значения.
    Да, действительно. Изначально я планировал сделать сравнение с отсутствием подсчёта вообще, но потом переключился на сравнение с ручным подсчётом, а об остатках от старого текста благополучно забыл. Сказывается ночное время суток.
    Сейчас я уже перенёс этот пункт в список особенностей.


    Цитата Сообщение от DeimoS Посмотреть сообщение
     А потом представь вот такой код в реализации подобного подсчёта, где запрос придётся разбить на несколько массивов
    PHP код:
    stock SavePlayer(playerid)
    {
        static 
    query[5000];
        
    query "UPDATE `accounts` SET ";
        
    format(querysizeof(query), "%sLvL=%d,"queryPlayer[playerid][pLevel]);
        
    format(querysizeof(query), "%sAdmin=%d,"queryPlayer[playerid][pAdmin]);
        
    format(querysizeof(query), "%sHelper=%d,"queryPlayer[playerid][pHelper]);
        
    format(querysizeof(query), "%spGuardCL=%d,"queryPlayer[playerid][pGuardCL]);
        
    format(querysizeof(query), "%sVip=%d,"queryPlayer[playerid][pVip]);
        
    format(querysizeof(query), "%sVipTime=%d,"queryPlayer[playerid][pVipTime]);
        
    format(querysizeof(query), "%sConnectTime=%d,"queryPlayer[playerid][pConnectTime]);
        
    format(querysizeof(query), "%sSex=%d,"queryPlayer[playerid][pSex]);
        
    format(querysizeof(query), "%sExp=%d,"queryPlayer[playerid][pExp]);
        
    format(querysizeof(query), "%sMoney=%d,"queryPlayer[playerid][pMoney]);
        
    format(querysizeof(query), "%sBankMoney=%d,"queryPlayer[playerid][pBankMoney]);
        
    format(querysizeof(query), "%sJailed=%d,"queryPlayer[playerid][pJailed]);
        
    format(querysizeof(query), "%sJailTime=%d,"queryPlayer[playerid][pJailTime]);
        
    format(querysizeof(query), "%sLeader=%d,"queryPlayer[playerid][pLeader]);
        
    format(querysizeof(query), "%sMember=%d,"queryPlayer[playerid][pMember]);
        
    format(querysizeof(query), "%sRank=%d,"queryPlayer[playerid][pRank]);
        
    format(querysizeof(query), "%sSkin=%d,"queryPlayer[playerid][pSkin]);
        
    format(querysizeof(query), "%sMutedTime=%d,"queryPlayer[playerid][pMutedTime]);
        
    format(querysizeof(query), "%sFMutedTime=%d,"queryPlayer[playerid][pFMutedTime]);
        
    format(querysizeof(query), "%sHealth=%f,"queryPlayer[playerid][pHealth]);
        
    format(querysizeof(query), "%sTut=%d,"queryPlayer[playerid][pTut]);
        
    format(querysizeof(query), "%sWarns=%d,"queryPlayer[playerid][pWarns]);
        
    format(querysizeof(query), "%sFWarns=%d,"queryPlayer[playerid][pFWarns]);
        
    format(querysizeof(query), "%sBlocks=%d,"queryPlayer[playerid][pBlocks]);
        
    format(querysizeof(query), "%sDonateMoney=%d,"queryPlayer[playerid][pDonateMoney]);
        
    format(querysizeof(query), "%sALLDonateMoney=%d,"queryPlayer[playerid][pALLDonateMoney]);
        
    format(querysizeof(query), "%sStylef=%d,"queryPlayer[playerid][pStylef]);
        
    format(querysizeof(query), "%sPiss=%d,"queryPlayer[playerid][pPiss]);
        
    format(querysizeof(query), "%sHunger=%d,"queryPlayer[playerid][pHunger]);
        
    format(querysizeof(query), "%sPit=%d,"queryPlayer[playerid][pPit]);
        
    format(querysizeof(query), "%sSleep=%d,"queryPlayer[playerid][pSleep]);
        
    format(querysizeof(query), "%sRadiation=%d,"queryPlayer[playerid][pRadiation]);
        
    format(querysizeof(query), "%sVirus=%d,"queryPlayer[playerid][pVirus]);
        
    format(querysizeof(query), "%sLastOnline=%d,"queryPlayer[playerid][pLastOnline]);
        
    format(querysizeof(query), "%sRegOnline=%d,"queryPlayer[playerid][pRegOnline]);
        
    format(querysizeof(query), "%sVampire=%d,"queryPlayer[playerid][pVampire]);
        
    format(querysizeof(query), "%sGunSkill_1=%d,"queryPlayer[playerid][pGunSkill][0]);
        
    format(querysizeof(query), "%sGunSkill_2=%d,"queryPlayer[playerid][pGunSkill][1]);
        
    format(querysizeof(query), "%sGunSkill_3=%d,"queryPlayer[playerid][pGunSkill][2]);
        
    format(querysizeof(query), "%sGunSkill_4=%d,"queryPlayer[playerid][pGunSkill][3]);
        
    format(querysizeof(query), "%sGunSkill_5=%d,"queryPlayer[playerid][pGunSkill][4]);
        
    format(querysizeof(query), "%sGunSkill_6=%d,"queryPlayer[playerid][pGunSkill][5]);
        
    format(querysizeof(query), "%sSpawn=%d,"queryPlayer[playerid][pSpawn]);
        
    format(querysizeof(query), "%sPosX=%f,"queryPlayer[playerid][pPosX]);
        
    format(querysizeof(query), "%sPosY=%f,"queryPlayer[playerid][pPosY]);
        
    format(querysizeof(query), "%sPosZ=%f,"queryPlayer[playerid][pPosZ]);
        
    format(querysizeof(query), "%sPosA=%f,"queryPlayer[playerid][pPosA]);
        
    format(querysizeof(query), "%sSpawnExit=%d,"queryPlayer[playerid][pSpawnExit]);
        
    format(querysizeof(query), "%sSlots=%d,"queryPlayer[playerid][pSlots]);
        
    format(querysizeof(query), "%sPack=%d,"queryPlayer[playerid][pPack]);
        
    format(querysizeof(query), "%sPupgrade=%d,"queryPlayer[playerid][gPupgrade]);
        
    format(querysizeof(query), "%sMask=%d,"queryPlayer[playerid][pMask]);
        
    format(querysizeof(query), "%sDiverSkill=%d,"queryPlayer[playerid][pDiverSkill]);
        
    format(querysizeof(query), "%sGuardCode=%d,"queryPlayer[playerid][pGuardCode]);
        
    format(querysizeof(query), "%sFlatKey=%d,"queryPlayer[playerid][pFlatKey]);
        
    format(querysizeof(query), "%s_Int_=%d,"queryPlayer[playerid][pInt]);
        
    format(querysizeof(query), "%sLocal=%d,"queryPlayer[playerid][pLocal]);
        
    format(querysizeof(query), "%sPhousekey=%d,"queryPlayer[playerid][pPhousekey]);
        
    format(querysizeof(query), "%sWeapon1=%d,"queryPlayer[playerid][Weapon1]);
        
    format(querysizeof(query), "%sWeapon1a=%d,"queryPlayer[playerid][Weapon1a]);
        
    format(querysizeof(query), "%sWeapon2=%d,"queryPlayer[playerid][Weapon2]);
        
    format(querysizeof(query), "%sWeapon2a=%d,"queryPlayer[playerid][Weapon2a]);
        
    format(querysizeof(query), "%sWeapon3=%d,"queryPlayer[playerid][Weapon3]);
        
    format(querysizeof(query), "%sWeapon3a=%d,"queryPlayer[playerid][Weapon3a]);
        
    format(querysizeof(query), "%sWeapon4=%d,"queryPlayer[playerid][Weapon4]);
        
    format(querysizeof(query), "%sWeapon4a=%d,"queryPlayer[playerid][Weapon4a]);
        
    format(querysizeof(query), "%sWeapon5=%d,"queryPlayer[playerid][Weapon5]);
        
    format(querysizeof(query), "%sWeapon5a=%d,"queryPlayer[playerid][Weapon5a]);
        
    format(querysizeof(query), "%sWeapon6=%d,"queryPlayer[playerid][Weapon6]);
        
    format(querysizeof(query), "%sWeapon6a=%d,"queryPlayer[playerid][Weapon6a]);
        
    format(querysizeof(query), "%sWeapon7=%d,"queryPlayer[playerid][Weapon7]);
        
    format(querysizeof(query), "%sWeapon7a=%d,"queryPlayer[playerid][Weapon7a]);
        
    format(querysizeof(query), "%sWeapon8=%d,"queryPlayer[playerid][Weapon8]);
        
    format(querysizeof(query), "%sWeapon8a=%d,"queryPlayer[playerid][Weapon8a]);
        
    format(querysizeof(query), "%sWeapon9=%d,"queryPlayer[playerid][Weapon9]);
        
    format(querysizeof(query), "%sWeapon9a=%d,"queryPlayer[playerid][Weapon9a]);
        
    format(querysizeof(query), "%sWeapon10=%d,"queryPlayer[playerid][Weapon10]);
        
    format(querysizeof(query), "%sWeapon10a=%d,"queryPlayer[playerid][Weapon10a]);
        
    format(querysizeof(query), "%sWeapon11=%d,"queryPlayer[playerid][Weapon11]);
        
    format(querysizeof(query), "%sWeapon11a=%d,"queryPlayer[playerid][Weapon11a]);
        
    format(querysizeof(query), "%sWeapon12=%d,"queryPlayer[playerid][Weapon12]);
        
    format(querysizeof(query), "%sWeapon12a=%d,"queryPlayer[playerid][Weapon12a]);
        
    format(querysizeof(query), "%sBarterSkil=%d,"queryPlayer[playerid][pBarterSkill]);
        
    format(querysizeof(query), "%sSurvSkill=%d,"queryPlayer[playerid][pSurvSkill]);
        
    format(querysizeof(query), "%sWeapSkill=%d,"queryPlayer[playerid][pWeapSkill]);
        
    format(querysizeof(query), "%sMedSkill=%d,"queryPlayer[playerid][pMedSkill]);
        
    format(querysizeof(query), "%sRepSkill=%d,"queryPlayer[playerid][pRepSkill]);
        
    format(querysizeof(query), "%sGuardClothes=%d"queryPlayer[playerid][pGuardClothes]);
        
    format(querysizeof(query), "%s WHERE Name='%s'"queryPlayer[playerid][pName]);
        
    mysql_tquery(connectionHandle,query"","");


        
    query "UPDATE `accounts` SET ";
        for(new 
    iINVNUMBERS/2-1i++)
            
    format(querysizeof(query), "%sPlayerInv_%d=%d,"queryi+1Player[playerid][pPlayerInv][i]);
        
    format(querysizeof(query), "%sPlayerInv_%d=%d"queryINVNUMBERS/2Player[playerid][pPlayerInv][INVNUMBERS/2-1]);
        
    format(querysizeof(query), "%s WHERE Name='%s'"queryPlayer[playerid][pName]);
        
    mysql_tquery(connectionHandle,query"","");


        
    query "UPDATE `accounts` SET ";
        for(new 
    i=INVNUMBERS/2INVNUMBERS-1i++)
            
    format(querysizeof(query), "%sPlayerInv_%d=%d,"queryi+1Player[playerid][pPlayerInv][i]);
        
    format(querysizeof(query), "%sPlayerInv_%d=%d"queryINVNUMBERSPlayer[playerid][pPlayerInv][INVNUMBERS-1]);
        
    format(querysizeof(query), "%s WHERE Name='%s'"queryPlayer[playerid][pName]);
        
    mysql_tquery(connectionHandle,query"","");


        
    query "UPDATE `accounts` SET ";
        for(new 
    iIDKVESTi++)
        {
            
    format(querysizeof(query), "%sSaveKvest_%d=%d,"queryi+1Player[playerid][pSaveKvest][i]);
        }
        for(new 
    i20i++)
        {
            
    format(querysizeof(query), "%sPlayerInv_%d=%d,"queryi+1Player[playerid][pPlayerGMP][i]);
        }
        
    format(querysizeof(query), "%sOtkatgun=%d,"queryPlayer[playerid][pOtkatgun]);
        
    format(querysizeof(query), "%sHeadValue=%d,"queryPlayer[playerid][pHeadValue]);
        
    format(querysizeof(query), "%sFishki=%d,"queryPlayer[playerid][pFishki]);
        
    format(querysizeof(query), "%sTimequest=%d,"queryPlayer[playerid][pTimequest]);
        
    format(querysizeof(query), "%sInfoquest=%d,"queryPlayer[playerid][pInfoquest]);
        
    format(querysizeof(query), "%sNaruch=%d,"queryPlayer[playerid][pNaruch]);
        
    format(querysizeof(query), "%sPame='%s',"queryPlayer[playerid][pPame]);
        
    format(querysizeof(query), "%sGul=%d"queryPlayer[playerid][pGul]);
        
    format(querysizeof(query), "%s WHERE Name='%s'"queryPlayer[playerid][pName]);
        
    mysql_tquery(connectionHandle,query"","");
        return 
    1;


    Чем больше спецификаторов в строке и чем больше строк, тем нереальней становится нормальная работа с кодом. И дело тут не в привычке, а в том, что довольно трудно сопоставить 13 спецификатор из строки какой-то определённой переменной, ибо приходится по всему экрану глазами водить в поисках нужных данных.
    Ну это уже совсем крайность. Понятное дело, в таком случае процесс подсчёта будет слишком трудоёмким, с формулами или без. Но если нужно проконтролировать расход стека, проще рассчитать всё опытным путём: специально составить аккаунт с данными, занимающими в строковом виде больше всего символов, и посмотреть длину сформатированной строки. А потом оставить пару комментариев в этой функции и в структуре pInfo для напоминания, что нужно пересчитать размер форматного буфера при изменении структуры или набора сохраняемых данных, и заодно закомментировать где-нибудь рядом тестовый набор данных, чтобы не составлять его каждый раз заново.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Опять же, ты довольно однобоко рассматриваешь альтернативы :) Но об этом уже выше сказал
    А здесь-то я что не так сделал?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #73
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Если рассматривать ручной подсчёт с использованием формул, то разница между таким способом и описываемым мной сводится лишь к явному объявлению форматной строки в виде поименованного массива и использованию sizeof для автоматического подсчёта его размера.
    Ну вот именно поэтому мне данный метод и не нравится. Особенно когда, например, массив объявляют в начале команды, а format, гд массив используется, находится в середине или конце. Не знаю как остальным, но мне это доставляет дикие неудобства, ибо приходится не просто водить взглядом по одной строке, а пол экрана приходится контролировать и держать в памяти примерное расположение нужных частей кода.



    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Ну это уже совсем крайность. Понятное дело, в таком случае процесс подсчёта будет слишком трудоёмким, с формулами или без.
    Без отдельного массива всё будет более наглядно, если и сам запрос в порядок привести и форматирование более адекватно прописать. Ну или делать так, как я в статье о системе аккаунтов расписывал: для каждой переменной свой format, подсчёт размера для каждого format отдельно (оставляя комментарий о том, сколько занимает сам текст и сколько занимают данные, что в текст вставляются) и, собственно, составление одной большой формулы, в которой будут перечислены все строки по отдельности
    PHP код:
    stock SaveAccount(playerid

        new 
            
    query_string[(21) + (16+10)+ (20+MAX_PLAYER_NAME-4) + (16+MAX_PLAYER_PASSWORD) + 1] = "UPDATE `accounts` SET";// (21) 
            // Сначала те части запроса, которые никогда не будут меняться ( "UPDATE `accounts` SET" и "%s WHERE `id` = '%d'" )
            // А потом уже все остальные, начиная с верхнего "%s `player_name` = '%s'," и дальше

        
    format(query_stringsizeof(query_string), "%s `player_name` = '%s',"query_stringpInfo[playerid][pName]);// (20+MAX_PLAYER_NAME-4) 
        
    format(query_stringsizeof(query_string), "%s `password` = '%s'"query_stringpInfo[playerid][pPassword]);// (16+MAX_PLAYER_PASSWORD) 

        
    format(query_stringsizeof(query_string), "%s WHERE `id` = '%d'"query_stringpInfo[playerid][pID]);// (16+10) 
        
    mysql_function_query(mysql_connect_IDquery_stringfalse""""); 
        return 
    1

    Такой подход, конечно, не самый лучший в плане производительности и для миллисекундодрочеров не пойдёт, но, как по мне, он является самым гибким и легко изменяемым для строк, которые целиком состоят из форматирования, ибо благодаря комментариям более наглядно видно какую часть формулы нужно изменять и можно без лишних трудностей добавлять/убирать дополнительные строки в запросе, не рискуя при этом удалить что-то лишнее или поместить добавленную переменную не на то место, на котором находится спецификатор в строке (может тоже статью написать на эту тему, лол).

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    А здесь-то я что не так сделал?
    Ну я имел ввиду то, что ты опять сравниваешь лишь описанный тобой метод и ручной подсчёт на калькуляторе, забывая о других альтернативах. Это странно выглядит в пункте, который раскрывает плюсы и минусы описываемого тобой метода. Как по мне, этот пункт подразумевает сравнение со всеми альтернативами (ну или хотя бы более-менее распространёнными), а не только с одной из самых плохих.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Правда, не уверен, что "ручной подсчёт" является самым подходящим названием, но пока что оставлю так.
    Ну, по сути, это ручной подсчёт с составлением формулы же. То, что, например, я использую для подсчёта возможности редактора, не говорит ни о чём, ибо это, скорее, просто упрощение процесса ручного подсчёта, как и в случае с использованием калькулятора вместо самостоятельного подсчёта.
    Хотя даже с использованием функции редактора я сам потом ещё правлю результат, убирая учёт спецификаторов и спецсимволов, дабы формула была более компактной
    Последний раз редактировалось DeimoS; 09.05.2017 в 16:07.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. #74
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну вот именно поэтому мне данный метод и не нравится. Особенно когда, например, массив объявляют в начале команды, а format, гд массив используется, находится в середине или конце. Не знаю как остальным, но мне это доставляет дикие неудобства, ибо приходится не просто водить взглядом по одной строке, а пол экрана приходится контролировать и держать в памяти примерное расположение нужных частей кода.
    Если должным образом назвать массивы с форматными строками, то не придётся запоминать, где и что лежит - всё будет понятно из названия.
    Например, в том же случае с форматированием запроса можно назвать форматные строки "fmt_str_pname", "fmt_str_ppasshash", "fmt_str_plevel" и т.п.
    Но я всё же добавил в недостатки вынесение форматной строки в отдельный массив.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    может тоже статью написать на эту тему, лол
    Если в ней описать инструмент для подсчёта длины строк (ты вроде сам говорил, это что-то встроенное в ST3? но только этим вряд ли можно обойтись) и привести конкретные примеры, где этот подход лучше применим, то почему бы и нет?


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну я имел ввиду то, что ты опять сравниваешь лишь описанный тобой метод и ручной подсчёт на калькуляторе, забывая о других альтернативах.
    Так я ж с самого начала написал в том пункте, что он относится и ко всем другим методам подсчёта. -_-
    В принципе то же самое относится и к ручному подсчёту с помощью калькулятора, да и к любому другому методу подсчёта вообще.
    И я так понимаю, сия претензия была именно к этому пункту, раз ты процитировал именно его.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #75
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Если должным образом назвать массивы с форматными строками, то не придётся запоминать, где и что лежит - всё будет понятно из названия.
    Например, в том же случае с форматированием запроса можно назвать форматные строки "fmt_str_pname", "fmt_str_ppasshash", "fmt_str_plevel" и т.п.
    Но я всё же добавил в недостатки вынесение форматной строки в отдельный массив.
    Не, речь не о том, что непонятно откуда берётся массив и как его найти. Речь о том, что, например, для сверки положения каждого спецификатора с положением переменной для этого спецификатора нужно, в лучшем случае, по всему экрану взглядом водить, а может даже и вообще скроллить код, ибо массив и format разделяет большое число строк.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 
Страница 8 из 8 ПерваяПервая ... 6 7 8

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •