Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Всё о Stock

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,439
    Репутация:
    1920 ±

    Всё о Stock

    Я вас категорически приветствую, друзья!
    Сегодня я постараюсь объяснить вам, что же за зверь такой, этот stock, и с чем его едят. И сделать это я постараюсь на человеческом языке, дабы всем было понятно. Начнём.


    Определение Stock:

    Stock - Маркер компилятора, указывающий компилятору на исключение кода функции из конечного amx файла, если функция не используется в коде скрипта © DeimoS
    Иными словами код функции или переменные, созданные с использованием маркера "stock", не будут включены в скомпилированную версию мода, если они не будут использованы в моде.
    Если же создать функцию/переменную с использованием других маркеров, компилятор включит их в финальную версию, сигнализирует о их бесполезности и AMX машина (сервер) выделит для них память




    Способы применения Stock:

    1. Переменные:
      Выглядит это так
      Целочисленный тип Вещественный тип Строка Одномерный массив Двумерный массив


      new
      PHP код:
      new variable
      PHP код:
      new Float:variable
      PHP код:
      new variable[10]; 
      PHP код:
      new variable[2] = 
      {
      17}; 
      PHP код:
      new variable[2][1] = 
      { {
      8},  {15} }; 



      stock
      PHP код:
      stock variable
      PHP код:
      stock Float:variable
      PHP код:
      stock variable[10]; 
      PHP код:
      stock variable[2] = 
      {
      17}; 
      PHP код:
      stock variable[2][1] = 
      { {
      8},  {15} }; 

      Использование переменных в stock точно такое же, как и использование переменных в new. В чём же различие, спросите Вы?

      А различие именно в том, что stock не регистрируется в памяти сервера. То есть, если переменная объявлена через stock, но в коде она нигде не используется, компилятор автоматически удалит её при компиляции (имеется ввиду то, что в .amx варианте вашего кода этой переменной не будет). Следовательно лишней памяти сервер не будет выделять для этой переменной. Данное правило распространяется и на функции, так что запоминаем сразу (ниже упоминаний об этом не будет).
      Но стоит помнить, что Вы никак не узнаете, используется переменная или нет, без ручного поиска кода, в котором используется эта переменная. Ибо, в случае с stock, при компилировании данная ошибка отображаться не будет:
      PHP код:
      warning 204symbol is assigned a value that is never used"%s" 

    2. Функции:

      С помощью stock Вы можете единственный раз написать определённый код и после вызывать его всего лишь написав код вызова stock. Но и не только. С помощью stock Вы можете сильно облегчить свою жизнь при написании различных сложных функций :) И ниже я попробую привести несколько примеров кода для того, чтобы Вы поняли о чём я говорю :)

      • Создание stock:
        Новый stock создаётся вне других функций (public/stock). То есть, точно так же, как и public, но без forward.

        Пример создания stock:
        PHP код:
        stock StockName(arguments)
        {
            return 
        1;

        Где:
        StockName - название нашего stock
        arguments - название аргументов, в которые будет помещена информация для обработки. Названия могут быть любыми, как и в случае с переменными. Про ограничение на количество этих аргументов в одном stock мне не известно. Если Вы об это что-то знаете, просьба отписаться с предоставлением каких-либо доказательств =) Но уж точно не менее 8 аргументов использовать можно (личный опыт :) )

      • Пример использования stock:
         Пример 1 (помещение определённого кода и последующее его использование с помощью stock)
        Допустим, у нас есть диалог, который мы используем в нескольких участках кода (одинаковый). Чтобы каждый раз не писать его, мы можем создать stock с ним
        PHP код:
        stock ShowDialog(id)
        {
            new 
        string[1001];//Да, текст занимает 1001 ячейку. Точнее 1000 ячеек, но нужно же ещё выделить одну для нулевого символа =) И теперь представьте, что если такой диалог нужно вызывать в нескольких местах, каждый раз придется выделять 1001 ячейку. То есть, при создании двух таких переменных, Вы уже выделите 2002 ячейки, при создании трёх - 3003 и т.д. Согласитесь, нерационально это =) (Для самых внимательных: Да, можно создать глобальную переменную. Но зачем забивать мод кучей одинаковых строк, когда можно написать их 1 раз?)
            
        format(stringsizeof(string), "Тут длинный текст, который будет занимать много места в коде. Да и для его хранения придется создавать каждый раз переменную, а это трата памяти. Зачем нам это? Лучше раз создать stock, в котором 1 раз объявить переменную, и уже работать с этим stock");
            
        format(stringsizeof(string), "%sТут длинный текст, который будет занимать много места в коде. Да и для его хранения придется создавать каждый раз переменную, а это трата памяти. Зачем нам это? Лучше раз создать stock, в котором 1 раз объявить переменную, и уже работать с этим stock",string);
            
        format(stringsizeof(string), "%sТут длинный текст, который будет занимать много места в коде. Да и для его хранения придется создавать каждый раз переменную, а это трата памяти. Зачем нам это? Лучше раз создать stock, в котором 1 раз объявить переменную, и уже работать с этим stock",string);
            
        format(stringsizeof(string), "%sТут длинный текст, который будет занимать много места в коде. Да и для его хранения придется создавать каждый раз переменную, а это трата памяти. Зачем нам это? Лучше раз создать stock, в котором 1 раз объявить переменную, и уже работать с этим stock",string);
            
        ShowPlayerDialog(id0DIALOG_STYLE_MSGBOX"Названия диалога"string"Кнопа 1""Кнопа 2");
            return 
        1;

        Примечание: Хоть для отображения диалога требуется аргумент "playerid", в stock мы указали имя аргумента "id". Поэтому в ShowPlayerDialog мы должны указать именно "id", а уже при вызове stock мы присвоим значение аргументу "id" значение аргумента "playerid".
        Обратите внимание, что "id", при создании stock, я написал лишь для того, чтобы Вы поняли, что имя аргумента может быть любое. Вы можете сразу написать "playerid" и в ShowPlayerDialog использовать "playerid". А можете написать "Deimos_noob" и так же использовать в диалоге уже "Deimos_noob". Главное не забывайте менять название аргумента в нативных функциях (кликабельно) внутри stock на такое, какое Вы указали при создании stock (примером является "id" в создании stock и "playerid" в ShowPlayerDialog). Но менять название нужно именно в тех аргументах, значение которых Вы будете "доставлять" в код, находящийся в stock, при вызове этого stock. В этом примере это был "palyerid" и ниже Вы это увидите


        Ну и создадим команду для отображения этого диалога
        PHP код:
        if (strcmp("/showmydialogue"cmdtexttrue10) == 0)
        {
            
        SendClientMessage(playerid,0xFF0000FF,"А вот и диалог");
            
        ShowDialog(playerid);//Вот тут мы указали откуда именно брать значение для "id". В данном случае в "id" поместится значение ID игрока. Но это может быть и не ID, а та информация, которая вам нужна. Ниже я приведу примеры
            
        return 1;

        Ну и при коннекте игрока вызовем диалог
        PHP код:
        public OnPlayerConnect(playerid)
        {
            
        ShowDialog(playerid);
            return 
        1;


         Пример 2 (вывод целых чисел с помощью stock)
        А теперь попробуем создать команду для передачи денег от одного игрока к другому с помощью stock. Сначала создадим stock с тремя аргументами, в которые запишем ID обоих игроков и сумму передачи денег
        PHP код:
        stock PlayerMoneyToPlayer(player1player2money)//Опять же, имена аргументов выбираете только Вы. Я создаю такие только для того, чтобы Вы чётко видели что и где менять
        {
            new 
        string[71];//57 символов занимает весь текст. Максимальная сумма денег на руках игрока не может превышать 11 символов, поэтому к 57 прибавляем 11 и выделяем 3 ячейки для хранения трёхзначного ID игрока (не видел онлайн в 1000 человек ещё, так что 3 символа хватит). 57 + 11 + 3 = 71 
            
        GivePlayerMoney(player1,-=money);//Отнимем сумму у игрока, который решил передать деньги
            
        GivePlayerMoney(player2,+=money);//Выдадим деньги игроку, которому первый игрок решил передать деньги
            
        format(string,sizeof(string),"Вы передали %d$ игроку с ID %d"moneyplayer2);
            
        SendClientMessage(player1,0xFFFFFFFF,string);//Оповестим первого игрока о успешной передаче денег
            
        format(string,sizeof(string),"Вам передали %d$. ID игрока, передавшего вам деньги - %d"moneyplayer2);
            
        SendClientMessage(player2,0xFFFFFFFF,string);//Оповестим второго игрока о успешном получении денег
            
        return 1;//Отсылаем серверу сигнал о том, что всё прошло успешно и можно продолжать выполнять код после stock.

        И теперь создадим команду, в которой и присвоим нужные значения для аргументов stock
         Код, требуемый для правильной работы strtok
        Этот код нужно вставлять в самое начало паблика OnPlayerCommandText, если его нет. Без него функция srtok работать не будет
        PHP код:
        new cmd[128], idx[128], tmp[128];//Создадим переменные, которые нам понадобятся для дальнейшей работы с функцией strtok
        cmd strtok(cmdtextidx);//Приравняем нашу переменную к значению strtok и теперь, при создании команду, будем использовать не cmdtext, а cmd (иначе strtok работать не будет). 

        PHP код:
        if (strcmp("/pay"cmdtrue10) == 0)
        {
            
        tmp strtok(cmdtextidx);//strtok начнёт искать символы после пробела, которые игрок введёт при использовании команды
            
        if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000AA,"Вы не ввели ID игрока");//Если игрок не написал ничего после первого пробела - оповестим его об этом и оборвём выполнение команды
            
        new giveplayerid strval(tmp);//strval преобразует введённые игроком данные в число. Если игрок введёт текст, strval выдаст значение 0. Запишем в giveplayerid ID игрока, которому надо передать деньги
            
        if(playerid == giveplayerid) return SendClientMessage(playerid,0xFF0000AA,"Вы ввели свой ID. Себе деньги передать нельзя");//Если игрок ввёл свой ID, оповестим его об этом и не дадим перевести деньги (это делает return)
            
        if(!IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid,0xFF0000AA,"Данного игрока нет в сети");//Если игрок ввёл ID игрока, которого нет на сервере, оповестим его об этом и не дадим перевести деньги
            
        tmp strtok(cmdtextidx);//Дадим сигнал моду для поиска ещё одного пробела
            
        if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000AA,"Вы не ввели сумму для передачи");//Если игрок не написал ничего после второго пробела - оповестим его об этом и оборвём выполнение команды
            
        new pmoney strval(tmp);//Запишем сумму, которую игрок введёт после ввода IP
            
        if(pmoney GetPlayerMoney(playerid)) return SendClientMessage(playerid,0xFF0000AA,"У вас недостаточно денег на руках для передачи");//Если денег у игрока меньше чем он ввёл в команду, оповестим его об этом и прервём выполнение кода
            //Теперь пора вызывать наш stock. После команды будет объяснение именно этого кода
            
        PlayerMoneyToPlayer(playeridgiveplayeridpmoney);//Передаём деньги с помощью stock
            
        return 1;

        "playerid" хранит значение ID игрока, который ввёл команду и передаст это значение аргументу "player1" из нашего stock
        "giveplayerid" имеет значение ID игрока, которому надо передать деньги и передаст это значение аргументу "player2" из нашего stock
        "pmoney" имеет значение суммы денег для передачи и передаст это значение аргументу "money" из нашего stock
        Если кто-то не понял то, как я определил это всё, объясню по другому. Ниже будет предоставлен сам stock (таким, каким мы его создали) и способ вызова этого stock. Одинаковым цветом я выделю те аргументы, значения которых передаются от вызова stock к самому stock

        stock PlayerMoneyToPlayer(player1, player2, money)
        PlayerMoneyToPlayer(playerid, giveplayerid, pmoney);

        То есть, аргументы отделяют друг от друга запятыми. Следовательно, при вызове stock, нам нужно расположить аргументы с данными в таком порядке, чтобы нужные данные присвоились нужному аргументу в stock


         Пример 3 (вывод текста с помощью stock)
        В данном примере я покажу вам как передать определённый текст с помощью stock на примере команды личных сообщений. Данный stock будет содержать уже аж 5 аргументов, два из которых будут содержать ники игроков, два будут содержать ID и один будет содержать текст. Да, с помощью strok можно и такое :)
        PHP код:
        stock PrivateMessage(name1[], name2[], playeridgiveplayeridtext[])//name1[] и name2[] будут хранить ники, playerid и giveplayerid будут хранить ID игроков, а text[] - текст. Эти скобки - "[]" - означают, что в аргументе будет хранится текст. Все типы аргументов будут описаны ниже
        {
            new 
        Message[169];//Создадим массив, в котором будет хранится текст
            
        format(Message,sizeof(Message),">> %s[%d]: %s",name2,giveplayerid,text);//Оповестим первого игрока таким сообщением о том, что сообщение доставлено второму игроку.
            //Заметьте, что тут мы уже используем name2 и text без скобок. Так же и с остальными типами аргументов (о которых расскажу ниже)
            
        SendClientMessage(playerid,0xFF0000FF,Message);
            
        format(Message,sizeof(Message),"<< %s[%d]: %s",name1,playerid,text);//Оповестим второго игрока таким сообщением о том, что первый игрок прислал ему сообщение
            
        SendClientMessage(giveplayerid,0xFF0000FF,Message);
            return 
        1;

        Ну и теперь сама команда
         Код, требуемый для правильной работы strtok
        Этот код нужно вставлять в самое начало паблика OnPlayerCommandText, если его нет. Без него функция srtok работать не будет
        PHP код:
        new cmd[128], idx[128], tmp[128];//Создадим переменные, которые нам понадобятся для дальнейшей работы с функцией strtok
        cmd strtok(cmdtextidx);//Приравняем нашу переменную к значению strtok и теперь, при создании команду, будем использовать не cmdtext, а cmd (иначе strtok работать не будет). 

        PHP код:
        if(strcmp(cmd"/pm"true) == 0)
        {
            new 
        PlayerName[1][MAX_PLAYER_NAME]);//Создадим двумерный массив для записи ников обоих игроков
            
        tmp strtok(cmdtextidx);//strtok начнёт искать символы после пробела, которые игрок введёт при использовании команды
            
        if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000AA,"Вы не ввели ID игрока");//Если игрок не написал ничего после первого пробела - оповестим его об этом и оборвём выполнение команды
            
        new giveplayerid strval(tmp);//strval преобразует введённые игроком данные в число. Если игрок введёт текст, strval выдаст значение 0. Запишем в giveplayerid ID игрока, которому надо передать деньги
            
        GetPlayerName(playeridPlayerName[0], MAX_PLAYER_NAME);//Запишем ник первого игрока
            
        GetPlayerName(giveplayeridPlayerName[1], MAX_PLAYER_NAME);//Запишем ник второго игрока
            
        if(playerid == giveplayerid) return SendClientMessage(playerid,0xFF0000AA,"Вы ввели свой ID. Себе писать в личку нельзя");//Если игрок ввёл свой ID, оповестим его об этом и не дадим написать личное сообщение (это делает return)
            
        if(!IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid,0xFF0000AA,"Данного игрока нет в сети");//Если игрок ввёл ID игрока, которого нет на сервере, оповестим его об этом и не дадим перевести деньги
            //Далее идёт код, который "ищет" введённый игроком текст
            
        new length strlen(cmdtext);
            while ((
        idx length) && (cmdtext[idx] <= ' '))
            {
                
        idx++;
            }
            new 
        offset idx;
            new 
        result[64];
            while ((
        idx length) && ((idx offset) < (sizeof(result) - 1)))
            {
                
        result[idx offset] = cmdtext[idx];
                
        idx++;
            }
            
        result[idx offset] = EOS;
            
        //Поиск текста окончен
            
        if(!strlen(result)) return SendClientMessage(playerid,0xFF0000AA,"Вы не ввели текст сообщения");//Если игрок не написал ничего - оповестим его об этом и оборвём выполнение команды
            
        if(strlen(result)>128) return SendClientMessage(playerid,0xFF0000AA,"Максимальная длинна сообщения - 128 символов");//При написании stock, мы создали массив Message. Когда я рассчитывал число ячеек, которые мы выделим для записи текста, я предоставил для текста 128 ячеек. Поэтому сделаем ограничение, дабы текст отобразился корректно
            //Всё, что нужно для формирования "вызова" stock, у нас уже имеется. Теперь делаем сам "вызов"
            
        PrivateMessage(PlayerName[0], PlayerName[1], playeridgiveplayerid, (result));//Формируем и отправляем запрос
            
        return 1;


      • Типы данных для аргументов:
        У аргументов stock, как и аргументов public, есть типы данных. Эти типы точно такие же, как и у переменных. Всего 4 типа:

        1. Вещественный (дробное число)
           Пример
          PHP код:
          stock StockName(Float:arguments
          "Float:arguments"
        2. Логический (bool. То есть true/false)
           Пример
          PHP код:
          stock StockName(bool:arguments
          "bool:arguments"
        3. Целочисленный (целые числа)
           Пример
          PHP код:
          stock StockName(arguments
          "arguments"
        4. Строковый (символы, то бишь текст)
           Пример
          PHP код:
          stock StockName(arguments[]) 
          "arguments[]"

          Примечание: Повторюсь, все типы данных работают так же, как и у переменных. Следовательно, использовать их нужно без аргументов ("Float","[]"."bool:"). Пример имеется в примере 3 (извиняюсь за тавтологию).
      • Прочие виды аргументов:
        1. Ссылка (&):
          Данный вид возвращает значения аргумента, получившиеся после выполнения кода функции. (аналогично "return")
           Обозначение и пример
          PHP код:
          stock StockName(&arguments
          "&arguments"


           Пример
          PHP код:
          stock Calculator(&n_1, &n_2)//Создадим новый stock, в котором оба аргумента будут являться ссылками
          {
              
          n_1 += 3;//К значению первого аргумента прибавим тройку
              
          n_2 -= 17;//От значения второго аргумента отнимем семнадцать
              
          return 1;
          }
          //Выполнение кода окончено и все аргументы, созданные как ссылки, вернут свои значения в место вызова функции 
          PHP код:
          main()
          {
              new 
          num[2];
              
          num[0] = 10;
              
          num[1] = 20;
              
          printf("\nДо вызова\nЗначение[0] = %d\nЗначение[1] = %d\n",num[0],num[1]);//До вызова стока значения переменных будут равны заданным ранее значениям
              
          Calculator(num[0], num[1]);//До вызова переменные будут равны 10 и 20, а после выполнения их значения станут равны 13 и 3
              
          printf("\nПосле вызова\nЗначение[0] = %d\nЗначение[1] = %d\n",num[0],num[1]);//После вызова значения будут уже другими






    На этом всё =)
    Если есть какие-либо вопросы, если что-то непонятно объяснено или есть какие-либо дополнения/исправления для данного урока, прошу написать об этом ниже. Всем постараюсь помочь, все мнения приму к сведению.
    С вами был DeimoS. Спасибо за внимание
    Автор урока - DeimoS
    При копировании данного материала, обязательно указывайте автора и ссылку на данный урок

  2. 22 пользователя(ей) сказали cпасибо:
    #enotya (29.03.2017) BadPawn (12.02.2016) Blood (30.01.2014) codeo (15.06.2014) Daniel_Cortez (29.03.2014) DesmoNd (31.01.2014) DmX (17.04.2014) Elaid (03.11.2014) johnlaw (26.04.2018) KShaddix (20.06.2014) L0ndl3m (30.01.2014) lososnee (28.06.2014) Mike_World (23.12.2016) PETPO (01.09.2015) Profyan (25.02.2016) Prolific (22.03.2016) Saibot (19.10.2016) Salvacore (30.01.2014) Spectrum (20.06.2014) [ForD] (30.01.2014) _lizard (21.02.2016)
  3. #2
    Аватар для Zeror_Dalglish
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    04.06.2014
    Сообщений
    224
    Репутация:
    -1 ±
    Хотелось, бы ещё про паблики что то подобное...
    Последний раз редактировалось L0ndl3m; 23.07.2014 в 12:47. Причина: Зачем копировать весь пост ТС?!

  4. #3
    Аватар для Don1412
    Пользователь

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    6
    Репутация:
    0 ±
    а вот и не все о sotck... хотелось бы увидеть примеры и описание создания функции с переменным количеством аргументов

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,439
    Репутация:
    1920 ±
    Цитата Сообщение от Don1412 Посмотреть сообщение
    а вот и не все о sotck... хотелось бы увидеть примеры и описание создания функции с переменным количеством аргументов
    Эмм, а чем
    PHP код:
    forward FunctionName({Float,_}:...);
    public 
    FunctionName({Float,_}:...) 
    существенно отличается от
    PHP код:
    stock FunctionName({Float,_}:...) 
    Объявляется она так же. Работа с такой функцией идёт тоже так же.
    Лучше уж тогда написать урок о функциях с переменным числом аргументов, нежели пытаться добавить сюда короткое описание, которое больше вопросов создаст
    Связаться со мной в VK можно через личные сообщения этой группы

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

    Steve Pavlina

  6. #5
    Аватар для Don1412
    Пользователь

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    6
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, а чем
    PHP код:
    forward FunctionName({Float,_}:...);
    public 
    FunctionName({Float,_}:...) 
    существенно отличается от
    PHP код:
    stock FunctionName({Float,_}:...) 
    Объявляется она так же. Работа с такой функцией идёт тоже так же.
    Лучше уж тогда написать урок о функциях с переменным числом аргументов, нежели пытаться добавить сюда короткое описание, которое больше вопросов создаст
    ну почему бы так не сделать, я вот и ищу пример такой функции

  7. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,439
    Репутация:
    1920 ±
    Что именно тебя интересует?
    Есть 3 функции:
    numargs() - возвращает число аргументов
    getarg(arg, index = 0) - возвращает значение аргумента (в случае с массивами придётся попотеть, ибо она может вернуть только значение одной ячейки => извлекать значение массива придётся циклом)
    setarg(arg, index=0, value) - установка значения для аргумента
    При объявлении функции в ней можно указать те теги которые применимы к аргументам:
    PHP код:
    stock FunctionName({/*Вот тут*/}:...) 
    Указываются через запятую. Стандартные тэги указываются так:
    _ - Целочисленный тэг
    Float - Вещественный тэг
    bool - Логический тэг
    Для строки/массива тэг указывать не нужно

    Самый незамысловатый пример извлечения значения строки:
    PHP код:
    main()
    {
        
    SomeFunc("DeimoS");
    }

    stock SomeFunc({_}:...)
    {
        new 
    string[10];
        for(new 
    i; ; i++)
        {
            if(
    getarg(0i) == '\0') break;
            
    string[i] = getarg(0i);
        }
        
    printf("%s"string);

    Что ещё хотелось бы узнать? Я просто не знаю из чего тут целый урок вытянуть можно
    Последний раз редактировалось DeimoS; 31.10.2017 в 15:14.
    Связаться со мной в VK можно через личные сообщения этой группы

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

    Steve Pavlina

  8. 2 пользователя(ей) сказали cпасибо:
    Ashmy (30.10.2017) Don1412 (12.02.2016)
  9. #7
    Аватар для Don1412
    Пользователь

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    6
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Что именно тебя интересует?
    Есть 3 функции:
    numargs() - возвращает число аргументов
    getarg(arg, index = 0) - возвращает значение аргумента (в случае с массивами придётся попотеть, ибо она может вернуть только значение одной ячейки => извлекать значение массива придётся циклом)
    setarg(arg, index=0, value) - установка значения для аргумента
    При объявлении функции в ней можно указать те теги которые применимы к аргументам:
    PHP код:
    stock FunctionName({/*Вот тут*/}:...) 
    Указываются через запятую. Стандартные тэги указываются так:
    String - строка/массив
    _ - Целочисленный тэг
    Float - Вещественный тэг
    bool - Логический тэг

    Самый незамысловатый пример извлечения значения строки:
    PHP код:
    main()
    {
        
    SomeFunc("DeimoS");
    }

    stock SomeFunc({String}:...)
    {
        new 
    string[10];
        for(new 
    i; ; i++)
        {
            if(
    getarg(0i) == '\0') break;
            
    string[i] = getarg(0i);
        }
        
    printf("%s"string);

    Что ещё хотелось бы узнать? Я просто не знаю из чего тут целый урок вытянуть можно
    отлично, большое спасибо, довольно толковый форум, нафиг всякие павно-инфо галимые)

  10. #8
    Аватар для Don1412
    Пользователь

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    6
    Репутация:
    0 ±
    PHP код:
    stock SetControlFraction(playerid, {_}:...)
    {
    new Array[
    23];
    for(new 
    0numargs(); i++)
    {
    Array[
    i] = getarg(i);
    ControlDialog[playerid][i] = Array[i];
    SendMe(playerid, -1ControlDialog[playerid][i]);
    }
    return 
    true;
    }
    SetControlFraction(playerid11021); 
    что не так?
    нулевой аргумент(playerid) выводит норм, остальные пустые строки...

  11. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,439
    Репутация:
    1920 ±
    PHP код:
    for(new 0numargs(); i++) 
    на
    PHP код:
    for(new 1numargs(); i++) 
    Ведь нулевой аргумент является известным
    Я бы винил функцию SendMe, ибо весь остальной код выглядит работоспособным
    Связаться со мной в VK можно через личные сообщения этой группы

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

    Steve Pavlina

  12. #10
    Аватар для Don1412
    Пользователь

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    6
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    PHP код:
    for(new 0numargs(); i++) 
    на
    PHP код:
    for(new 1numargs(); i++) 
    Ведь нулевой аргумент является известным
    Я бы винил функцию SendMe, ибо весь остальной код выглядит работоспособным
    SendClientMessage(playerid, -1, ControlDialog[playerid][i]);
    ничего не изменилось...

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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