Ошибки PascalABC.NET

Oh Ho Ho It’s magic
You know
Never believe its not so
It’s magic
You know
1 лайк

А, понятно…

  writeln(0,'',@i);

\/

      Program.$intarr1[0] = (object) 0;
      Program.$intarr1[1] = (object) "";
      Program.$intarr1[2] = (object) new PointerOutput((void*) &num1);
      PABCSystem.PABCSystem.Writeln(Program.$intarr1);

Ну хорошо, но всё равно тогда надо сделать так же для Print.

И что с первым вопросом то?

" Неприличными словами не выражаться! " (с)

Не, я могу и на циле кинуть, но так по моему лучше))))

- Циля?
- Анцифер!
- Не важно, отбросим формальности...
   ( А. Белянин. Моя жена - ведьма)

Но всё же, как то изначальный вопрос ушёл далеко и остался не отвечен:

^p это ошибка

1 лайк

Кто помнит, была ли ошибка, связанная с наследованием автоклассов?

Сначала была enhancement с тем что авто класс вообще не наследуется и не может наследовать.

Потом была #907, но похоже что вы уже поняли что ошибка не в авто классах.

Так же есть ещё несколько интересных по этому запросу, в нескольких наследование это часть проблемы но не её фокус.

Да, спасибо. Нашел.

begin
  var a1 := new integer[3];
  var a2 := new array of integer[3];
end.

Первое работает а второе нет.
Зато это работает:

begin
  var a := new array of string[2][3];
end.

Как и ожидалось, тут у a тип array of array of string[2].

Это ошибка?

2 лайка

Ох ты, мерзость какая…

Это в глубоком прошлом мы пытались для коротких строк string[5] придумать синтаксис инициализации

var a := new короткаястрока[n]

Короткие строки оставлены только для совместимости и конечно они нам сильно мешают

Да, но в данном случае то инициализируется не короткая строка а массив. А “ошибка ли” я спрашивал про new array of integer[3]. Предполагается что оно будет работать как это:

var a2: array of array of integer;
SetLength(a2,3);
1 лайк

Я, кстати, вспомнил, где видел это - в C#.

Придумайте, как делать обмен с типизированными файлами, запись которых содержит несколько символьных полей - и можно короткие строки убирать.

А приведите ка пример, я что то не совсем понял как там короткие строки помогают…

Чтобы запись прочитать из файла или записать в файл, нужен буфер. У Паскаля длина буфера фиксирована и равна длине записи, подлежащей обработке. Если в записи есть символьные поля с неизвестной длиной, какой длины буфер должен быть? Компилятор не может рассчитать это.

type
  tR = record
    ID: integer;
    fam: string;
    nam: string;
    otch: string;
    adres: string;
    pol: boolean;
    godr: string
  end;

begin
  var buff: tR;
  
end.

Сколько байт отвести тут под буфер? И как потом прочитанную запись разбить по полям?

А если ручками через System.IO? Или здесь вдруг вспоминаем Дельфи?

1 лайк

А вообще я сейчас попытался зарыться в код, и там, оказывается, длинна коротких строк никуда не передаётся. И при чтении длинна строки определяется с помощью System.IO.BinaryReader.Read7BitEncodedInt (внутренняя функция), которая работает на чёрной магии, не иначе:

        internal protected int Read7BitEncodedInt() {
            // Read out an Int32 7 bits at a time.  The high bit
            // of the byte when on means to continue reading more bytes.
            int count = 0;
            int shift = 0;
            byte b;
            do {
                // Check for a corrupted stream.  Read a max of 5 bytes.
                // In a future version, add a DataFormatException.
                if (shift == 5 * 7)  // 5 bytes max per Int32, shift += 7
                    throw new FormatException(Environment.GetResourceString("Format_Bad7BitInt32"));

                // ReadByte handles end of stream cases for us.
                b = ReadByte();
                count |= (b & 0x7F) << shift;
                shift += 7;
            } while ((b & 0x80) != 0);
            return count;
        }

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

@Admin может вы прольете свет на всё это? Я совершенно не понимаю как кодируется длинна строки, сохраняется ли она в файле или откуда её вообще достаёт?!

Скорее всего, длина строки не сохраняется. Файл то текстовый. Вот если бы была сериализация, то да. Вобщем, Вы правы. Чёрная магия. :smile: