Оптимизация кода
#41

это функция компилятора(так же как if, switch,goto и т.д.), и если массив динамичный то, конечно, установка значения размера будет во время работы сервера
Reply
#42

Quote:
Originally Posted by Eakwarp [Valakas.ru
]ты правда так думаешь?)
могу доказать!
pawn Code:
public OnPlayerText(playerid,text[])
{
printf("%d",sizeof(text));
return 1;
}
или дальше будем доказывать что компилятор при компелировании знает все размеры массива text, появляющихся при работе сервера?!
Quote:
Originally Posted by [JIeXa
]
это функция компилятора(так же как if, switch,goto и т.д.), и если массив динамичный то, конечно, установка значения размера будет во время работы сервера
вам уважаемый сказки писать надо, советую вам по новой перечитать основы програмирования.
Reply
#43

Quote:
Originally Posted by доки, доки и еще раз доки....
The sizeof operator returns the size of a variable in “elements”. For a
simple (non-compound) variable, the result of sizeof is always 1, because an
element is a cell for a simple variable.

An array with one dimension holds a number of cells and the sizeof operator
returns that number. The snippet below would therefore print “5” at the
display, because the array “msg” holds four characters (each in one cell) plus
a zero-terminator:

Listing: sizeof operator
pawn Code:
new msg[] = "Help"
printf("%d", sizeof msg);
With multi-dimensional arrays, the sizeof operator can return the number
of elements in each dimension. For the last (minor) dimension, an element
will again be a cell, but for the major dimension(s), an element is a sub-array.
In the following code snippet, observe that the syntax sizeof matrix refers
to the major dimension of the two-dimensional array and the syntax sizeof
matrix[] refers to the minor dimension of the array. The values that this
snippet prints are 3 and 2 (for the major and minor dimensions respectively):

Listing: sizeof operator and multidimensional arrays
pawn Code:
new matrix[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } }
printf("%d %d", sizeof matrix, sizeof matrix[]);
The application of the sizeof operator on multi-dimensional arrays is especially
convenient when used as a default value for function arguments.
Quote:
Originally Posted by оттуда же
results in the size in “elements” of the specified variable. For
simple variables and for arrays with a single dimension, an
element is a cell. For multi-dimensional arrays, the result is
the number of array elements in that dimension —append []
to the array name to indicate a lower/more minor dimension.
If the size of a variable is unknown, the result is zero.
When used in a default value for a function argument, the expression
is evaluation at the point of the function call, instead
of in the function definition.
1) Если массив был явно объявлен в скрипте, то его размер известен и не может измениться ==> sizeof вычислится прямо во время компиляции (см. пример из первой цитаты).

2) Если допустим массив передан функции в качестве параметра, то его размер НЕ может быть вычислен (т.к. функции передается всего лишь его адрес) (как в примере с OnPlayerText выше), стало быть его надо указывать явно (например, передавать в качестве дополнительного параметра).

3) Когда sizeof выступает в качестве дефолтного значения одного из аргументов функции (при этом будучи примененным к другому ее аргументу), его значения вычисляетя непосредственно при самом вызове функции (если оно может быть вычислено, см. пункт 2).
Reply
#44

Zeex, во-первых, это русский форум, пишите на русском. В-вторых, что делает данная функция мы знаем, спор бы о том когда она это делает!
И как я уже доказал выше работает она не в момент компелирования, а в во время работы сервера. Также как и if, switch,goto и т.д.
Единственное что исчезает на уровне компилятора это #define и stock
Reply
#45

Все говорят это цифра, цифра. Во первых это константа

Code:
#define number 100
main()
  printf(""#number" %d ", number-1);
Во вторых, это и правда опция копмилятора, уже он делает из неё константу
Code:
number = 99; // Не катит
sizeof(arr) = 99; // Тоже не катит
Reply
#46

sizeof вычисляется не на стадии компиляции, а во время выполнения
sizeof это такой же оператор языка как return, switch, if, циклы и другие.
sizeof это не функция
sizeof можно использовать как константу
sizeof это не переменная

Кто не знал, есть еще схожий оператор tagof

stepmex
На стадии компиляции еще много чего существует, чего позднее нет (: кроме того, что ты перечислил
Reply
#47

Кстати, у компилятора есть ещё несколько подобных функций, например tagof. Я не знаю что она делает, пробовал вывести её в разных форматах, но получал либо -INFINITY, либо символ id 1.
Reply
#48

Quote:
Originally Posted by stepmex
Zeex, во-первых, это русский форум
И что? Это официальная документация

Quote:
Originally Posted by stepmex
В-вторых, что делает данная функция мы знаем, спор бы о том когда она это делает!
И как я уже доказал выше работает она не в момент компелирования, а в во время работы сервера. Также как и if, switch,goto и т.д.
Единственное что исчезает на уровне компилятора это #define и stock
Я дописал сообщение, см. выше

Небольшой пруф для пункта 1 из моего предыдущего поста
Данный код:
pawn Code:
new test_array[1000];
sizeof(test_array);
преобразуется в:
pawn Code:
;$lcl test_array fffff060
stack fffff060
zero.pri
addr.alt fffff060
fill fa0
; line 7
break   ; 2c
const.pri 3e8 // это и есть sizeof(test_array); 3e8 - это 1000 в 16-ричной системе
Reply
#49

Quote:
Originally Posted by JesterX
Кстати, у компилятора есть ещё несколько подобных функций, например tagof. Я не знаю что она делает, пробовал вывести её в разных форматах, но получал либо -INFINITY, либо символ id 1.
tagof возвращает уникальный идентификатор типа переменной, судя по докам

-- поправка --
Reply
#50

Новый пост, т.к. ваще о другом хочу сказать.

Кто знает и использует оператор char ? Это еще один из способов не транжирить память. Кто юзает, знает о чем я.
Reply
#51

Quote:
Originally Posted by MX_Master
sizeof это не функция
офф определение с тобой несогласно
Quote:
Функция SizeOf возвращает занимаемый размер (в байтах) переменной (Variable) или типа (Type).

Zeex, sizeof ни когда и не во что не преобразовывается, это функция сервера, а не компилятора.
Если кто-то считает обратное, расскажите принци определения компилятором когда нужно преобразовывать данную функцию в константу, а когда оставлять функцией?
Reply
#52

stepmex
Только с пеной у рта тут не надо несколько постов твердить (: что "sizeof ни когда и не во что не преобразовывается, это функция сервера, а не компилятора."

Тебе мастер по скриптингу, и ваще по языку PAWN, говорит, что это не функция, а оператор языка.

-- на десерт --

new str[] = "0123456789",
str_copy [ sizeof str ];

str_copy = str;
Reply
#53

Quote:
Originally Posted by stepmex
Quote:
Originally Posted by MX_Master
sizeof это не функция
офф определение с тобой несогласно
Quote:
Функция SizeOf возвращает занимаемый размер (в байтах) переменной (Variable) или типа (Type).

Откуда этот бред? Из википедии что ли?

Quote:
Originally Posted by stepmex
Zeex, sizeof ни когда и не во что не преобразовывается, это функция сервера, а не компилятора.
Скомпилированный в инструкции скрипт уже не доказательство? Могу сначала в amx перегнать, потом в ассемблер, что в принципе ничего не изменит, так будет лучше?

Quote:
Originally Posted by stepmex
Если кто-то считает обратное, расскажите принци определения компилятором когда нужно преобразовывать данную функцию в константу, а когда оставлять функцией?
sizeof это ВСЕГДА константа, ибо размер его операндов ВСЕГДА известен компилятору. А ежели неизвестен (при неверном использовании), павно выплюнет ошибку и откажется компилять. Так что да, всегда.

Reply
#54

МОжет хватит уже об одном и том же говорить несколько страниц...Вы так всю тему зафлудите. Тут все таки ен спор к чему принадлежит та или иная ф-ция...а оптимизация кода. В этом хаосе потом фиг что найдешь...
Reply
#55

Quote:
Originally Posted by MX_Master
Новый пост, т.к. ваще о другом хочу сказать.

Кто знает и использует оператор char ? Это еще один из способов не транжирить память. Кто юзает, знает о чем я.
Можно по подробнее про это рассказать? И как вы пользуетесь этим?
Reply
#56

Quote:
Originally Posted by Fro1sha
Quote:
Originally Posted by MX_Master
Новый пост, т.к. ваще о другом хочу сказать.

Кто знает и использует оператор char ? Это еще один из способов не транжирить память. Кто юзает, знает о чем я.
Можно по подробнее про это рассказать? И как вы пользуетесь этим?
Факты:
  • char это оператор, который возвращает кол-во ячеек, необходимое для хранения указанного кол-ва байт, которое указано перед этим оператором.
  • char возвращает константное значение
  • синтаксис: [кол-во байт] char
  • примеры: 500 char, 47 char
  • смысл возвращаемых значений: 500 char это 125, 47 char это 12
  • механизм подсчета: 500 char это 500/4, 47 char это 47/4 + 1 (т.к. для хранения 47 байт недостаточно 11 pawn ячеек)
  • если с помощью этого оператора указанно кол-во элементов в определении массива, то к элементам этого массива можно обращаться не только как к ячейкам ( [] скобки ), но также и как к байтам ( {} скобки )

Область применения:
  • Массивы, значения ячеек которых лежат в диапазоне 0..255. Обычно, это массивы флагов в sa-mp.
  • Для хранения упакованных строк. Редко используется в sa-mp. Но в моем Power INI используется для уменьшения данных в стэке.

Примеры:
  • Массив флагов:

    stock isPlayerLogged [ 500 char ]; // в памяти будет выделено не 2000 байт как обычно, а всего 500 байт

    if ( isPlayerLogged{playerid} ) // ...

    isPlayerLogged{playerid} = 1;


  • Упакованные строки:

    stock packedStr [ 128 char ] = !"Cтрока, в которой символ занимает не 4 байта, а всего 1";
    // ! - означает, что указана упакованная строка, а не обычная

    printf( "%c", packedStr{6} ); // напечатает символ ',' (запятая)
Reply
#57

Получается только для глобальных переменных это подходит, в локальных так же через new
Reply
#58

Quote:
Originally Posted by Fro1sha
Получается только для глобальных переменных это подходит, в локальных так же через new
Области для использования stock и new вы уже давно должны знать. Ни для каких новых операторов и функций для вас, эти области не изменятся. Использование stock в примерах выше не несет обязательной смысловой нагрузки. С таким же успехом можно юзать в примерах new.
Reply
#59

char - 1 байт
и тут даже мозг трахать ненада...
в коде: new pp[50 char] создасться 50 байт
а по дефолту создаются типа int
т.е. int = 4 байт, то размер = 200 байт уже...
и всё таки динамические массивы можно делать только в c++!
ибо это операнд компилятора и не более:
int *tmp = new int[50];
выделяется 200 байт, и указатель на первую ячейку - *tmp
а в павно так нельзя

модер:
- наверное, ты все-таки заметил, что мы скриптим не на С++ и не обсуждаем тут как хорошо все-таки на С все кодить
- "и тут даже мозг трахать ненада..." кому это ты говоришь?
Хочешь этим сказать, что мое стройное описание хуже твоей кучи эмоций вкупе с С++ примерами?
Reply
#60

сначало я думал что char эта переменная которая хранит в себе один знак

А теперь почитав посты MX_Master'a я уже думаю переходить на массивы типа
Code:
stock isPlayerLogged [ 500 char ];
Reply


Forum Jump:


Users browsing this thread: 13 Guest(s)