Context 3: Ссылки на единичные объекты и массивы объектов - план

В языке Context трудно создать функцию, способную работать с любым многомерным массивом. Для работы с массивами, размеры которых фиксированы, можно использовать структуру-обертку, ссылка на которую передается функции как параметр. В принципе можно использовать корректно инициализированные ссылки на ссылки (на ссылки ...), но инициализация массивов ссылок несколько сложна и может быть источником ошибок. Например, трехмерный массив должен быть снабжен двумерным массивом ссылок и одномерным массивом ссылок на ссылки.

В языке Context 3 ссылки на единичные объекты и на массивы различаются. Как и в Context 1&2 ссылки на единичные объекты разименовываются автоматически. Чтобы запретить разименование, т.е. прочитать или записать адрес, необходимо использовать постфиксный оператор ^. Ссылки на единичные объекты не могут индексироваться.

Ссылки на массивы (одно- или многомерные) дожны снабжаться или индексами или операторами определения адреса []. Ссылка на массив состоит из адреса массива и набора длин измерений. Для определения длины измерения может быть использован оператор [?]. Ссылка на массив похожа на открытый массив из языка Oberon, но она может быть объявлена в любом месте программы, где допустимо объявление переменной или поля а не только в заголовке функции.

Строковые константы считаются ссылками на одномерный массив символов.

Явных ограничений на определение ссылок на ссылки нет. Возможно, ссылок на единичный объект и на массив объектов достаточно, но если такая необходимость возникнет, ссылка на ссылку (на ссылку ...) может быть использована.

Никакой двусмысленности. Ссылка на массив ссылок и ссылка на ccылку на массив различаются порядком операторов ^ и [].

Как и в Context 1&2 присваивание и передача параметра не различаются.

Старые ссылки @ поддерживаются. Ссылки на ссылки не поддерживаются. От новых ссылок ^ они отличаются только возможностью разименования с индексацией. Использование старых ссылок нежелательно, они нужны только до их замены новыми ссылками в самом компиляторе.

Примеры кода:

C Context 1&2 Postfix (Context-подобный язык с постфиксным оператором определения адреса) Context 3 Context 3-alt Remark
char *strcpy(char *dst, char *src); char @strcpy(char @dst, char @src); char strcpy(char dst^, char src^)^; char strcpy(char dst[], char src[])[]; Как в Context 3 Строковая функция. Параметры и результат состоят из адреса и одной длины
1) 1) 1) void doSome(int matrix[][]); Как в Context 3 Матричная функция. Параметр matrix состоит из адреса и двух длин
char C; char C; char C; char C; Как в Context 3 Единичная переменная
char *RC = &C; char @RC := @C; char RC^ := C^; char RC^ := @C; char RC^ := C^; Ссылка на переменную и ее инициализация
char *RC2 = PC; char @RC2 := @RC; char RC2^ := RC^; char RC2^ := RC^; Как в Context 3 Ссылка на переменную и ее инициализация
PC = &C; @RC := @C; RC^ := C^; RC^ := @C; RC^ := C^; Присваивание ссылке адреса
char C2 = *RC; char C2 := RC; char C2 := RC; char C2 := RC; Как в Context 3 Косвенное обращение
char C3 = RC[3]; char C3 := RC[3]; char C3 := RC[3]; - - Косвенное обращение с индексацией (выход за границу)
char S[3]; char S[3]; char S[3]; char S[3]; Как в Context 3 Одномерный массив
char *RS = S; char @RS := @S; char RS^ := @S; char RS[] := S[]; Как в Context 3 Ссылка на массив и ее инициализация
int A[5][7]; int A[5][7]; int A[5][7]; int A[5][7]; Как в Context 3 Матрица
1) 1) 1) int RA[][] := A[][]; Как в Context 3 Ссылка на матрицу и ее инициализация
1) 1) 1) int RRA^[][] := @RA[][]; int RRA^[][] := RRA^[][]; Ссылка на ссылку на матрицу и ее инициализация
int (*RA25X80)[25][80]; - - int RA25X80^[25][80]; // Ошибка Как в Context 3 Ссылки на массивы фиксированного размера не допускаются, вместо них могут быть использованы ссылки на массивы или структуры-обертки
1) 1) 1) int E35 := RRA[3][5]; Как в Context 3 Косвенное обращение
- - - int D0 := RRA[?][ ];
int D1 := RRA[ ][?];
Как в Context 3 Определение длины
1) 1) 1) doSome(A[][]);
doSome(RA[][]);
doSome(RRA[][]);
Как в Context 3 Передача параметра
int *AR[10]; int @AR[10]; int AR[10]^; int AR[10]^; Like Context 3 Массив ссылок
int **RAR = AR; int @@RAR := @@AR; int RAR^^ := AR^^; int RAR[]^ := AR[]^; Like Context 3 Ссылка на массив ссылок и ее инициализация
- - - void RV^ := GetMem(19*19*4)^;
int RM[][] := int(RV^)[\19][\19];
Как в Context 3 Преобразование в ссылку на матрицу
char *St = "String"; char @St := "String"; char St^ := "String"; char St[] := "String"; Как в Context 3 Строковая константа

1)Двумерный массив должен быть снабжен одномерным массивом ссылок, каждый элемент которого должен указывать на соответствующую строку двумерного массива.

Рейтинг@Mail.ru
Сайт создан в системе uCoz