Перевести страницу

Создание приложений для науки и производства ещё не было таким простым

Массивы

В текущей реализации Ci поддерживаются только одномерные массивы. Массивы, размерностью больше 1 не поддерживаются, но при необходимости их можно эмулировать на одномерных массивах 1). В массив могут быть собраны данные любого, но одного и того же типа. Размерность массива можно было бы не ограничивать – для индексации используется тип беззнаковое целое, что позволяет виртуально создавать массивы размером более 4 млрд. элементов на платформе IA32. Однако в реальности создать массив такого размера не получится, это обусловлено ограниченным объемом имеющейся памяти и способом ее использования операционной системой. Поэтому в каждой конкретной реализации Ci имеется свое ограничение на размер массива. В базовой конфигурации это 2^20 == 1048576 элементов. При необходимости (например, при переходе на архитектуру с 64-х битной адресацией) их число может быть легко увеличено в новых версиях Ci.

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

    uint array[2048] data[100];

    str string[ 128 ];

    block b[10];

Нетрудно заметить, что для задания размера массива используются целые числа. Это должны быть беззнаковые целые, использование других типов данных (кроме знаковых целых) вызовет сообщение об ошибке на этапе компиляции. Если используется отрицательное знаковое целое, то сообщение об ошибке будет выдано на этапе выполнения (в следующих версиях оно будет выдаваться во время компиляции). Элемент массива определяется динамически и может использоваться везде, где используется обычная переменная.

    puts array[1] (data[100] * data[101]);

При этом индекс элемента вычисляется непосредственно перед получением элемента массива, после чего элемент передается параметром операции. Индекс массива является беззнаковым целым числом, он указывается внутри квадратных скобок после имени массива, точно так же, как это делается в программах на обычном языке C. Но в языке С нельзя объявить массив, используя для указания размера значение переменной, или значение, возвращаемое функцией. В языке Ci можно это делать, поскольку массивы создаются во время выполнения программы, то есть, в Ci массивы являются динамическими.

    uint indx 10;

    ...

    ++ indx;

    ...

    array[ indx ];

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

puts array[(indx * 2)];


Некоторые операции могут принимать в качестве параметра не только элементы массива, но и целиком массив. Такая возможность определяется реализацией операции и только ей. Например, по умолчанию операция сложения + работает только с отдельными переменными. Но ее можно расширить (это может сделать только обученный системный программист), чтобы, например, она выполняла суммирование всех элементов всех массивов, которые передаются ей параметрами, причем независимо от их типов. Компилятор проверяет возможность передачи операции массива целиком и выдает ошибку, если такая передача невозможна. Для передачи целого массива достаточно просто не указывать индекс и квадратные скобки, только имя массива. Наиболее часто применяемой операцией, которая может принимать массив параметром, является clear:

    uint array[1000]; str string[200];

    ........

код, содержащий изменения массивов array и string

    ........

    clear array string; ``массивы снова пусты, как после создания.


Необходимо отметить, что когда в описании операции указывается, что массив не допустим, это означает, что недопустима передача массива целиком, однако можно передавать отдельный элемент массива, поскольку он эквивалентен простой переменной.


В языке Ci принята нумерация объектов такая же, как в C, начиная с 0-го. Это означает, что первый по порядку элемент массива, первый параметр операции, первый символ строки и т.д. имеют номер 0. Последний элемент массива размерностью N имеет номер N-1. Последний символ строки длиной N, имеет номер также N-1. В описании операций параметры называются первым, вторым и т.д., но программно к ним производится обращение по номерам 0, 1, 2 и т.д. Для массива с размерностью 100 допустимые номера элементов находятся в диапазоне 0...99. При попытке обращения к элементу массива с номером, больше максимального, Ci-программа будет прервана с сообщением об ошибке. Также выполнение прекращается с ошибкой, если производится попытка создать массив с недопустимым числом элементов, то есть, равным 0 или большим максимально допустимого для текущей реализации.


1) Для хранения данных в многомерных массивах используются одномерные массивы, внутри состоящие из «подмассивов». Данные «многомерного» массива адресуются при помощи суммы смещений, получаемых как произведения индексов и размеров «подмассивов». То есть для 3-х мерного массива размерностью I * J * K элементов объявляется одномерный массив a[(* I J K)]. В дальнейшем элемент a[i][j][k] можно адресовать как a[( + i (j * I) (* k J I) )]. Основным минусом такой техники является то, что невозможно произвести проверку выхода отдельного индекса за границу его «подмассива». То есть, если адресовать элемент с i,j,k индексом I,0,0, то будет адресоваться тот элемент, который имеет индекс 0,1,0. Это может порождать трудные для обнаружения ошибки. Кроме этого, обращение довольно громоздкое, и приводит к генерации дополнительного кода для вычисления произведений и суммы. Также, невозможно обратиться к элементу массива, размерность которого больше максимально допустимого числа параметров у операций.