FPC 3.0 RC1 announced

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

kazalex писал(а):
Mikhail писал(а):Вот такой код будет работать?

Нет. Тут я вижу две ошибки:
1. Неправильная декларация типов строк
2. Передача в процедуру параметра не соответствующего типа

В остальном, всё должно компилироваться с кучей предупреждений.


Хорошо, а как правильно типы строк объявлять?
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

Код: Выделить всё

type
 String1251 = type AnsiString(1251);
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

kazalex писал(а):

Код: Выделить всё

type
 String1251 = type AnsiString(1251);

Гм, даже так? Ну тогда это вдвойне не нужно.
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

Mikhail писал(а):Гм, даже так? Ну тогда это вдвойне не нужно.

Декларация нового типа от существующего всегда такой была, для строк только параметр добавился. Никакой трагедии.
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

kazalex писал(а):
Mikhail писал(а):Гм, даже так? Ну тогда это вдвойне не нужно.

Декларация нового типа от существующего всегда такой была, для строк только параметр добавился. Никакой трагедии.

Нет. Всегда можно было ввести тип либо отдельно в разделе типов, либо непосредственно при объявлении переменной. Префикс type предотвращает создание псевдонима, т.е.

Код: Выделить всё

type String1251 = AnsiString(1251);

и

Код: Выделить всё

type String12 = AnsiString(1251);

это два разных несовместимых типа?
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

Mikhail писал(а):либо непосредственно при объявлении переменной

При декларации переменной новый тип определить нельзя. То есть:

Код: Выделить всё

var
 a : Array [0 .. 10] Of Byte;
 b : Array [0 .. 10] Of Byte;

Это не декларация типа, и если у нас будет процедура с параметром аналогичной сигнатуры, то ни одну из этих переменных туда передать не удастся.

Mikhail писал(а):то два разных несовместимых типа?

Да, это два разных типа. Но, компилятор достаточно умён чтобы не делать преобразований между ними.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

kazalex писал(а):

Код: Выделить всё

var
 a : Array [0 .. 10] Of Byte;
 b : Array [0 .. 10] Of Byte;

Это не декларация типа, и если у нас будет процедура с параметром аналогичной сигнатуры, то ни одну из этих переменных туда передать не удастся.

В смысле?

Код: Выделить всё

[doj@larion ~/temp]$ cat array_decl.pas
type
  t = array[0..10] of Byte;
var
  a: array[0..10] of Byte;

procedure Print1(const p: t);
begin
  Writeln(p[5]);
end;

procedure Print2(const p: array of Byte);
begin
  Writeln(p[6]);
end;

begin
  a[5] := 15;
  a[6] := 12;
  Print1(a);
  Print2(a);
end.
[doj@larion ~/temp]$ fpc array_decl.pas && ./array_decl
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
15
12
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

Дож
Это послабление диалекта FPC, в паскале с древних времён так делать нельзя (в FPC при {$mode delphi} тоже).
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

kazalex писал(а):Это послабление диалекта FPC, в паскале с древних времён так делать нельзя (в FPC при {$mode delphi} тоже).

Вы так говорите, будто у паскала есть некий общепризнанный стандарт («паскаль древних времён»), указывающий где можно и где нельзя декларировать типы :)
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

Дож писал(а):будто у паскала есть некий общепризнанный стандарт

Де-факто есть.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

kazalex писал(а):
Дож писал(а):будто у паскала есть некий общепризнанный стандарт

Де-факто есть.

Где с ним можно ознакомиться?
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

Дож писал(а):Где с ним можно ознакомиться?

TurboPascal -> ObjectPascal (Delphi). Этим де-факто и отличается от де-юре.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

kazalex писал(а):При сложении строк одного типа потеря данные невозможна по определению.
В том случае, если данные перед сложением не конвертируются.
Неверное предположение. Компилятор принимает решение о конвертировании исходя из информации о типе строк.
Верное. Потому что компилятор правит алгоритм программы. А вдруг программа должна складывать в ansistring строки в разных, в том числе в несуществующих, кодировках? Компилятор же возьмёт и поломает работу программы.
Сперва компилятор преобразует каждую из строк в юникод-представление, чтобы избежать потери данных

Это шутка такая? В Utf-8 большинство значений массива 0..2^48 не используются! А в ansistringe используется любая комбинация байтов которую в неё можно записать. Поэтому потери при такой технологии запланированы заранее.

Код: Выделить всё

Та часть символов, что не может быть представлена в этой кодировке будет заменена согласно стандарта на символ-заменитель, обычно это "?" для однобайтовых строк.

Порча информации на ровном месте, о которой программист компилятор совсем не просил. Говно такое перекодирование. Как его отключить?
Тут в другом вопрос, а зачем пытаться это делать, то есть зачем человеку в здравом уме писать

Управляющие символы очень даже нужны, а когда они пересекаются с теми символами что можно написать на клавиатуре или увидеть на экране, то происходят такие сопли как в баше, типа экранирований экранирований пробелов, наклонных чёрточек и неадекватного разбора текста.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Сквозняк, извините, но я не понимаю, что значит "любая комбинация байтов которую в неё можно записать" и кому такое извращение нужно. Если вы работаете с байтами, для этого есть TByte. А в строках надо хранить кодированные символы и не маяться неизвестно чем.
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

Ну не всегда нужна конвертация и конвертация через юникод неоптимальна. При грамотном постороении приложения строки с кодировкой просто не нужны. Это несколько облегчает написание спагетти-кода, поэтому это вредное нововведение.
Ответить