Странная работа программ после обновления на 3.2.0

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

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

Странная работа программ после обновления на 3.2.0

Сообщение GAMER » 22.01.2021 16:48:52

Обратил внимание, что ряд моих программ перекомпилированых под fpc 3.2.0 (FreeBSD) вдруг начали глючить. Немного подебажив - обратил внимание, что коряво работает работа с строками AnsiString.
То простое присваивание строк выжирает всю память и падает своп-раздел, то присваевается пустая строка, хотя в присвоении не пусто. Тот же код, откомпилированый на старой версии рабоатет нормально. Кто-то с таким еще сталкивался?
Под виндой все нормально.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Странная работа программ после обновления на 3.2.0

Сообщение Ichthyander » 22.01.2021 18:36:08

Не сталкивался. Практически всегда юззаю обычные строки String. В особых случаях приходилось выбирать кодировку для строки принудительно. В остальном все стандартно: Windows и Linux - полет нормальный
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Странная работа программ после обновления на 3.2.0

Сообщение Vadim » 23.01.2021 04:48:56

GAMER
У меня опыт программирования во FreeBSD не очень большой, но каких либо странных глюков не замечал. Один глюк был связан с установкой FPC 3.2, я его тут где-то описывал - если запустить инсталяционный скрипт, начинают глючить сторонние приложения и библиотеки, которые до этого работали прекрасно. Видимый симптом - вроде как спутана разрядность, хотя разрядность правильная. А вот если установку FPC проводить просто распаковывая архивы дистрибутива, то никаких глюков не наблюдалось. Проверьте у себя, возможно у Вас проблема тоже решиться таким вот бубном... :-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Странная работа программ после обновления на 3.2.0

Сообщение GAMER » 25.01.2021 11:20:49

Попробую в сорсах заменить AnsiString на String. Проверю, как оно себя будет вести.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Странная работа программ после обновления на 3.2.0

Сообщение Снег Север » 25.01.2021 15:52:24

String is an alias for ShortString, AnsiString or Unicodestring (UTF16) depending on a compiler setting.

If compiler directive {$H} or compiler directive {$LongStrings} has been used with an "on" parameter ( {$H+} or {$LongStrings ON} ), then a String type is the same as an AnsiString type, if not ( {$H-} or {$LongStrings OFF} ), it is a ShortString type. What String is an alias for can also be set by the -Sh command line option. FPC also supports {$mode delphiunicode} for Delphi compatible UTF16 support.


NOTE: The {$mode} compiler directive will also set the String alias. After the compiler mode is set to FPC (the default), ObjFPC, MacPAS or TP, String will be an alias for ShortString. After the compiler mode is set to Delphi, String will be an alias for AnsiString. So the String alias setting should be made following the compiler mode setting to prevent it from being overridden:

{$H+} // String is an alias for AnsiString
{$mode ObjFPC} // also affects String alias - String is now an alias for ShortString
{$H+} // String is now an alias for AnsiString
A String variable declared with a length specifier will always be a ShortString regardless of the compiler setting for String alias.

https://wiki.freepascal.org/String
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Странная работа программ после обновления на 3.2.0

Сообщение GAMER » 26.01.2021 11:47:03

Я правильно понимаю, что {$mode ObjFPC} в каких-то модулях (не моих) может переключить String на другой тип?
А как сделать, чтобы String был везде AnsiString?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Странная работа программ после обновления на 3.2.0

Сообщение Снег Север » 26.01.2021 13:39:56

Например, поставить во всех модулях директиву {$H+}
Гляньте еще ключи компиляции - там тоже должен быть отвечающий за установку типа строк.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Странная работа программ после обновления на 3.2.0

Сообщение GAMER » 26.01.2021 17:57:47

Просмотрел код. У меня так и уже давно. Я так понимаю, это противоречивые директивы в плане работы со строками?
Код: Выделить всё
{$mode objfpc}{$H+}
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Странная работа программ после обновления на 3.2.0

Сообщение Vadim » 27.01.2021 02:57:03

GAMER
Нет, не противоречивые. Если явно стоит {$H+}, то при любых других опциях компилятора всегда будет подразумеваться, что "string = AnsiString".
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Странная работа программ после обновления на 3.2.0

Сообщение GAMER » 27.01.2021 11:46:48

Тогда, похоже, что-то поломалось в новых версиях под FreeBSD. Только явно отловить сложно, где именно.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Странная работа программ после обновления на 3.2.0

Сообщение Ichthyander » 28.01.2021 11:37:04

Какой менеджер памяти кстати используется для потоков? Используется cthreads, cmem?
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Странная работа программ после обновления на 3.2.0

Сообщение GAMER » 28.01.2021 14:06:14

{$IFDEF UNIX}
cthreads,
cmem,
{$ENDIF}
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Странная работа программ после обновления на 3.2.0

Сообщение Сквозняк » 01.03.2021 18:41:10

Пришёл к выводу, что на новых версиях компилятора вместо ansistring нужно использовать rawbytestring и не мучаться, а если в винде используется консоль и несколько кодировок внутри программы, то иногда запускать в ней процесс типа
'cmd.exe /c chcp 866'

а после сделать контрольный выстрел и вызвать процедуру
Код: Выделить всё
setconsolecp(866);

для гарантированного переключения перекодировки команд системой в нужную кодировку.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Странная работа программ после обновления на 3.2.0

Сообщение GAMER » 02.03.2021 11:27:06

Я нашел старую версию fpc и Лазарус на фряхе и компилирую там. Тогда проблем нет.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Странная работа программ после обновления на 3.2.0

Сообщение wavebvg » 03.03.2021 10:45:04

Подтверждаю, тоже самое на trunc-е. "Раньше такого не было". Проблема возникает очень нерегулярно.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

Рейтинг@Mail.ru