Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 45 46 47 48 49 [50] 51 52 53 54 .. 56   вперед  Ctrl
 Re: Топик "как я лажанулся"  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Неочевидный нюанс - PChar от пустой строки вовсе не nil!

var
  p: Pointer;
  s: string;
begin
  s := '';
  p := PChar(s);
  Debug(IntToStr(Integer(p))); // Debug Output: 4224380 Process pr.exe (3984)
  p := Pointer(s);
  Debug(IntToStr(Integer(p))); // Debug Output: 0 Process pr.exe (3984)
14 янв 20, 17:01    [22059044]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5397
Василий 2
Неочевидный нюанс - PChar от пустой строки вовсе не nil!

var
  p: Pointer;
  s: string;
begin
  s := '';
  p := PChar(s);
  Debug(IntToStr(Integer(p))); // Debug Output: 4224380 Process pr.exe (3984)
Ну да, магия компилятора. Сначала идет неявный вызов _UStrToPWChar
14 янв 20, 18:07    [22059115]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Поразмыслив, можно догадаться, что в этом есть некий смысл - ведь указатель на пустую строку это вполне себе нормальный ненулевой указатель на #0 где-то в памяти. Но при вызове API функций, принимающих непустые PChar либо NULL, может сработать не так, как ожидается
14 янв 20, 18:24    [22059126]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2731
Василий 2
Поразмыслив, можно догадаться, что в этом есть некий смысл - ведь указатель на пустую строку это вполне себе нормальный ненулевой указатель на #0 где-то в памяти. Но при вызове API функций, принимающих непустые PChar либо NULL, может сработать не так, как ожидается

Это специально сделано, чтобы пустая строка и в PChar была пустой строкой. Хотите nil - пишите PChar(Pointer(string)).
15 янв 20, 09:58    [22059455]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
KtoI
Member [заблокирован]

Откуда:
Сообщений: 20
Василий 2,

если смотреть в чистый космос очищенный от всего. То там останется материя. Всё логично, там где ты видишь нелогичность.
18 янв 20, 04:59    [22062071]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
KtoI
Василий 2,

если смотреть в чистый космос очищенный от всего. То там останется материя. Всё логично, там где ты видишь нелогичность.

Неочевидность, а не нелогичность
20 янв 20, 10:40    [22062884]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15038
вот так я ложанулся 22077252 с наследованием фреймов
думал, у меня два фрейма, а их оказалось три
11 фев 20, 15:40    [22077685]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
X11,

циклическая ссылка.
11 фев 20, 17:01    [22077750]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3788
X11,

налицо нарушение принципа kiss - сделай это проще, дурачек. все претензии с названием к авторам принципа если что :)

Сообщение было отредактировано: 11 фев 20, 20:32
11 фев 20, 20:31    [22077874]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
makhaon,

дурачОк.
11 фев 20, 23:26    [22077928]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Вечер сюрпризов

procedure TForm1.Button2Click(Sender: TObject);
var
  s: string;
  rb: RawByteString;
begin
  ShowMessage(IntToStr(StringCodePage(rb))); // 1251
  rb := '1';
  ShowMessage(IntToStr(StringCodePage(rb))); // кодировка проекта
  s := 'тест';
  rb := RawByteString(s);
  ShowMessage(IntToStr(StringCodePage(rb)));  // 1251
end;


Конечно, справка, которая не рекомендует применять переменные подобного типа, это всё хорошо, но что ж тогда применять-то?
5 мар 20, 19:02    [22093874]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Василий 2,

Просто разберись, что такое RawByteString, и не будет ни каких сюрпризов ;)
5 мар 20, 19:19    [22093896]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2731
Василий 2
но что ж тогда применять-то?

А что вам требуется и чем не устраивают AnsiString, Utf8String или какой-нибудь
GreekString = type Ansistring(1253)
?

Сообщение было отредактировано: 5 мар 20, 19:38
5 мар 20, 19:39    [22093910]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Kazantsev Alexey
Просто разберись, что такое RawByteString, и не будет ни каких сюрпризов ;)

По аналогии с объявлением type AnsiString(##) не ожидаешь особого поведения. Логика подсказывает, что кодовая страница должна сохраняться всегда, а вот фиг - на каждом присвоении сбрасывается. То есть это не RawByte string, а AnyCodePage string. Переменная типа RawByte в моем идеальном мире вообще не заботится о кодовой странице.
Ну и ещё неочевидный нюанс
var
  rb: RawByteString;
begin
  SetLength(rb, 1);
  ShowMessage(IntToStr(StringCodePage(rb))); // 1251 (ACP)


alekcvp
А что вам требуется и чем не устраивают AnsiString, Utf8String или какой-нибудь
GreekString = type Ansistring(1253)
?

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

P.S. TBytes не предлагать.
5 мар 20, 20:26    [22093948]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Василий 2
Логика подсказывает, что кодовая страница должна сохраняться всегда, а вот фиг - на каждом присвоении сбрасывается. То есть это не RawByte string, а AnyCodePage string.

Она и сохраняется. Просто не так, как ты думаешь. Доку читай:
http://docwiki.embarcadero.com/Libraries/Rio/en/System.RawByteString
RawByteString enables the passing of string data of any code page without doing any code page conversions.

Ну и дальше там, о применимости.
5 мар 20, 20:51    [22093960]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Василий 2
Тем, что мне нужна универсальная строка до применения кодировок.

Строка без кодировок это... UCS4String? Нет в дельфе таких строк.
5 мар 20, 20:55    [22093961]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
Kazantsev Alexey
Строка без кодировок это... UCS4String? Нет в дельфе таких строк.

Нет, обычный абстрактный MBCS с неизвестной кодировкой, где первые 127 символов гарантированно занимают по байту. AnsiString<0> или AnsiString<$ffff> - неважно.

Kazantsev Alexey
Она и сохраняется. Просто не так, как ты думаешь.

Она не сохраняется у переменной типа RawByteString. По факту, даже так сразу и не скажешь, как можно получить строку с кодовой страницей $ffff без SetCodePage. Всё время сбивается на ACP.
6 мар 20, 11:05    [22094311]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2731
Василий 2
Логика подсказывает, что кодовая страница должна сохраняться всегда, а вот фиг - на каждом присвоении сбрасывается. То есть это не RawByte string, а AnyCodePage string. Переменная типа RawByte в моем идеальном мире вообще не заботится о кодовой странице.
Кому не должна? У кого занимала?
Логично, что она сохраняет ту страницу, текст в которой ей присвоили, как иначе?

Василий 2
Тем, что мне нужна универсальная строка до применения кодировок.
Что такое в вашем понимании "универсальная строка"? Вот в ней лежит текст в кодировке ansi, вы ей присваиваете строку с кодировкой utf8 - она что должна сделать? Перекодировать utf8 в ansi? Сохранить текст в utf8, но считать что это ansi? Сохранить текст и запомнить что это utf8?

Василий 2

P.S. TBytes не предлагать.
PAnsiChar - никаких кодировок, никаких подсчётов ссылок, всё как вы хотели.
6 мар 20, 11:09    [22094314]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2731
Василий 2
Kazantsev Alexey
Строка без кодировок это... UCS4String? Нет в дельфе таких строк.

Нет, обычный абстрактный MBCS с неизвестной кодировкой, где первые 127 символов гарантированно занимают по байту.

ShortString? Не помню, перекодируются они или нет?..
6 мар 20, 11:10    [22094317]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4988
Василий 2
Нет, обычный абстрактный MBCS с неизвестной кодировкой, где первые 127 символов гарантированно занимают по байту

Для чего тебе это? Чем не устраивают имеющиеся строки?

Василий 2
Она не сохраняется у переменной типа RawByteString. По факту, даже так сразу и не скажешь, как можно получить строку с кодовой страницей $ffff без SetCodePage

RawByteString сохраняет кодовую страницу присваиваемых ей строк. Это просто хранилище любых long strings, не требующее преобразований.
6 мар 20, 11:28    [22094338]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1780
Вызвал метод sort() у TStringList и посчитал, что этого достаточно, чтобы свойство sorted стало true... :)
19 май 20, 17:22    [22135952]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 587
Напоролся тут на фатальный вылет программы - до экрана "Работа программы была прекращена", хотя все try-except обернуты и App.OnException тоже. При этом дополнительно вспухал мессаджбокс с сообщением об исключении типа TFreedObject от FastMM.

Обнаружил, что причина - это перевызов исключения конструкцией
except on E: Exception do
...
  raise E; // а должно быть просто "raise;"

которая выкидывает объект исключения после его удаления, что ловит FastMM, подставляя вместо удаленного объекта свой, в результате чего raise кидает именно его, а Application.HandleException не пропускает его в OnException из-за проверки "if O is Exception", передавая в System.SysUtils.ShowException, который и выкидывает мессаджбокс.
А если не использовать FastMM с режимом детектирования, то исключение может просто пропасть
procedure Pr();
begin
  try
    raise Exception.Create('Error Message');
  except on E: Exception do
    raise E;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Pr; // ничего не выдаст
end;
2 ноя 20, 15:01    [22224951]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64874
Блог
Fr0sT-Brutal,

угу. Другая веселуха - что оператор raise вполне понимает аргументом и то, что не является Exception. Например, можно написать

raise TButton.Create(nil);


или

raise Exception('Shit happens');


Тогда тоже бывают забавные эффекты.
2 ноя 20, 15:12    [22224963]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
softwarer
оператор raise вполне понимает аргументом и то, что не является Exception
Ну да. Переменная ExceptObject имеет тип TObject
softwarer
raise Exception('Shit happens');
Ну приведение типов всегда было на совести программиста
2 ноя 20, 17:02    [22225106]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 587
softwarer
угу. Другая веселуха - что оператор raise вполне понимает аргументом и то, что не является Exception.

Да, неочевидно. Хотя это пригождается, если хочется сделать код с исключениями, но без SysUtils для минимизации бинарника
2 ноя 20, 18:33    [22225198]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 45 46 47 48 49 [50] 51 52 53 54 .. 56   вперед  Ctrl
Все форумы / Delphi Ответить