A2 & Oberon » Программирование » ActiveOberon » Конструкторы массивов оказываются есть :))

Страниц (1): [1]
 

1. BohdanT - 10 Января, 2009 - 15:55:32 - перейти к сообщению
MODULE Untitled;
CONST
test=[[1,2,3],[5,6,7],[8,9,10]];
VAR
b:LONGINT;
BEGIN
b:=test[1,2];
END Untitled.~

Повоюем!
2. sage - 10 Января, 2009 - 17:03:42 - перейти к сообщению
BohdanT пишет:
CONST
test=[[1,2,3],[5,6,7],[8,9,10]];
А-а-а!!! Шикарно!!! Закатив глазки
3. lit-uriy - 10 Января, 2009 - 17:49:49 - перейти к сообщению
что-то я из этой записи ничего не понял Недовольство, огорчение
где тут конструктор масива?
4. sage - 13 Января, 2009 - 12:17:35 - перейти к сообщению
Ещё как вариант можо воспользоваться математическими расширениями компилятора.
Достаточно при объявлении типа массива использовать квадратные скобки:
VAR
a: ARRAY [*, *] OF INTEGER;
и тогда возможна такая инициализация массива в коде одной строчкой:
a := [[1, 2, 3], [5, 6, 7], [8, 9, 10]];
5. BohdanT - 19 Января, 2009 - 13:54:52 - перейти к сообщению
во проверил так, на всякий случай Улыбка :

MODULE Untitled;

PROCEDURE aa(p:ARRAY [*] OF LONGINT);
BEGIN
END aa;
BEGIN
aa([12,3,4,66]);
END Untitled.~
6. BohdanT - 19 Января, 2009 - 16:09:16 - перейти к сообщению
Мы тут с Ярославом немного подумали и пришли к интересной конструкции, которую можно применять на практике:
MODULE Untitled;
IMPORT Utilities;
TYPE
String=Utilities.String;
PROCEDURE "+"(CONST s:ARRAY OF CHAR):String;
BEGIN
RETURN Utilities.NewString(s);
END "+";
PROCEDURE aa(p:ARRAY [*] OF String);
BEGIN
END aa;
BEGIN
aa([+"qewr",+"fwfewf"]);
END Untitled.~
7. lit-uriy - 19 Января, 2009 - 19:07:21 - перейти к сообщению
BohdanT, прокоментируй код пожалуйста, строчка за строчкой.
8. BohdanT - 19 Января, 2009 - 20:28:53 - перейти к сообщению
MODULE Untitled;
IMPORT Utilities; (*Подключаем модуль, нам он понадобится для работы со строками*)
TYPE
String=Utilities.String; (*делаем алиас, для удобства*)

(*переопределяем оператор "унитарный плюс" с права выражение массив сиволов, на выходе строка(указатель на массив символов) *)
PROCEDURE "+"(CONST s:ARRAY OF CHAR):String;
BEGIN
RETURN Utilities.NewString(s); (*выделяем память для строки *)
END "+";

(*тестовая процедура, на входе массив (не знаю как правильно называется тип массива) .
Ничего не делает :) *)
PROCEDURE aa(p:ARRAY [*] OF String);
BEGIN
END aa;
BEGIN
aa([+"qewr",+"fwfewf"]);(* вызываем тестовую функцию, в качестве параметра передаем массив.
[] - конструктор массива, т.е. массив создаем при вызове.
+ - это наш перегруженный оператор.
Если бы мы не перегружали оператор пришлось бы писать:
aa([Utilities.NewString("qewr"),Utilities.NewString("fwfewf")]);
С другой стороны мы не можем сделать что бы массив сосотоял из ARRAY OF CHAR,
т.к. нету фиксированного размера элементов в таком случае
*)
END Untitled.~
9. lit-uriy - 20 Января, 2009 - 08:47:08 - перейти к сообщению
BohdanT пишет:
"унитарный плюс"
вот это для меня больше всего непонятно!
как, где и для чего он применяется?

и еще вот это непонятно:
BohdanT пишет:
из ARRAY OF CHAR, т.к. нету фиксированного размера элементов в таком случае
я так понимаю: нету, потому что неуказан размер. А что если бы мы применили запись:
Цитата:
ARRAY [ * ] OF CHAR
(по аналогии с твоим примером, но вместо символа строка)
10. BohdanT - 20 Января, 2009 - 09:51:46 - перейти к сообщению
lit-uriy пишет:
вот это для меня больше всего непонятно!
как, где и для чего он применяется?

Наверное нигде Улыбка я тоже не знаю, наверное просто технично так получилось.
lit-uriy пишет:
А что если бы мы применили запись

Компиллер не воспринимает, сейчас по крайней мере.

Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0078]     [ Gzipped ]