Автор Тема: Строки в О7  (Прочитано 33521 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #30 : Март 29, 2013, 08:40:40 pm »
Открытый массив — это указатель + размер. Размер проверяется во время выполнения. Присваивание a:=b при b большего размера вызовет UB. Правильные программы такого не допустят.

IF LEN(b) <= LEN(a) THEN ... END
К сожалению, в сообщении о языке даже UB не прописан (в отличае от того же стандарта С++, где UB прописаны явным образом). Ну и тем более там не прописаны детали реализации всего этого. Например массивы там легко могут банально быть терминированы какой-то специальной меткой (в некоторых ОС и некоторых реализациях это возможно), поэтому будет только указатель.

(если бы Вирт указал в репорте, что LEN(arr) должно работать за O(1) то это существенно увеличило бы шансы того, что открытый массив будет работать именно в виде указателя+длины).

Одной из интерпретаций того, что написано в сообщении о языке, может быть например такое поведение - копируются все, что помещается в другой массив. То что не помещается - просто отбрасывается.

PS. А еще я не понимаю сакраментального смысла наличия процедуры COPY в языке, ведь оно делает ровно то же самое, что и простое присваивание строк.
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Строки в О7
« Ответ #31 : Март 29, 2013, 08:43:28 pm »
Открытый массив — это указатель + размер.
С указателем это динамический массив.
А открытый массив(параметр)- это массив, с определенным типом элемента и неопределенным(произвольным) размером (тип массива определяется не только типом элемента, но и размерностью)
PROCEDURE (c : ARRAY 2 OF CHAR...
PROCEDURE (c : ARRAY 3 OF CHAR...
PROCEDURE (c : ARRAY 4 OF CHAR...

DddIzer

  • Гость
Re: Строки в О7
« Ответ #32 : Март 29, 2013, 08:44:10 pm »
Не понимаю а в чем проблема... динамических массивов нет, размеры известны на этапе компиляции, проверяй  себе на здоровье.... если это возможно... понятно, что если процедура и и ее вызов  по разным модулям это сделать невозможно
« Последнее редактирование: Март 29, 2013, 08:48:08 pm от DddIzer »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #33 : Март 29, 2013, 08:47:02 pm »
Не понимаю а в чем проблема... динамических массивов нет, размеры известны на этапе компиляции, проверяй  себе на здоровье....

Разнеси мои процедуры Test1 и Test2 по разным модулям. И собери эти модули на разных машинах. Откуда там информация в момент компиляции будет?
Y = λf.(λx.f (x x)) (λx.f (x x))

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Строки в О7
« Ответ #34 : Март 29, 2013, 08:48:37 pm »
PS. А еще я не понимаю сакраментального смысла наличия процедуры COPY в языке, ведь оно делает ровно то же самое, что и простое присваивание строк.

VAR
  a: ARRAY 10 OF CHAR;
  b: ARRAY 20 OF CHAR;

...
b := a; (* так нельзя *)
COPY(a, b); (* так можно *)


DddIzer

  • Гость
Re: Строки в О7
« Ответ #35 : Март 29, 2013, 08:49:09 pm »
да .. так я и говорю когда это возможно компайл тайм ... нет ран тайм... ошибки

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Строки в О7
« Ответ #36 : Март 29, 2013, 08:51:23 pm »
Не понимаю а в чем проблема... динамических массивов нет, размеры известны на этапе компиляции, проверяй  себе на здоровье....
Так не известны - у процедуры в параметрах ОТКРЫТЫЕ массивы, т.е. "безразмерные"

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #37 : Март 29, 2013, 08:52:08 pm »
PS. А еще я не понимаю сакраментального смысла наличия процедуры COPY в языке, ведь оно делает ровно то же самое, что и простое присваивание строк.

VAR
  a: ARRAY 10 OF CHAR;
  b: ARRAY 20 OF CHAR;

...
b := a; (* так нельзя *)
COPY(a, b); (* так можно *)

Где про это сказано? В репорте сказано лишь, что оно эквивалентно b:=a.
Y = λf.(λx.f (x x)) (λx.f (x x))

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Строки в О7
« Ответ #38 : Март 29, 2013, 08:59:53 pm »

Где про это сказано? В репорте сказано лишь, что оно эквивалентно b:=a.
[/quote]

А где сказано, что b и a в COPY(a, b) должны быть одинакового типа? Так что не совсем эквивалентно.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #39 : Март 29, 2013, 09:02:11 pm »
А где сказано, что b и a в COPY(a, b) должны быть одинакового типа? Так что не совсем эквивалентно.
Пожалуй, соглашусь. Правда остается не ясной семантика COPY. По всей видимости она таки должна забивать оставшийся хвост нулями как и в случае с литералом.

Ну и не ясно что будет в случае если мы сделаем COPY(b,a), то есть из большего будем класть в меньшее.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #40 : Март 29, 2013, 09:07:05 pm »
Гм. А быть может COPY это просто:

PROCEDURE COPY(VAR a,b ARRAY OF CHAR);
BEGIN
   b:=a
END COPY

Но тогда не понятно нафига это было зашивать прямо в язык, ибо либой делается элементарно.
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Строки в О7
« Ответ #41 : Март 29, 2013, 09:44:13 pm »
Открытый массив — это указатель + размер. Размер проверяется во время выполнения. Присваивание a:=b при b большего размера вызовет UB. Правильные программы такого не допустят.

Суть претензии у valexey (как мне кажется) и у меня в том, что вероятный UB замаскирован за такой атомарной операцией как присваивание. Я в свое время поимел дело с кодом, который бросал исключение в перегруженом операторе =. Это было страшно. Т.е., я бы для копирования массивов отсавил COPY, причем с явным указанием откуда (позиция) и сколько элементов копировать.

DddIzer

  • Гость
Re: Строки в О7
« Ответ #42 : Март 30, 2013, 03:57:14 pm »
Не понимаю а в чем проблема... динамических массивов нет, размеры известны на этапе компиляции, проверяй  себе на здоровье....
Так не известны - у процедуры в параметрах ОТКРЫТЫЕ массивы, т.е. "безразмерные"
  ну и что когда можно  проверить - компайл - тайм ошибка (если вызов происходит в рамках модуля где определен  фактический массив), иначе ран-тайм... абсолютно также вы не сможете  определится во время компиляции и с  банальным
arr:=m.arr (в секции загрузки основного модуля) если m.arr - определен в некотором модуле m (который вызывается динамически)

ddn

  • Jr. Member
  • **
  • Сообщений: 59
    • Просмотр профиля
Re: Строки в О7
« Ответ #43 : Март 30, 2013, 05:24:48 pm »
а в чем проблемы? - размеры массивов не совпадают, значит присваивание невозможно (строки - исключение)- решение см. выше (ошибка времени компиляции или времени выполнения)
Типы совпадают 1 в 1. На этапе компиляции (особенно раздельной независимой компиляции модулей, как это любят в Обероне) это в принципе не ловится.
Здесь статические типы совпадают у формальных параметров в декларации процедуры, а в каждом вызове процедуры в тексте программы статические типы у фактических параметров могут не совпадать и это ловится при компиляции.

Только при интерактивном вызове процедур (через коммандер) статические типы проверяются в начале вызова, и неясно как это интерпретировать, как время компиляции, загрузки или выполнения.

Не понимаю а в чем проблема... динамических массивов нет, размеры известны на этапе компиляции, проверяй себе на здоровье... если это возможно... понятно, что если процедура и ее вызов по разным модулям это сделать невозможно
Возможно.
Разнеси мои процедуры Test1 и Test2 по разным модулям. И собери эти модули на разных машинах. Откуда там информация в момент компиляции будет?
Как мне объяснили
http://oberspace.dyndns.org/index.php/topic,158.msg11114.html#msg11114
статические типы переменных из импортируемых модулей берутся при компиляции модуля из символьных файлов импортируемых модулей и копируются их специальные цифровые подписи. При компиляции проверяется и статическая типизация. При загрузке и работе модуля его символьный файл не используется.

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

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Строки в О7
« Ответ #44 : Март 31, 2013, 04:32:49 am »
Не понимаю а в чем проблема... динамических массивов нет, размеры известны на этапе компиляции, проверяй  себе на здоровье....
Так не известны - у процедуры в параметрах ОТКРЫТЫЕ массивы, т.е. "безразмерные"
  ну и что когда можно  проверить - компайл - тайм ошибка (если вызов происходит в рамках модуля где определен  фактический массив), иначе ран-тайм... абсолютно также вы не сможете  определится во время компиляции и с  банальным
arr:=m.arr (в секции загрузки основного модуля) если m.arr - определен в некотором модуле m (который вызывается динамически)
Я говорю о вполне конкретной ситуации - пусть есть процедура, у которой в качестве формальных параметров выступают открытые массивы
PROCEDURE( a, b : ARRAY OF CHAR);
BEGIN
  a := b;
END;
в этом случае на этапе компиляции процудуры мы не сможем проверить допустимость присваивания т.к. фп - открытые массивы, т.е. их тип недоопределён в части размерности.
Также мы не сможем (по той же причине) проверить допустимость вызова процедуры с конкретными параметрами. Т.е. здесь сработает проверка только времени выполнения.
НО... к примеру, падение программы в этом случае, когда она выполняется на микроконтроллере, совершенно неверный подход, потому как может привести к непредсказуемым последствиям.
Поэтому в том же Активном Обероне и его предках выбрана другая стратегия - присваивания возможны всегда, но будет скопировано столько, сколько влезет в массив-приемник, без всяких трапов и остановов. И это правильная стратегия.
« Последнее редактирование: Март 31, 2013, 04:35:28 am от Kemet »