"Array of const" это массив переменных, декларированных как константы. Непосредственно они представлены структурой TVarRec. Скобки просто ограничивают массив. Массив констант дает вам возможность передавать процедуре переменное количество параметров type-safe (безопасным) способом. Вот пример:
type
TVarRec = record
Data: record case Integer of
0 : (L: LongInt ) ;
1 : (B: Boolean ) ;
2 : (C: Char ) ;
3 : (E: ^Extended) ;
4 : (S: ^string) ;
5 : (P: Pointer ) ;
6 : (X: PChar ) ;
7 : (O: TObject ) ;
end ;
Tag: Byte ;
Stuff: array [ 0 ..2 ] of Byte ;
end ;
function PtrToStr(P: Pointer ) : string ;
const
HexChar: array [ 0 ..15 ] of Char = "0123456789ABCDEF" ;
function HexByte(B: Byte ) : string ;
begin
Result:= HexChar[ B shr 4 ] + HexChar[ B and 15 ] ;
end ;
function HexWord(W: Word ) : string ;
begin
Result:= HexByte(Hi (W) ) + HexByte(Lo (W) ) ;
end ;
begin
Result:= HexWord(HiWord(LongInt (P) ) ) + ":" + HexWord(LoWord(LongInt (P) ) ) ;
end ;
procedure Display(X: array of const ) ;
I: Integer ;
begin
for I:= 0 to High (X) do
with TVarRec(X[ I] ) , Data do
begin
case Tag of
0 : ShowMessage("Integer: " + IntToStr (L) ) ;
1 : if B then
ShowMessage("Boolean: True" )
else
ShowMessage("Boolean: False" ) ;
2 : ShowMessage("Char: " + C) ;
3 : ShowMessage("Float: " + FloatToStr (E^) ) ;
4 : ShowMessage("String: " + S^) ;
5 : ShowMessage("Pointer: " + PtrToStr(P) ) ;
6 : ShowMessage("PChar: " + StrPas (X) ) ;
7 : ShowMessage("Object: " + O.ClassName ) ;
end ;
end ;
end ;
procedure TForm1.Button1Click (Sender: TObject ) ;
P: array [ 0 ..5 ] of Char ;
begin
P:= "Привет" #0 ;
Display([ -12345678 , True , "A" , 1.2345 , "ABC" , Ptr ($1234 , $5678 ) , P,
Form1] ) ;
end ;
Массив констант (array of const) фактически является открытым массивом TVarRec (описание предекларированных типов Delphi вы можете найти в электронной справке). Приведенный ниже "псевдокод" на языке Object Pascal может послужить скелетом для дальнейшего развития:
procedure AddStuff(const A: array of const ) ;
var i: Integer ;
begin
for i:= Low (A) to High (A) do
with A[ i] do
case VType of
begin
{ добавляем натуральное число, все real-форматы
Автоматически приводятся к extended }
end ;
begin
{ добавляем целое число, все integer-форматы
Автоматически приводятся к LongInt }
end ;
begin
if VObject is DArray then
with DArray(VObject) do
begin
{ добавляем массив double-типа }
else if VObject is IArray then
with IArray(VObject) do
begin
{ добавляем массив integer-типа }
end ;
end ;
end ; { Case }
end ; { AddStuff }
Для получения дополнительной информации загляните в главу "open arrays" электронной справки.
Взято из Советов по Delphi от Валентина Озерова
Сборник Kuliba
Массив констант во время выполнения приложения
Автор: Peter Below
...хорошо, непосредственно это синтаксис не поддерживает, поскольку массив констант Array of Const подобен открытым массивам, главным образом в части характеристик времени компиляции. Но вы можете обойти этот неприятный момент, обладая хотя бы начальными знаниями того, как реализован открытый массив. Что нам для этого необходимо: динамически размещенный массив array of TVarRec, который "принимает" ваши параметры, и "псевдоним" (alias) функции Format, позволяющий работать с таким массивом без "ругани" со стороны компилятора.
type
{ объявляем тип для динамического массива array of TVarRecs }
TVarArray = array [ 0 ..High (Word ) div Sizeof (TVarRec) - 1 ] of TVarRec;
PVarArray = ^TVarArray;
{ Объявляем alias-тип для функции Format. Передаваемые параметры будут иметь
В стеке тот же самый порядок вызова, что и при нормальном вызове Format }
FormatProxy = function (const aFormatStr: string ; var aVarRec: TVarRec;
HighIndex: Integer ) : string ;
{ AddVarRecs копирует параметры, передаваемые в массиве A в pRecs^, начиная
С pRecs^. highIndex - самый большой доступный индекс pRecs, число
Распределенных элементов - 1. }
procedure AddVarRecs(pRecs: PVarArray; atIndex, highIndex: Integer ; const A:
array of const ) ;
I: Integer ;
begin
if pRecs <> nil then
for i:= 0 to High (A) do
begin
if atIndex <= highIndex then
begin
PRecs^[ atIndex] := A[ i] ;
Inc (atIndex) ;
end { If }
else
Break ;
end ; { For }
end ; { AddVarRecs }
procedure TScratchMain.SpeedButton2Click (Sender: TObject ) ;
S: string ;
Proxy: FormatProxy;
begin
{ распределяем массив для четырех параметров, индексы - 0..3 }
GetMem (p, 4 * Sizeof (TVarRec) ) ;
{ добавляем параметры последующими вызовами AddVarRecs }
AddVarRecs(p, 0 , 3 , [ 12 , 0.5 , "Шаблон" ] ) ;
AddVarRecs(p, 3 , 3 , [ "Тест" ] ) ;
{ получаем полномочия Format }
@Proxy:= @SysUtils.Format ;
{ Вызов с динамически сгенерированным массивом параметров.
Естественно, строка формата может также быть сформирована
И во время выполнения программы. }
S:= Proxy("Целое: %d, Реальное: %4.2f, Строки: %s, %s" , p^[ 0 ] , 3 ) ;
{ выводим результат }
ShowMessage(S) ;
finally
FreeMem (p, 4 * Sizeof (TVarRec) ) ;
end ;
end ;
Я надеюсь вы поняли принцип. Естественно, имеются ограничения. Вы можете передавать в AddVarRecs числовые величины, строковые переменные и литералы, но не в коем случае не строковые выражения! В этом случае компилятор должен для хранения результата сформировать в стеке временную строку, передать ее в AddVarRecs (или лучше по адресу в TVarRec), и она может прекратить свое существование или может быть перезаписана в стеке другими данными, если в конечном счете вы передадите в Proxy целый массив!
Тестировалось только в Delphi 1.0!
В Microsoft Excel можно создавать массивы, которые не хранятся в диапазонах ячеек. Их принято называть массивами констант . В этом уроке Вы узнаете, что же такое массивы констант и как с ними работать в Excel.
Коротко о массивах констант
Чтобы создать массив констант, введите его элементы и заключите их в фигурные скобки. Например, на рисунке ниже представлен массив, состоящий из 6 констант:
Такой массив можно использовать в формулах Excel. Например, следующая формула суммирует значения этого массива:
СУММ({1;2;3;4;5;6})
В формулах можно обрабатывать сразу несколько массивов. Например, следующая формула вернет максимальное значение, которое получится в результате сложения двух массивов констант:
МАКС({1;2;3;4;5;6}+{7,8,9,10,11,12})
Массивы констант могут содержать числа, текст, логические значения и значения ошибки #Н/Д :
={12;"Текст";ИСТИНА;ЛОЖЬ;#Н/Д}
У Вас может возникнуть резонный вопрос: Зачем нужен такой массив? Отвечу на него в виде примера.
Пример применения массива констант в Excel
На рисунке ниже приведен список студентов, которые получили определенные оценки:
Наша задача перевести оценку из числового вида в ее словесное описание и вывести соответствующие значения в диапазоне C2:C7. В данном случае создавать отдельную табличку для хранения текстового описания оценок не имеет смысла, поэтому выгоднее создать следующий массив констант:
={"";"Неудовл.";"Удовл.";"Хорошо";"Отлино"}
В данном случае первый элемент массива содержит пустую строку, поскольку предполагается, что оценки 1 быть не может.
Тогда формула, возвращающая нужный нам результат, будет выглядеть следующим образом:
В этом примере функция ИНДЕКС возвращает значение элемента из массива констант, положение которого задано порядковым номером (оценкой).
Данная формула не является формулой массива, хоть она и содержит массив. Поэтому при ее вводе достаточно нажать клавишу Enter .
Конечно же, мы в силах скопировать данную формулу в остальные ячейки и получить нужный нам результат:
Но грамотнее будет использовать многоячеечную формулу массива. Выглядеть она будет следующим образом:
Мы можем пойти еще дальше и присвоить массиву констант имя. Имя назначается точно так же, как и обычной константе , через диалоговое окно Создание имени :
Не забывайте указывать знак равенства в поле Диапазон , иначе Excel воспримет массив как текстовую строку.
Теперь формула выглядит менее пугающей:
Как видите, в некоторых случаях массивы констант бывают даже очень полезны.
Итак, в данном уроке Вы познакомились с массивами констант и их применением в Excel. Если желаете получить еще больше информации о массивах, читайте следующие статьи.
Массив значений (или константа массива или массив констант) – это совокупность чисел или текстовых значений, которую можно использовать в . Константы массива необходимо вводить в определенном формате, например, для чисел {1:2:3:4:5} или для текстовых значений {"Север":"ЮГ":"Восток":"Запад"}.
В обычную формулу можно ввести ссылку на ячейку, содержащую значение, или на само значение, называемое также константой. Подобным образом в можно ввести или ссылку на массив, или массив значений , содержащихся в ячейках (в справке EXCEL его называют константой массива ). Константы массива необходимо вводить в определенном формате.
Создание одномерного массива констант
Перед созданием Массива констант посмотрим повнимательнее на диапазон ячеек, содержащий обычные значения (см. Файл примера )
- в диапазон ячеек A 1: A 5 введите, например, 5 последовательных чисел от 1 до 5.
- в ячейке B1 введите формулу =A1:A5 ;
- в выделите A1:A5 и нажмите клавишу ;
- получим некую запись {1:2:3:4:5}, представляющую собой набор значений из диапазона A1:A5
Этот набор значений, как и , обрамлен в фигурные скобки, сами значения разделены двоеточиями. Если бы значения были размещены в строке (в диапазоне A1:E1 ), а не в столбце, то значения были бы разделены точкой с запятой {1;2;3;4;5}.
Создадим константу массива в ячейке B2 . Для этого введем в ячейку выражение ={1:2:3:4:5} и нажмем ENTER . Массив значений не заключается в скобки автоматически, как формулы массива после нажатия CTRL+SHIFT+ENTER . Это необходимо делать вручную. В ячейке отразится только первое значение массива, т.е. 1.
Обычно массив значений не вводят в одну ячейку, т.к. в этом случае невозможно вытащить отдельные значения. Чтобы отобразить все значения нашего массива значений нужно выделить 5 ячеек в столбце (например, B1:B5 ), в ввести выражение ={1:2:3:4:5} и нажать CTRL+SHIFT+ENTER .
Теперь попробуем удалить один элемент массива, например из ячейки B 3 . Получим предупреждение «Нельзя изменить часть массива » - это определенного вида защита массива.
Чтобы избежать утомительного ввода для вертикального массива констант можно воспользоваться формулой =СТРОКА(1:5) . Записав ее любой пустой ячейке, выделите ее в строке формул и нажмите , а затем нажмите ENTER . Получите массив констант {1:2:3:4:5} . Скопируйте содержимое ячейки в буфер обмена (CTRL+C ), затем выделите вертикальный диапазон ячеек, соответствующий размерности массива, вставьте в активную ячейку содержимое Буфера обмена и нажмите CTRL+SHIFT+ENTER.
Чтобы избежать утомительного ввода последовательных чисел для горизонтального массива констант используйте формулу =ТРАНСП(СТРОКА(1:5)) или =СТОЛБЕЦ(A:E) . Получите массив констант ={1;2;3;4;5} . Значения массива будут разделены точкой с запятой.
Применение массива констант
А. Умножение векторов (столбец на столбец, строку на строку)
С помощью формулы массива
умножим столбец значений (B
2:
B
6
) на массив констант
{1:2:3:4:5} и просуммируем. Массив констант
записан в «вертикальном» виде с использованием двоеточия, т.е. также представляет собой столбец. Размерности столбца и массива должны совпадать.
СУММ(B2:B6*{1:2:3:4:5})
После ввода формулы необходимо нажать CTRL+SHIFT+ ENTER .
Формула массива сначала выполнит поэлементное умножение значений из столбца и констант из массива. Эквивалентом данной формулы является следующее обычное выражение:
СУММ(B2*1;B3*2; B4*3; B5*4; B6*5)
В последнюю очередь выполняется сложение значений при помощи функции СУММ() .
Б. Проверка значений
Проверим, равно ли значение в ячейке А1
одному из определенных значений: 4, 6 или 9.
ИЛИ(A1={4;6;9})
После ввода формулы нет необходимости нажимать CTRL+SHIFT+ENTER . Такая запись может существенно сократить время создания формулы по сравнению с использованием вложенных функций ЕСЛИ() .
Именование массива констант
Массиву констант можно присвоить . Обычно так поступают с константами, образующими группу однотипных значений, например последовательности с конечным количеством элементов ={1:2:3} .
Чтобы присвоить массиву констант имя необходимо сделать следующее:
- на вкладке Формулы в группе Определенные имена выберите команду Присвоить имя .
- В поле Имя введите Массив123 .
- В поле Диапазон введите массив констант (не забудьте ввести скобки вручную), например {1:2:3} ;
- Нажмите кнопку ОК.
Пример, найдем , записав формулу =СУММПРОИЗВ(НАИБОЛЬШИЙ(A1:A10;Массив123)) .
Предполагается, что в диапазоне A1:A10 имеется список числовых значений.
Создание двумерного массива констант
Чтобы создать двумерный массив констант необходимо сделать следующее:
- выделите в книге диапазон ячеек из четырех столбцов и трех строк (A1:D3 ).
- в активной ячейке (А1 ), в Cтроке формул введите выражение ={1;2;3;4: 5;6;7;8: 9;10;11;12}
- нажмите сочетание клавиш CTRL+SHIFT+ ENTER
Общий вид описания (одномерного) массива:
array[<тип_индексов> ] 3Напоминаем, что жирная квадратная скобка является обязательным элементом синтаксиса. of <тип_компонент>;
Чаще всего это трактуется так:
array[<левая_граница>..<правая_граница>] of <тип_компонент>;
Например, одномерный (линейный) массив , состоящий не более чем из 10 целых чисел, можно описать следующим образом:
var a1: array of integer;
Нумерация
Нумерация компонент массива не обязана начинаться с 1 или с 0 - вы можете описывать массив, пронумерованный любыми целыми числами. Необходимо лишь, чтобы номер последней компоненты был больше, чем номер первой:
var a1: array [-5..4] of integer;
Собственно говоря, нумеровать компоненты массива можно не только целыми числами. Любой порядковый тип данных (перечислимый, интервальный, символьный, логический, а также произвольный тип, созданный на их основе) имеет право выступать в роли нумератора. Таким образом, допустимы следующие описания массивов:
type char = "a","c".."z"; (- отсутствует символ "b")
var a1: array of integer; - 256 компонент
a2: array of integer; - 256 целых компонент
a3: array of real; - 256 вещественных компонент
Общий размер массива не должен превосходить 65 520 байт. Следовательно, попытка задать массив a4:arrayof byte ; не увенчается успехом, поскольку тип integer покрывает 65 535 различных элементов. А про тип longint в данном случае лучше и вовсе не вспоминать.
Тип компонент массива может быть любым:
var a4: array of real; - массив из компонент простого типа
a5: array of record1; - массив из записей 4См. лекцию 7.
a6: array[-10..10] of ^string; - массив из указателей 5См. лекцию 12. на строки
a7: array[-1..1] of file; - массив из имен файловых переменных 6См. лекцию 6.
a8: array of array of char; - двумерный массив (массив векторов)
Для краткости и удобства многомерные массивы можно описывать и более простым способом:
var a9: array of real; - двумерный массив 10 х 20
a10 : array of word; - четырехмерный массив 2 х 3 х 256 х 21
Общее ограничение на размер массива - не более 65 520 байт - сохраняется и для многомерных массивов. Количество компонент многомерного массива вычисляется как произведение всех его "измерений". Таким образом, в массиве а9 содержится 200 компонент, а в массиве а10 - 32 256 компонент.
Описание переменных размерностей
Если ваша программа должна обрабатывать матрицы 7Матрица - двумерная таблица, состоящая из чисел. переменных размерностей (скажем, N по горизонтали и М по вертикали), то вы столкнетесь с проблемой изначального задания массива, ведь в разделе var не допускается использование переменных. Следовательно, самый логичный, казалось бы, вариант
var m,n: integer; a: array of real;
придется отбросить.
Если на этапе написания программы ничего нельзя сказать о предполагаемом размере входных данных, то не остается ничего другого, как воспользоваться техникой динамически распределяемой памяти (см. лекцию 10).
Предположим, однако, что вам известны максимальные границы, в которые могут попасть индексы обрабатываемого массива. Скажем, N и М заведомо не могут превосходить 100. Тогда можно выделить место под наибольший возможный массив, а реально работать только с малой его частью:
const nnn=100; var a: array of real; m,n: integer;
Обращение к компонентам массива
Массивы относятся к структурам прямого доступа. Это означает, что возможно напрямую (не перебирая предварительно все предшествующие компоненты) обратиться к любой интересующей нас компоненте массива.
Доступ к компонентам линейного массива осуществляется так 8Жирные квадратные скобки являются обязательным элементом синтаксиса. :
<имя_массива>[<индекс_компоненты>]
а многомерного - так:
<имя_массива>[<индекс>,_,<индекс>]
Правила употребления индексов при обращении к компонентам массива таковы:
- Индекс компоненты может быть константой, переменной или выражением, куда входят операции и вызовы функций.
- Тип каждого индекса должен быть совместим с типом, объявленным в описании массива именно для соответствующего "измерения"; менять индексы местами нельзя.
- Количество индексов не должно превышать количество "измерений" массива. Попытка обратиться к линейному массиву как к многомерному обязательно вызовет ошибку. А вот обратная ситуация вполне возможна: например, если вы описали N- мерный массив , то его можно воспринимать как