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

DddIzer

  • Гость
Re: Строки в О7
« Ответ #45 : Март 31, 2013, 07:22:50 am »
Не понимаю а в чем проблема... динамических массивов нет, размеры известны на этапе компиляции, проверяй  себе на здоровье....
Так не известны - у процедуры в параметрах ОТКРЫТЫЕ массивы, т.е. "безразмерные"
  ну и что когда можно  проверить - компайл - тайм ошибка (если вызов происходит в рамках модуля где определен  фактический массив), иначе ран-тайм... абсолютно также вы не сможете  определится во время компиляции и с  банальным
arr:=m.arr (в секции загрузки основного модуля) если m.arr - определен в некотором модуле m (который вызывается динамически)
Я говорю о вполне конкретной ситуации - пусть есть процедура, у которой в качестве формальных параметров выступают открытые массивы
PROCEDURE( a, b : ARRAY OF CHAR);
BEGIN
  a := b;
END;
в этом случае на этапе компиляции процудуры мы не сможем проверить допустимость присваивания т.к. фп - открытые массивы, т.е. их тип недоопределён в части размерности.
Также мы не сможем (по той же причине) проверить допустимость вызова процедуры с конкретными параметрами. Т.е. здесь сработает проверка только времени выполнения.
НО... к примеру, падение программы в этом случае, когда она выполняется на микроконтроллере, совершенно неверный подход, потому как может привести к непредсказуемым последствиям.
Поэтому в том же Активном Обероне и его предках выбрана другая стратегия - присваивания возможны всегда, но будет скопировано столько, сколько влезет в массив-приемник, без всяких трапов и остановов. И это правильная стратегия.
Понял.. вы просто говорите про ДРУГУЮ возможность реализации - почему бы  и нет ..  если , как говорится это makes the difference... просто, с моей точки зрения, вылет программы одинаково  одинаково нежелателен - будь он вследствие  деления на ноль, или неаккуратной работой с памятью. Но все- таки , если не трудно поясните почему невозможно в принципе проверить на этапе компиляции КОНКРЕТНЫЙ вызов этой функции (с конкретными параметрами) - ибо размеры фактических параметров(количество элементов в передаваемых массивах) известны на этапе компиляции..

DddIzer

  • Гость
Re: Строки в О7
« Ответ #46 : Март 31, 2013, 11:45:10 am »
кстати, правильно ли я понял, что фактическую длину строки хранящейся в массиве символов  считать приходится ручками?

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Строки в О7
« Ответ #47 : Март 31, 2013, 12:52:32 pm »
кстати, правильно ли я понял, что фактическую длину строки хранящейся в массиве символов  считать приходится ручками?

Смотря где. В Astrobe есть встроенная функция LENGTH, работает аналогично функции strlen си.

DddIzer

  • Гость
Re: Строки в О7
« Ответ #48 : Март 31, 2013, 12:54:50 pm »
в стандарте О7... verily.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Строки в О7
« Ответ #49 : Март 31, 2013, 01:37:46 pm »
Но все- таки , если не трудно поясните почему невозможно в принципе проверить на этапе компиляции КОНКРЕТНЫЙ вызов этой функции (с конкретными параметрами) - ибо размеры фактических параметров(количество элементов в передаваемых массивах) известны на этапе компиляции..
эээ, мы же говорим об открытых массивах в качестве формальных параметров.
а открытые массивы потому и открытые, что их определение не завершено, это, если можно так сказать, обобщённые массивы, без них пришлось бы на каждую размерность писать свою персональную процедуру,
PROCEDURE( a, b : ARRAY 2 OF CHAR )
PROCEDURE( a, b : ARRAY 3 OF CHAR )
вместо этого мы пишем обобщенную процедуру
PROCEDURE( a, b : ARRAY OF CHAR )
Соответственно и длины массивов формальных параметров при компиляции процедуры типа
PROCEDURE( a, b : ARRAY OF CHAR );
BEGIN
  a := b;
END
в присваивании мы проверить не сможем, потому что тип - открытый массив, у которых длину во время компиляции узнать невозможно в принципе, по причине отсутствия.
При вызове такой процедуры на этапе компиляции мы также ничего проконтролировать не сможем, иначе теряется смысл введения параметров-открытых(обобщённых) массивов.
Поэтому и остаётся или контроль в рантайме с трапами/остановами или копировать столько, сколько влезет.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Строки в О7
« Ответ #50 : Март 31, 2013, 01:43:01 pm »
Поэтому в том же Активном Обероне и его предках выбрана другая стратегия - присваивания возможны всегда, но будет скопировано столько, сколько влезет в массив-приемник, без всяких трапов и остановов. И это правильная стратегия.

Правильная стратегия - это когда после присваивания слева получается то же, что и справа. Все остальные варианты поведения делают сопровождающему программисту плохо :) С тем же успехом можно разрешить присваивание VAR параметров рекордов базовых типов с автоматическим привидением к полному типу и падением/игнорированием, если типы не совпадают.
Применительно к открытым массивам присваивание можно было бы разрешить, если массив мог менять свой размер. Тогда слева получался бы такой же массив как и справа (с тем же размером), без падений и удивлений на тему "а если больше, а если меньше".

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Строки в О7
« Ответ #51 : Март 31, 2013, 02:15:16 pm »
Применительно к открытым массивам присваивание можно было бы разрешить, если массив мог менять свой размер.
это было бы глупо, потому-что параметр-открытый массив это фактически статический массив, тип которого определён и известен на этапе компиляции.
Изменение размера - это изменение типа массива, что идля статического типа мягко говоря неправильно.
Ну и как физически изменить размер статического массива? Память под него выделена однократно и её размер фиксирован.
Открытый массив это же не динамический массив

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Строки в О7
« Ответ #52 : Март 31, 2013, 02:29:42 pm »
это было бы глупо, потому-что параметр-открытый массив это фактически статический массив, тип которого определён и известен на этапе компиляции.
Изменение размера - это изменение типа массива, что идля статического типа мягко говоря неправильно.
Ну и как физически изменить размер статического массива? Память под него выделена однократно и её размер фиксирован.
Открытый массив это же не динамический массив

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

P.S. Кстати, на моей практике как раз чаще всего встречается последний вариант. Так что вообще всю идею неизменности размера массива (при невозможность по месту создать новый массив нужно размера) я считаю осмысленной только с точки зрения микроконтроллеров.
« Последнее редактирование: Март 31, 2013, 02:34:04 pm от vlad »

DddIzer

  • Гость
Re: Строки в О7
« Ответ #53 : Март 31, 2013, 02:31:54 pm »


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

это я слышал, но ни как не могу понять в чем выражается эта потеря..- разве есть осмысленные варианты присваивания массивов разных размеров (если это не массив символов)

DddIzer

  • Гость
Re: Строки в О7
« Ответ #54 : Март 31, 2013, 02:40:28 pm »
и еще  более внимательно посмотрел на ваш вариант процедуры.. от оригинала Алексея он отличается отсутствием  VAR... вопрос в этом случае следует создавать локальные копии фактических массивов или нет?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Строки в О7
« Ответ #55 : Март 31, 2013, 03:01:41 pm »
и еще  более внимательно посмотрел на ваш вариант процедуры.. от оригинала Алексея он отличается отсутствием  VAR... вопрос в этом случае следует создавать локальные копии фактических массивов или нет?
Это я ошибся, там должен быть VAR, конечно.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Строки в О7
« Ответ #56 : Март 31, 2013, 03:15:42 pm »


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

это я слышал, но ни как не могу понять в чем выражается эта потеря..- разве есть осмысленные варианты присваивания массивов разных размеров (если это не массив символов)
Потеря чего? Смысла введения параметров-открытых массивов?
Так они и были введены для того, чтобы можно было в одну процедуру передавать массивы без привязки к длине, главное чтобы тип элементов совпадал.
Большого смысла присваивать массивы разной длины нет, тем более что это в Оберонах запрещено, потому что тип массивов  в этом случае не совпадёт ( тип массива определяется типом элемента и размерностью ).
Но тип открытого массива определяется только типом его элементов. Поэтому на этапе компиляции проверяется только это соответствие. Соответствие длин мы узнаем только в точке присваивания в момент выполнения, а что при этом делать - валиться с трапом или скопировать максимально возможное количество элементов - это уже детали реализации.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Строки в О7
« Ответ #57 : Март 31, 2013, 03:22:12 pm »
(если это не массив символов)
мы о массивах символов и говорим

DddIzer

  • Гость
Re: Строки в О7
« Ответ #58 : Март 31, 2013, 03:40:16 pm »
(если это не массив символов)
мы о массивах символов и говорим.
ну нет Алексей, переключился на массивы целых чисел....

DddIzer

  • Гость
Re: Строки в О7
« Ответ #59 : Март 31, 2013, 03:43:33 pm »
Но тип открытого массива определяется только типом его элементов.
НЕТ, в моем понимании, понятия типа открытого массива - есть передача массива в процедуру, использующая семантику открытого массива (открытый массив - это не тип).