2.0.1.2-Операции над переменными.
Размер памяти, занимаемый строковыми переменными всегда на один больше чем присвоенное ей число символов. Например, переменная со значением “text” (четыре символа) в памяти занимает пять байт. Это обусловлено тем, что в конце присвоенного значения в памяти стоит символ таблицы ASCII с кодом ноль, этот символ гласит о том, что строка закончилась и необходимо прекратить извлечение данных из переменной, данный признак конца строки присваивается автоматически во время объявления и также не отображается при извлечении данных.
От сюда следует, что применение этого символа в середине строки приведет к неполному извлечению данных из переменной при дальнейших операциях над ней.
- st$="te"+Chr(0)+"xt" ;в середине слова “text” помещаем символ признак конца строки
- Debug st$ ;результатом вывода будет “te”
Проведем эксперимент и заменим признак конца строки на другой.
- st$="tex" ;присвоим переменной значение “tex”, теперь в памяти эта переменная занимает четыре байта, где последний признак конца строки.
- PokeC(@st$+3, 116) ;обратившись непосредственно к памяти заменим четвертый символ ASCII кодом буквы “t”, должно получиться слово “text”
- Debug st$ ;результат извлечения будет неверным, так как приложение начнет извлекать из памяти все что будет на его пути пока не натолкнется на символ с кодом ноль.
Если значение переменной A одного типа укладывается в рамки диапазона переменной B другого типа, такая операция верна.
- A.i=10 ;объявить переменную A типа Long и задать значение
- B.b=10+A ; присвоить на лету переменной B типа Byte результат сложения
- Debug B ;выдать значение переменной B
Механизмы защиты памяти не могут позволить переменной использовать больше памяти чем предопределено её типом, так как в памяти рядом с ней храниться значения другой переменной которые должны оставаться в целостности.
В данном случае весь ряд значений переменной можно представить в виде кольца и при достижении максимально допустимого значения следующим станет минимально допустимое, в соответствии с диапазоном значений текущего типа переменной, в чем можно убедиться, изучив следующую последовательность:
0,1,2…126,127,-128,-127,-126…-2,-1,0,1,2… для типа Byte
0,1,2…126,127,128,129,…253,254,255,0,1,2… для типа Character
Иными словами, для подписанных переменных типа Character из текущего значения вычитается максимальное пока не будет достигнуто число подходящее под диапазон допустимых значений, иными словами отсчет начнется заново.
- c.c=250 ;объявить переменную C типа Character и задать значение
- Debug c ;выдать значение переменной C
- c+5 ;увеличить значение C на 5, достигнут максимальный предел
- Debug c
- c+2 ;число 257 больше допустимого диапазона, поэтому С=0=257-256
- Debug c
- c+1
- Debug c
Обратите внимание что 0 тоже число и оно включено в диапазон 0-255, следовательно в этом диапазоне возможно уместить 256 отличных друг от друга чисел (0,1,2…254,255) что вполне просто объясняется ограниченной разрядностью данных 1байт=8бит=16*16=256.
PureBasic на данный момент не поддерживает переменные с неподписанными типами данных, такими как Byte, Word, Long, Integer и Quad.
Поэтому для выделения истинного веса неподписанной переменной необходимо использовать следующий способ:
- ab.b = 127Debug abDebug ab & $255ab.b +1Debug abDebug ab & $ffaw.w = -1Debug awDebug aw & $ffffaw.w = -1
- Debug awDebug aw & 65535
Как и во многих других языках программирования, переменные нельзя называть именами зарезервированных слов, которые применяются только по своему назначению.
- next.l=10 ;next зарезервированное слово, по этому компилятор выдаст ошибку
Для задания значения переменных можно указывать несколько имен через знак “:”
- A=10: b: c.s="text": c$=""
Для применения одной директивы к нескольким переменным используется знак “,”
Для предотвращения случайных опечаток в названии переменных можно воспользоваться дескриптором EnableExplicit, который будет отслеживать все не объявленные переменные, и сообщать об ошибке при их появлении.
- EnableExplicit ;включить обязательное объявление
- Define st$="text", a ;объявить переменные st$ и a
- a = 20 ;задать значение
- b = 10 ;переменная не была объявлена, компилятор сообщит об ошибке
Объявленные переменные доступны лишь в той области программы, в которой они были объявлены, будь то процедура, основной поток или функция обратного вызова, в каждой из них переменная имеет собственное значение, которое доступно только в данной области.
- string$="string_1";задать значение переменной
- integer=-10;задать значение переменной
- Procedure String()
- ;выдать значение переменных, в процедуре они используются впервые по этому значение отсутствует
- Debug string$
- Debug integer
- ;заданные далее значения переменных будут доступны только в этой процедуре
- ;изменение их значений не отразятся на переменных основного потока
- string$="string_2"
- integer=10
- Debug string$
- Debug integer
- EndProcedure
- ;выдать значение переменных объявленных в основном потоке программы
- Debug string$
- Debug integer
- String()
- ;после выполнения процедуры значение переменных в основном потоке программы не изменилось
- Debug string$
- Debug integer
Это происходит по тому что в процедуре переменной назначается новый экземпляр в памяти, иными словами это две переменных с одним именем, одна из которых доступна в основном потоке программы, а другая только в процедуре.
Все примеры написаны и проверены на языке высокого уровня PureBasic v4.31.
Дата составления 14 июля 2009 г.
©Copyright LOMASM - Информационные технологии. Все права защищены. Редактирование и публикация материала только с разрешения автора.
lomasm.ru