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

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Строки в О7
« Ответ #75 : Март 31, 2013, 05:56:48 pm »
вы впадаете в ошибку Кемета...
Да с чего бы я впадал в ошибку, я Вам говорю, что это тип ФОРМАЛЬНОГО параметра, а не тип переменной. Переменных такого типа нет (может быть указатель на открытый массив). Это специальный тип, как NIL, например

DddIzer

  • Гость
Re: Строки в О7
« Ответ #76 : Март 31, 2013, 05:58:23 pm »
отчасти.. но также, я считаю что, по крайней мере, если все сущности и вызовы процедуры находятся в рамках одного модуля - проверить  присваивание можно...
Как? Вот простой пример:
PROCEDURE Assign( VAR a, b : ARRAY OF CHAR );
BEGIN
  a := b;
END Assign;
Как здесь проверить "правильность" присваивания? Ведь как раз исходя из семантики открытого массива это присваивание всегда допустимо.
Вообще если нужно проконтролировать "правильность" присваивания, то использование для этого открытых массивов совершенно неверный подход, они как раз создавались совершенно для другого - чтобы обойти такую проверку на уровне компиляции.
проверяется не определение функции - c ним все ОК, а ее вызов в этом же модуле Assign(A,B); - A,B - фактические массивы.

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Строки в О7
« Ответ #77 : Март 31, 2013, 09:20:12 pm »
PROCEDURE Test (VAR a, b, c: ARRAY OF INTEGER);
VAR
  Joke: INTEGER;

BEGIN
  Joke := Random();
  IF Joke = 1 THEN a:=b ELSIF Joke = 2 THEN a:=c ELSE c:=b END;
END;

VAR
  a: ARRAY 3 OF INTEGER;
  b: ARRAY 4 OF INTEGER;
  c: ARRAY 5 OF INTEGER;

BEGIN
  Test(a, b, c); // Как проверить правильность вызова?
END Module.

DddIzer

  • Гость
Re: Строки в О7
« Ответ #78 : Март 31, 2013, 10:05:17 pm »
А в чем проблема... ни одно из присваиваний в процедуре в данном вызове не валидно. (и БЕЗ РАЗНИЦЫ выполняется код конкретного присваивания или нет),  компилируемый текст есть в наличии, размеры массивов известны (тут ... достаточно просто проверить все присваивания в ТЕКСТЕ процедуры)... другое дело, если эта процедура была бы определена в другом (откомпилированном модуле), а вызывалась бы в текущем (но я и НЕ УТВЕРЖДАЛ, что подобная проверка ВСЕГДА возможна) -я говорил, что оптимально будет если это возможно , то компайл тайм, если нет - рантайм.... впрочем я в 3 раз повторяюсь.

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Строки в О7
« Ответ #79 : Апрель 01, 2013, 09:44:17 am »
Ну вот и не соглашусь с вами.

PROCEDURE Random (): INTEGER;
BEGIN
  RETURN 3;
END Random;

И код должен компилироваться. В противном случае функциональность открытых массивов несправедливо урезается, вдобавок ещё и завязывается на проверки в рамках только одного модуля. Это очень странно. Наконец, если процедура вызывает процедуру, которая вызывает процедуру, то вся информация о начальных размерах потеряется (или придётся анализировать в глубину).

DddIzer

  • Гость
Re: Строки в О7
« Ответ #80 : Апрель 01, 2013, 09:53:24 am »
Ну вот и не соглашусь с вами.

PROCEDURE Random (): INTEGER;
BEGIN
  RETURN 3;
END Random;

И код должен компилироваться. В противном случае функциональность открытых массивов несправедливо урезается, вдобавок ещё и завязывается на проверки в рамках только одного модуля. Это очень странно. Наконец, если процедура вызывает процедуру, которая вызывает процедуру, то вся информация о начальных размерах потеряется (или придётся анализировать в глубину).
Что урезается ? - с процедурой (все ОК) , а вот  вызов ее с неверными параметрами в данном случае можно определить во время компиляции..

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Строки в О7
« Ответ #81 : Апрель 01, 2013, 08:59:18 pm »

DddIzer

  • Гость
Re: Строки в О7
« Ответ #82 : Апрель 02, 2013, 05:29:46 am »