> -- Info21 писал(а):
> Пож., суммируйте суть в двух словах, раз уж Вы продрались сквозь альтернативные истерики.Если создать расширяемый тип и два потомка, то в секции WITH, отвечающей за обработку конкретного потомка переменной, невозможно присвоить этой переменной указатель на другого потомка, что очень правильно, так как может привести к ошибке, мы ведь в этой секции только с первым потомком собирались работать! Обычно, компилятор выдает ошибку и отказывается собирать программу. Кроме случая который нашел ilovb. Если в WITH передавать указатель через переменный аргумент отдельной функции. В этом случае компиляция происходит, но работа приложения приводит к ошибке работы с памятью. Блек бокс в конвульсиях умирает (самый страшный случай пока из которых я видел... поэтому считаю резонным выдавать предупреждение, но лучше конечно, чтобы тоже запрещалась компиляция. Но я пока не умею работать с маркерами ошибок и т.п.

Вот накидал для разъяснения несколько модифицированный пример ilovb
## Код:
```
MODULE Test2;
   IMPORT Out;

   TYPE
      R0 = POINTER TO  EXTENSIBLE RECORD END;
      R1 = POINTER TO RECORD (R0) a: ARRAY 100 OF CHAR END;
      R2 = POINTER TO RECORD (R0) END;

   VAR
      globalPointer: R0;
      r1: R1;
      r2: R2;

   PROCEDURE Print (x: R0);
   BEGIN
      IF x IS R1 THEN Out.String("R1"); Out.Ln
      ELSIF x IS R2 THEN Out.String("R2"); Out.Ln END
   END Print;

   PROCEDURE Yes*;
   BEGIN
      NEW(r1);
      globalPointer :=  r1;
      
      WITH globalPointer: R1 DO 
         Print(globalPointer);
         NEW(r2);
         (* globalPointer := r2;  такую операцию собрать невозможно, выдается ошибка *)
         Print(globalPointer); globalPointer.a := "jsdfdfkjghdfkdfghkjdffhgkjdhfgkjhdfkjghdfk";
      END
   END Yes;

   PROCEDURE Not (VAR localPointer: R0);
   BEGIN
      WITH localPointer: R1 DO 
         Print(localPointer);
         NEW(r2);
         globalPointer := r2; (* А такую собрать можно, и будет ошибка работы с памятью *)
         Print(localPointer); localPointer.a := "jsdfdfkjghdfkdfghkjdffhgkjdhfgkjhdfkjghdfk";
      END
   END Not;
   
   PROCEDURE CrashTest*;
   BEGIN
      NEW(r1);
      globalPointer :=  r1;
      Not(globalPointer);
   END CrashTest;

BEGIN
END Test2.

^Q Test2.CrashTest
```
