Oh Ho Ho It’s magic
You know
Never believe its not so
It’s magic
You know
А, понятно…
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 это ошибка
Кто помнит, была ли ошибка, связанная с наследованием автоклассов?
Сначала была 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]
.
Это ошибка?
Ох ты, мерзость какая…
Это в глубоком прошлом мы пытались для коротких строк string[5] придумать синтаксис инициализации
var a := new короткаястрока[n]
Короткие строки оставлены только для совместимости и конечно они нам сильно мешают
Да, но в данном случае то инициализируется не короткая строка а массив. А “ошибка ли” я спрашивал про new array of integer[3]
. Предполагается что оно будет работать как это:
var a2: array of array of integer;
SetLength(a2,3);
Я, кстати, вспомнил, где видел это - в 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.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 может вы прольете свет на всё это? Я совершенно не понимаю как кодируется длинна строки, сохраняется ли она в файле или откуда её вообще достаёт?!
Скорее всего, длина строки не сохраняется. Файл то текстовый. Вот если бы была сериализация, то да. Вобщем, Вы правы. Чёрная магия.