Difference between revisions of "Variable/ru"

From Lazarus wiki
Jump to navigationJump to search
 
(7 intermediate revisions by one other user not shown)
Line 3: Line 3:
 
'''Переменные''' - это символьные последовательности, которые определяет программист и для которых выделяется память ([[Integer/ru|integer]], [[Char/ru|char]] и т.д.). Они могут находится в области видимости всей программы ([[Global variables/ru|глобальные переменные]]) или только внутри процедуры, функции, метода ([[Local variables/ru|локальные переменные]]).
 
'''Переменные''' - это символьные последовательности, которые определяет программист и для которых выделяется память ([[Integer/ru|integer]], [[Char/ru|char]] и т.д.). Они могут находится в области видимости всей программы ([[Global variables/ru|глобальные переменные]]) или только внутри процедуры, функции, метода ([[Local variables/ru|локальные переменные]]).
  
== declaration ==
+
== Объявление ==
Variables are declared in a [[Var|<syntaxhighlight lang="pascal" enclose="none">var</syntaxhighlight> section]].
+
Переменные объявляются в секции [[Var|<syntaxhighlight lang="pascal" inline>var</syntaxhighlight>]]. В [[Pascal|Паскале]] каждая переменная имеет [[Data type/ru|тип данных]], известный уже на этапе [[Compile time|времени компиляции]] (и пусть это будет тип данных [[Variant|<syntaxhighlight lang="pascal" inline>variant</syntaxhighlight>]]). Переменная объявляется парой <math>(\text{identifier}, \text{data type identifier})</math>, разделенной [[Colon|двоеточием]]:
In [[Pascal]] every variable has a [[Data type|data type]] already known at [[Compile time|compile-time]] (and let it be the [[Variant|data type <syntaxhighlight lang="pascal" enclose="none">variant</syntaxhighlight>]]).
 
A variable is declared by a <math>(\text{identifier}, \text{data type identifier})</math> tuple, separated by a [[Colon|colon]]:
 
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
var
 
var
 
foo: char;
 
foo: char;
 
</syntaxhighlight>
 
</syntaxhighlight>
According to the data type's space requirements, the appropriate amount of memory is reserved on the stack, as soon as the corresponding [[Scope|scope]] is entered.
 
Depending on where the <syntaxhighlight lang="pascal" enclose="none">var</syntaxhighlight>-section is placed, you can speak of either [[Global variables|global]] or [[Local variables|local]] variables.
 
  
== manipulation ==
+
В соответствии с требованиями к пространству типа данных соответствующий объем памяти резервируется в стеке, как только вводится соответствующая [[Scope| область видимости переменной]]. В зависимости от того, где находится <syntaxhighlight lang="pascal" inline>var</syntaxhighlight>-секция, вы можете говорить о [[Global_variables/ru|глобальных]] или [[Local_variables/ru|локальных]] переменных.
Variables are manipulated by the [[Becomes|assignment operator <syntaxhighlight lang="pascal" enclose="none">:=</syntaxhighlight>]].
 
Furthermore a series of built-in procedures implicitly assign values to a variable:
 
* input/output routines like, <syntaxhighlight lang="pascal" enclose="none">get</syntaxhighlight> and <syntaxhighlight lang="pascal" enclose="none">put</syntaxhighlight>, [[Read|<syntaxhighlight lang="pascal" enclose="none">read</syntaxhighlight>]] and <syntaxhighlight lang="pascal" enclose="none">readLn</syntaxhighlight>, <syntaxhighlight lang="pascal" enclose="none">assign</syntaxhighlight> and <syntaxhighlight lang="pascal" enclose="none">close</syntaxhighlight>
 
* <syntaxhighlight lang="pascal" enclose="none">new</syntaxhighlight> and <syntaxhighlight lang="pascal" enclose="none">dispose</syntaxhighlight> when handling [[Pointer|pointers]] to [[Object|objects]]
 
* <syntaxhighlight lang="pascal" enclose="none">setLength</syntaxhighlight> when handling [[Dynamic array|dynamic arrays]]
 
  
== definition ==
+
== Управление ==
A variable can be defined, that means declared and initialized, in one term by doing the following.
+
Переменные обрабатываются [[Becomes/ru|оператором присваивания <syntaxhighlight lang="pascal" inline>:=</syntaxhighlight>]]. Кроме того, ряд встроенных процедур присваивает значения переменной неявно:
 +
*процедуры ввода/вывода, такие как, <tt>get</tt> и <tt>put</tt>, [[Read|<tt>read</tt>]] и <tt>readLn</tt>, <tt>assign</tt> и <tt>close</tt>
 +
* <tt>new</tt> и <tt>dispose</tt> при обработке [[Pointer/ru|указателей]] на [[Object|объекты]]
 +
* <tt>setLength</tt> при обработке [[Dynamic_array/ru|динамических массивов]]
 +
 
 +
== Определение ==
 +
Переменная может быть определена, то есть объявлена и инициализирована за один раз при выполнении следующего.
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
var
 
var
 
x: integer = 42;
 
x: integer = 42;
 
</syntaxhighlight>
 
</syntaxhighlight>
Note, this syntax is not original Pascal.
+
Обратите внимание, этот синтаксис не является оригинальным Паскалем.
In Pascal declarations and assignments are kept apart by design.
+
В Паскале декларации и назначения отделены от дизайна.
This syntax kind of breaks that principle.
+
Этот синтаксис нарушает этот принцип.
  
== access ==
+
== Доступ ==
A variable is accessed, that means the value at the referenced memory position is read, by simply specifying its identifier (wherever an [[expression]] is expected).
+
Доступ к переменной означает, что значение в указанной позиции памяти читается просто при указании ее идентификатора (везде, где ожидается [[expression|выражение]]).
  
Note, there are a couple data types which are in fact pointers, but are automatically de-referenced, including but not limited to [[Class|classes]], dynamic arrays and [[AnsiString|ANSI strings]].
+
Обратите внимание, что существует пара типов данных, которые на самом деле являются указателями, но на которые автоматически отменяются ссылки, включая, но не ограничиваясь, [[Class|классы]], динамические массивы и [[AnsiString|строки ANSI]]. С [директивой компилятора] <syntaxhighlight lang="pascal" inline>{$modeSwitch autoDeref+}</syntaxhighlight> (не рекомендуется) также типизированные указатели молча освобождаются от ссылки без применения [[%5E/ru|<syntaxhighlight lang="pascal" inline>^</syntaxhighlight> (символа шапочки)]]. Это означает, что вы не обязательно работаете с реальным блоком памяти где-то еще, с которым переменная действительно связана.
With <syntaxhighlight lang="pascal" enclose="none">{$modeSwitch autoDeref+}</syntaxhighlight> (not recommended) also typed pointers are silently de-referenced without the [[^|<syntaxhighlight lang="pascal" enclose="none">^</syntaxhighlight> (hat symbol)]] being present.
 
This means, you do not necessarily operate on the actual memory block the variable is genuinely associated with, but somewhere else.
 
  
Usually the variable's memory chunk is interpreted according to its data type as it was declared as.
+
Обычно блок памяти переменной интерпретируется в соответствии с ее типом данных, как он был объявлен. С помощью [[Typecast/ru|приведения типов]] интерпретация блока памяти данной переменной может быть изменена (для выражения).
With [[Typecast|typecasts]] the interpretation of a given variable's memory block can be altered (per expression).
 
  
== memory alias ==
+
== Псевдоним памяти ==
In conjunction with [[Keyword|keyword]] [[Absolute|<syntaxhighlight lang="pascal" enclose="none">absolute</syntaxhighlight>]] an identifier can be associated with a previously reserved blob of memory.
+
В сочетании с [[Keyword/ru|ключевым словом]] [[Absolute/ru|<syntaxhighlight lang="pascal" inline>absolute</syntaxhighlight>]] идентификатор может быть связан с ранее зарезервированным большим двоичным объектом памяти. Пока обычная пара <math>(\text{идентификатор}, \text{тип данных})</math> фактически устанавливает определенный объем памяти в стороне, следующее объявление <tt>c</tt> не занимает дополнительного места, но связывает идентификатор <tt>c</tt> с блоком памяти, зарезервированным для <tt>x</tt>:
While a plain <math>(\text{identifier}, \text{data type})</math> tuple actually sets a certain amount of memory aside, the following declaration of <syntaxhighlight lang="pascal" enclose="none">c</syntaxhighlight> does not occupy any additional space, but links the identifier <syntaxhighlight lang="pascal" enclose="none">c</syntaxhighlight> with the memory block that has been reserved for <syntaxhighlight lang="pascal" enclose="none">x</syntaxhighlight>:
 
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
var
 
var
Line 49: Line 42:
 
c: char absolute x;
 
c: char absolute x;
 
</syntaxhighlight>
 
</syntaxhighlight>
Here, the memory alias was used as a, one of many, strategies to convince the [[Compiler|compiler]] to allow operations valid for the [[Char|<syntaxhighlight lang="pascal" enclose="none">char</syntaxhighlight> type]] while the underlying memory was originally reserved for a [[Byte|<syntaxhighlight lang="pascal" enclose="none">byte</syntaxhighlight>]].
+
Здесь псевдоним памяти использовался в качестве одной из многих стратегий, чтобы убедить [[Compiler|компилятор]] разрешить операции, допустимые для типа [[Char/ru|<syntaxhighlight lang="pascal" inline>char</syntaxhighlight>]], в то время как основная память изначально была зарезервирована для [[Byte/ru|<syntaxhighlight lang="pascal" inline>байта</syntaxhighlight>]]. Эта функция должна выбираться с умом. Это обязательно требует знания структуры памяти типа данных, чтобы ничто не вызывало какие-либо нарушения прав доступа.
This feature has to be chosen wisely.
 
It necessarily requires knowledge of data type's memory structure, if nothing is supposed to trigger any sort of access violations.
 
  
Most importantly, the additionally referenced memory will be treated as if it was declared regularly.
+
Самое главное, что память с дополнительными ссылками будет обрабатываться так, как если бы она была объявлена аккуратно. И никаких вопросов не было бы задано.
No questions asked.
 
  
== see also ==
+
== См.также ==
* [[Constant|constant]]
+
* [[Constant/ru|константы]]
  
  
 
[[Category:Pascal/ru]]
 
[[Category:Pascal/ru]]

Latest revision as of 17:18, 6 August 2022

English (en) suomi (fi) français (fr) русский (ru)

Переменные - это символьные последовательности, которые определяет программист и для которых выделяется память (integer, char и т.д.). Они могут находится в области видимости всей программы (глобальные переменные) или только внутри процедуры, функции, метода (локальные переменные).

Объявление

Переменные объявляются в секции var. В Паскале каждая переменная имеет тип данных, известный уже на этапе времени компиляции (и пусть это будет тип данных variant). Переменная объявляется парой [math]\displaystyle{ (\text{identifier}, \text{data type identifier}) }[/math], разделенной двоеточием:

var
	foo: char;

В соответствии с требованиями к пространству типа данных соответствующий объем памяти резервируется в стеке, как только вводится соответствующая область видимости переменной. В зависимости от того, где находится var-секция, вы можете говорить о глобальных или локальных переменных.

Управление

Переменные обрабатываются оператором присваивания :=. Кроме того, ряд встроенных процедур присваивает значения переменной неявно:

Определение

Переменная может быть определена, то есть объявлена и инициализирована за один раз при выполнении следующего.

var
	x: integer = 42;

Обратите внимание, этот синтаксис не является оригинальным Паскалем. В Паскале декларации и назначения отделены от дизайна. Этот синтаксис нарушает этот принцип.

Доступ

Доступ к переменной означает, что значение в указанной позиции памяти читается просто при указании ее идентификатора (везде, где ожидается выражение).

Обратите внимание, что существует пара типов данных, которые на самом деле являются указателями, но на которые автоматически отменяются ссылки, включая, но не ограничиваясь, классы, динамические массивы и строки ANSI. С [директивой компилятора] {$modeSwitch autoDeref+} (не рекомендуется) также типизированные указатели молча освобождаются от ссылки без применения ^ (символа шапочки). Это означает, что вы не обязательно работаете с реальным блоком памяти где-то еще, с которым переменная действительно связана.

Обычно блок памяти переменной интерпретируется в соответствии с ее типом данных, как он был объявлен. С помощью приведения типов интерпретация блока памяти данной переменной может быть изменена (для выражения).

Псевдоним памяти

В сочетании с ключевым словом absolute идентификатор может быть связан с ранее зарезервированным большим двоичным объектом памяти. Пока обычная пара [math]\displaystyle{ (\text{идентификатор}, \text{тип данных}) }[/math] фактически устанавливает определенный объем памяти в стороне, следующее объявление c не занимает дополнительного места, но связывает идентификатор c с блоком памяти, зарезервированным для x:

var
	x: byte;
	c: char absolute x;

Здесь псевдоним памяти использовался в качестве одной из многих стратегий, чтобы убедить компилятор разрешить операции, допустимые для типа char, в то время как основная память изначально была зарезервирована для байта. Эта функция должна выбираться с умом. Это обязательно требует знания структуры памяти типа данных, чтобы ничто не вызывало какие-либо нарушения прав доступа.

Самое главное, что память с дополнительными ссылками будет обрабатываться так, как если бы она была объявлена аккуратно. И никаких вопросов не было бы задано.

См.также