FPC 3.0 RC1 announced

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

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

Re: FPC 3.0 RC1 announced

Сообщение Mikhail » 06.09.2015 21:49:35

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

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

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


Хорошо, а как правильно типы строк объявлять?
Mikhail
энтузиаст
 
Сообщения: 544
Зарегистрирован: 24.10.2013 16:06:47

Re: FPC 3.0 RC1 announced

Сообщение kazalex » 06.09.2015 21:53:15

Код: Выделить всё
type
String1251 = type AnsiString(1251);
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: FPC 3.0 RC1 announced

Сообщение Mikhail » 06.09.2015 22:00:10

kazalex писал(а):
Код: Выделить всё
type
String1251 = type AnsiString(1251);

Гм, даже так? Ну тогда это вдвойне не нужно.
Mikhail
энтузиаст
 
Сообщения: 544
Зарегистрирован: 24.10.2013 16:06:47

Re: FPC 3.0 RC1 announced

Сообщение kazalex » 06.09.2015 22:09:23

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

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

Re: FPC 3.0 RC1 announced

Сообщение Mikhail » 06.09.2015 22:17:22

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

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

Нет. Всегда можно было ввести тип либо отдельно в разделе типов, либо непосредственно при объявлении переменной. Префикс type предотвращает создание псевдонима, т.е.
Код: Выделить всё
type String1251 = AnsiString(1251);

и
Код: Выделить всё
type String12 = AnsiString(1251);

это два разных несовместимых типа?
Mikhail
энтузиаст
 
Сообщения: 544
Зарегистрирован: 24.10.2013 16:06:47

Re: FPC 3.0 RC1 announced

Сообщение kazalex » 06.09.2015 23:12:44

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

При декларации переменной новый тип определить нельзя. То есть:
Код: Выделить всё
var
a : Array [0 .. 10] Of Byte;
b : Array [0 .. 10] Of Byte;

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

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

Да, это два разных типа. Но, компилятор достаточно умён чтобы не делать преобразований между ними.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: FPC 3.0 RC1 announced

Сообщение Дож » 07.09.2015 10:13:35

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
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 863
Зарегистрирован: 12.10.2008 16:14:47

Re: FPC 3.0 RC1 announced

Сообщение kazalex » 07.09.2015 11:53:51

Дож
Это послабление диалекта FPC, в паскале с древних времён так делать нельзя (в FPC при {$mode delphi} тоже).
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: FPC 3.0 RC1 announced

Сообщение Дож » 07.09.2015 14:22:36

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

Вы так говорите, будто у паскала есть некий общепризнанный стандарт («паскаль древних времён»), указывающий где можно и где нельзя декларировать типы :)
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 863
Зарегистрирован: 12.10.2008 16:14:47

Re: FPC 3.0 RC1 announced

Сообщение kazalex » 07.09.2015 14:27:45

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

Де-факто есть.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: FPC 3.0 RC1 announced

Сообщение Дож » 07.09.2015 14:30:13

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

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

Где с ним можно ознакомиться?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 863
Зарегистрирован: 12.10.2008 16:14:47

Re: FPC 3.0 RC1 announced

Сообщение kazalex » 07.09.2015 14:33:05

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

TurboPascal -> ObjectPascal (Delphi). Этим де-факто и отличается от де-юре.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: FPC 3.0 RC1 announced

Сообщение Сквозняк » 07.09.2015 21:16:04

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

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

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

Управляющие символы очень даже нужны, а когда они пересекаются с теми символами что можно написать на клавиатуре или увидеть на экране, то происходят такие сопли как в баше, типа экранирований экранирований пробелов, наклонных чёрточек и неадекватного разбора текста.
Сквозняк
энтузиаст
 
Сообщения: 800
Зарегистрирован: 29.06.2006 22:08:32

Re: FPC 3.0 RC1 announced

Сообщение Снег Север » 07.09.2015 22:03:00

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

Re: FPC 3.0 RC1 announced

Сообщение Mikhail » 07.09.2015 22:27:24

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

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 8

Рейтинг@Mail.ru