В языке 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[?][ ];
|
Как в Context 3
|
Определение длины |
1)
|
1)
|
1)
|
doSome(A[][]);
|
Как в 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)^;
|
Как в Context 3
|
Преобразование в ссылку на матрицу |
char *St = "String";
|
char @St := "String";
|
char St^ := "String";
|
char St[] := "String";
|
Как в Context 3
|
Строковая константа |
1)Двумерный массив должен быть снабжен одномерным массивом ссылок, каждый элемент которого должен указывать на соответствующую строку двумерного массива.