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

Тема: стринги

  1. #1
    Аватар для John_Smith (Scripter)
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.01.2015
    Сообщений
    36
    Репутация:
    -1 ±

    стринги

    Всем привет, я с одним знакомым долго спорил что лучше использовать 1 глобальный стринг для каждого игрока с максимальным размером или же создавать разные стринги с разными размерами в разных пабликах?
    Приведу пример:
    В моем случае создаем массив с 1024 размером для каждого игрока
    Код:
    new string[MAX_PLAYERS][1024];
    И без проблем используем его во всем моде пример:
    Код HTML:
    format(string[playerid], 33, "Hello, State, I'm %s", name(playerid));
    SendClientMessageToAll(-1, string[playerid]);
    и так далее по всему моду!

    В случае моего знакомого мы должны создать в каждом паблике локальные массивы с разными размерами и использовать их, только там где мы их создали
    Приведу пример:
    Код:
    public OnPlayerText(playerid, text[])
    {
        new string[33];
        format(string, sizof(string), "Hello, State, I'm %s:%s", name(playerid),text));
        SendClientMessageToAll(-1, string);
        return false;
    }
    и т. д. мы создаем разные массивы с разными размерами в разных пабликах, а ведь мы знаем В PAWN изначальный размер стека (STK) - 16384 байт, не больше, не меньше
    и в моде не один такой массив

    если посчитать, у меня установлена 200 maxplayers, значит максимально 200*1024
    и в случае моего друга, в моде примерно 30 пабликов которых мы используем, и создаем не 1 массив в каждом паблике примерно возьмем 10, ставим размер всегда по разному так что возьмем 256 ок 30*10*256*200(игроки которые вызывают эти функции)

    Ну результат очевиден...
    Я хотел бы узнать ваши мнение что вы считаете об этом, может быть я ошибаюсь где то? Какой бы вариант вы выбрали бы?
    Последний раз редактировалось John_Smith (Scripter); 16.03.2015 в 02:43.

  2. #2
    Аватар для Maranzalla
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Адрес
    Moscow
    Сообщений
    108
    Репутация:
    -1 ±
    В твоем случае будет
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        
    format(string[playerid], 33"Hello, State, I'm %s:%s"name(playerid),text);
        
    SendClientMessageToAll(-1string[playerid]);
        return 
    false;

    вместо
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        new 
    string[33];
        
    format(stringsizof(string), "Hello, State, I'm %s:%s"name(playerid),text);
        
    SendClientMessageToAll(-1string);
        return 
    false;

    Последний раз редактировалось Maranzalla; 16.03.2015 в 02:50. Причина: добавил сравнение

  3. #3
    Аватар для John_Smith (Scripter)
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.01.2015
    Сообщений
    36
    Репутация:
    -1 ±
    ну да, в любом паблике можно юзать,

    Код:
    public OnPlayerText(playerid, text[])
    {
        new string[33];
        format(string, sizof(string), "Hello, State, I'm %s:%s", name(playerid),text));
        SendClientMessageToAll(-1, string);
        return false;
    }
    понял намек ша исправлю
    Последний раз редактировалось John_Smith (Scripter); 16.03.2015 в 02:43.

  4. #4
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    К примеру я объявляю локальный стриг при использовании какой-либо локальной функции, а если глобальная - глобальную.
    Например, в качестве локальной функции я приведу простой пример форматирования (format), а глобальная, то переменная MySQL, которая участвует во всех операциях, связанные с MySQL. Хотя и ее можно использовать локально.
    Я могу и ошибаться, я жи не профессионал :D

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

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Вообще лучше использовать локальные переменные!
    Объясню почему, при одновременном использовании глобальных переменных в разных функциях, есть риск того что данные будут перезаписаны и может произойти ошибка, вплоть до того что сервер может отключится, и вы будете долго искать почему такое происходит.
    Локальные переменные же, создаются каждый раз когда вызывается функция, а после того как функция выполнила свое действие, данные хранящиеся в переменной как и сама переменная уничтожаются, пример:

    PHP код:
    public func1(n) {
       new 
    1// Создали локальную переменную
       
    printf("1 + %d = %d",n,x+n); // Функция выполнила действие
    }
    // Функция func1 уничтожила переменную x

    public func2(n) {
       
    printf("1 + %d = %d",n,x+n); // Ошибка, компилятор не знает о существовании x


  6. #6
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Вообще лучше использовать локальные переменные!
    Объясню почему, при одновременном использовании глобальных переменных в разных функциях, есть риск того что данные будут перезаписаны и может произойти ошибка, вплоть до того что сервер может отключится, и вы будете долго искать почему такое происходит.
    Локальные переменные же, создаются каждый раз когда вызывается функция, а после того как функция выполнила свое действие, данные хранящиеся в переменной как и сама переменная уничтожаются, пример:

    PHP код:
    public func1(n) {
       new 
    1// Создали локальную переменную
       
    printf("1 + %d = %d",n,x+n); // Функция выполнила действие
    }
    // Функция func1 уничтожила переменную x

    public func2(n) {
       
    printf("1 + %d = %d",n,x+n); // Ошибка, компилятор не знает о существовании x

    Недолеко от истины ушел :)

  7. #7
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Локально создавайте массивы, если статистика игрока: Убийства, смерти, уровень администратирования, то глобально.

  8. Пользователь сказал cпасибо:
    John_Smith (Scripter) (16.03.2015)
  9. #8
    Аватар для John_Smith (Scripter)
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.01.2015
    Сообщений
    36
    Репутация:
    -1 ±
    Спасибо всем за ответы

  10. #9
    Аватар для Maranzalla
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Адрес
    Moscow
    Сообщений
    108
    Репутация:
    -1 ±
    Цитата Сообщение от Darge Посмотреть сообщение
    К примеру я объявляю локальный стриг при использовании какой-либо локальной функции, а если глобальная - глобальную.
    Например, в качестве локальной функции я приведу простой пример форматирования (format), а глобальная, то переменная MySQL, которая участвует во всех операциях, связанные с MySQL. Хотя и ее можно использовать локально.
    Я могу и ошибаться, я жи не профессионал :D
    Самый весомый аргумент

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

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Сообщений
    121
    Репутация:
    3 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Вообще лучше использовать локальные переменные!
    Объясню почему, при одновременном использовании глобальных переменных в разных функциях, есть риск того что данные будут перезаписаны и может произойти ошибка, вплоть до того что сервер может отключится, и вы будете долго искать почему такое происходит.
    Локальные переменные же, создаются каждый раз когда вызывается функция, а после того как функция выполнила свое действие, данные хранящиеся в переменной как и сама переменная уничтожаются, пример:

    PHP код:
    public func1(n) {
       new 
    1// Создали локальную переменную
       
    printf("1 + %d = %d",n,x+n); // Функция выполнила действие
    }
    // Функция func1 уничтожила переменную x

    public func2(n) {
       
    printf("1 + %d = %d",n,x+n); // Ошибка, компилятор не знает о существовании x

    Риск перезаписи данных? Хм, а разве в samp не "однозадачность"? Пока не закончит выполнение предыдущая функция/цикл и т.д - не будут выполняться следующие, соответственно, каким образом может возникнуть перезапись данных? Если использовать strcat, конечно, будет ужас, да и то это очень просто решается - strdel перед использованием. Или же я не прав и всё же лучше использовать "локальные массивы"?

 

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

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

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

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

Ваши права

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