Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 35 36 37 38 39 40 [41] 42 43 44   вперед  Ctrl
 Re: Топик "как я лажанулся"  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2160
Фэйтл Эра
мораль: а вот нехер с булевыми константами сравнивать.
Мораль тут - нехер неинициализированные переменные с мусором юзать
7 дек 18, 16:40    [21757305]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
white_nigger
Фэйтл Эра
мораль: а вот нехер с булевыми константами сравнивать.
Мораль тут - нехер неинициализированные переменные с мусором юзать

Это не мораль, а религия, тут даже многие "бывалые" уверены, что локальные переменные любых типов волшебным образом инициализируются, да еще и как-то долгие годы живут с этим.
7 дек 18, 16:45    [21757322]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6227
Фэйтл Эра,

Бывалые страдают разумной паранойей и не полагаются на то, что "что-то где-то превращается", а делают принудительную инициализацию ручками.
7 дек 18, 16:50    [21757334]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Василий 2
Member

Откуда:
Сообщений: 700
Boolean это не "0 и 1", а "0 и Нечто-не-0". С этим можно напороться, да.
7 дек 18, 17:26    [21757394]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Фэйтл Эра
Member

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

да, на ноль можно опираться, остальное - туман.
Тем не менее, вполне надежная схема.
7 дек 18, 18:18    [21757469]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
То есть, сравнивать с булевскими константами можно, но не со всеми. :)

Хотя, даже с false сравнивать весьма тупо.
7 дек 18, 18:21    [21757472]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 1485
Cane Cat Fisher
  if test1 then
    ShowMessage('test1 = True')
  else
    ShowMessage('test1 = False');

  if test2 then
    ShowMessage('test2 = True')
  else
    ShowMessage('test2 = False');


А если написать:
  if test1 = true then
    ShowMessage('test1 = True')
  else
    ShowMessage('test1 = False');

  if test2 = true then
    ShowMessage('test2 = True')
  else
    ShowMessage('test2 = False');

Интересно, что выведет?.. Потому что Byte(true) = 1.
7 дек 18, 19:40    [21757561]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1800
alekcvp
А если написать:
  if test1 = true then
    ShowMessage('test1 = True')
  else
    ShowMessage('test1 = False');

  if test2 = true then
    ShowMessage('test2 = True')
  else
    ShowMessage('test2 = False');

Интересно, что выведет?.. Потому что Byte(true) = 1.


Тогда выводит противоположную чушь:

test1=False
test2=False
test1<>test2

Для меня новостью было не то, что неинициализированая переменная содержит мусор, а то, что в нашем строго типизированном мире булевы переменные могут вести себя так коварно. Ладно мусор, но мусор - это либо 0, либо не 0, и ожидалось, что в любой логической операции это будет либо False либо True соответственно, и после a := not b переменные будут противоположны. А то, что компилятор пропускает такое, что после a := not b обе переменные a и b одинаковы - вот это засада.
9 дек 18, 20:05    [21758564]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 1485
Cane Cat Fisher
Для меня новостью было не то, что неинициализированая переменная содержит мусор, а то, что в нашем строго типизированном мире булевы переменные могут вести себя так коварно. Ладно мусор, но мусор - это либо 0, либо не 0, и ожидалось, что в любой логической операции это будет либо False либо True соответственно, и после a := not b переменные будут противоположны. А то, что компилятор пропускает такое, что после a := not b обе переменные a и b одинаковы - вот это засада.

Ну это было ожидаемо. Т.к. Byte(False) = 0, Byte(True) = 1, а Boolean переменная = по-факту byte. Поэтому "if BooleanVar then" компилятор интерпретирует как "BooleanVar <> False", но при этом сравнивает он по значению. Можно считать недоработкой, но мораль всё та же: инициализируйте переменные :)
9 дек 18, 21:52    [21758614]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1555
Cane Cat Fisher
Для меня новостью было не то, что неинициализированая переменная содержит мусор, а то, что в нашем строго типизированном мире булевы переменные могут вести себя так коварно. Ладно мусор, но мусор - это либо 0, либо не 0, и ожидалось, что в любой логической операции это будет либо False либо True соответственно, и после a := not b переменные будут противоположны. А то, что компилятор пропускает такое, что после a := not b обе переменные a и b одинаковы - вот это засада.

Все там в порядке.. Надо читать документацию.
var
  a: Boolean;
begin
  a := Boolean(20);
  a := not a;
  a := Boolean(1);
  a := not a;
end;


Аналогично
q: Byte;
  q := 20;
  q := q xor 1; // 21
  q := 1;
  q := q xor 1; // 0


Unit2.pas.82: a := Boolean(20);
005F074F C645EB14         mov byte ptr [ebp-$15],$14
Unit2.pas.83: a := not a;
005F0753 8A45EB           mov al,[ebp-$15]
005F0756 3401             xor al,$01
005F0758 8845EB           mov [ebp-$15],al
Unit2.pas.84: a := Boolean(1);
005F075B C645EB01         mov byte ptr [ebp-$15],$01
Unit2.pas.85: a := not a;
005F075F 8A45EB           mov al,[ebp-$15]
005F0762 3401             xor al,$01
005F0764 8845EB           mov [ebp-$15],al


Boolean - это байтовая переменная. Если там лежит 1 или 0 то ведет себя она предсказуемо.
А если там лежит 2 - 255, то ведет себя как ByteBool
Вот только компилятор при компиляции не понимает что a := Boolean(20); надо заменить на a := Boolean(1);
9 дек 18, 22:03    [21758617]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Василий 2
Member

Откуда:
Сообщений: 700
Да про неиниц переменную любого типа можно придумать множество дивных случаев.
10 дек 18, 10:44    [21758863]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 1485
Делал свой аналог TStringList'а (в стандартном нет нужного функционала, зато дофига ненужного), долго не мог понять где косяк?..
procedure TUniqueStringList.Insert(const S: string; Index: Integer);
begin
  if FCount = FCapacity then
    GrowList;
  if Index < FCount then
    Move(FList[Index], FList[Index + 1], (FCount - Index) * SizeOf(string));
  FList[Index] := S;
  Inc(FCount);
end;
11 дек 18, 15:43    [21760486]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
asviridenkov
Member

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

move с управляемыми типами нужно использовать только если хорошо понимаешь что делаешь.
11 дек 18, 15:55    [21760505]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

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

Ну в итоге-то я таки допёр, откуда у меня в списке неожиданные строки появляются :)
11 дек 18, 16:16    [21760536]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6227
alekcvp,

С move() - могут быть спецэффекты...
11 дек 18, 16:17    [21760539]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
delphinotes
Member

Откуда: Санкт-Петербург
Сообщений: 333
Есть у меня некий класс, выполняющий некоторую работу. Для удобства пользования написана класс-функция, примерно такого содержания:

class function TSomeWorker.Execute(Owner: TComponent; SomeParam: TSomeParam): Boolean;
begin
  with TSomeWorker.Create(Owner) do
  try
    Result := InternalExecute(SomeParam);
  finally
    Free;
  end;
end;


Написано давно (лет 5+ назад), прекрасно работает.
И вот понадобилось вынести внутренний (скрытый) SomeParam в public секцию. Т.е. было примерно так:
type
  TSomeWorker = class(TComponent)
  private
    FSomeParam: TSomeParam
    function InternalExecute(ASomeParam: TSomeParam): Boolean;
  public
    class function Execute(Owner: TComponent; SomeParam: TSomeParam): Boolean;
  end;

А стало так:
type
  TSomeWorker = class(TComponent)
  private
    FSomeParam: TSomeParam
    function InternalExecute(ASomeParam: TSomeParam): Boolean;
  public
    class function Execute(Owner: TComponent; SomeParam: TSomeParam): Boolean;
    property SomeParam: TSomeParam read FSomeParam;
  end;


И после такой простой правки другой код, для которого было выведено это свойство (и который не дёргает Execute) тоже прекрасно заработал.
Но зато стал выпадать в AV старый код, вызывающий Execute.

(Мне повезло - запоролись тесты, и с помощью пошаговой отладки я проблему нашёл довольно быстро... и вспомнил, что на такое уже натыкался лет 10+ назад, вот в тот раз я долго тупил...)

Кто сообразит, в чём проблема? :)
1 июн 19, 23:27    [21899650]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

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

class function TSomeWorker.Execute(Owner: TComponent; SomeParam: TSomeParam): Boolean;

- стала обращаться к неинициализированной переменной fSomeParam, ч/з проперть, вместо параметра Someparam.
Вывод: используйте префиксы. Для параметров - а. aSomeParam.
2 июн 19, 00:19    [21899661]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2160
delphinotes
Кто сообразит, в чём проблема? :)
В отсутствии правильных кодерулесов. Мы у себя запретили использовать with
2 июн 19, 03:06    [21899688]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58454
Блог
white_nigger
В отсутствии правильных кодерулесов. Мы у себя запретили использовать with

Между тупыми и правильными кодерулесами есть некая разница.
2 июн 19, 11:03    [21899731]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
delphinotes
Member

Откуда: Санкт-Петербург
Сообщений: 333
Кстати вот ещё вспомнилось (на тему префиксов).
Когда AnyDac стал FireDac и вошёл в состав Delphi, по исходникам было массовое переименование по шаблону AD -> FD.
Из-за этого в одном из методов вместо обращения к параметру метода (с префиксом А) код стал обращаться к полю класса (с префиксом F).
(Точно детали уже не помню, там параметр именовался типа ADecimal.. я тогда написал Дмитрию, он к следующему релизу поправил.)

А так да, я согласен насчёт неких правил. Сейчас у нас все параметры именуются с А, локальные переменные с L (кроме однобуквенных), глобальные с G, константы с C.. ну про F и не говорю.

Использование with в новом коде тоже стремится к нулю.
2 июн 19, 11:36    [21899737]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
delphinotes,

Херня всё это. надо придерживаться рекомендаций
- Best Practices (используемых средств (IDE, DB))
- установленных норм конторы (у конторы есть свои средства форматирования)
- свои предпочтения и "наработки" жмаканья шифтов

Смешно ведь https://ru.wikipedia.org/wiki/Единая_система_программной_документации
А когда-то маялся
________
И да. Такую реалицию with - в топку
2 июн 19, 12:18    [21899745]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2160
Gator
И да. Такую реалицию with - в топку
Может и до остальных дойдет. Когда-нибудь...
2 июн 19, 18:56    [21899888]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3326
у себя в коде насчитал около 1000 вхождений with, за всё время ну наверно 3 или 4 проблем, которые почти сразу вылезли и поправлены.
2 июн 19, 22:02    [21899951]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 865
Сейчас у нас все параметры именуются с А, локальные переменные с L (кроме однобуквенных), глобальные с G, константы с C.. ну про F и не говорю.


Нравится мне, как в c# проблему с "F" обошли. 1) для пропертей отдельные переменные не объявляются, 2) проперти объявляются с заглавной буквы, 3) присвоения выглядят как MyParam = myparam.
2 июн 19, 23:49    [21900018]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 865
А в делфи приходится каждый раз изобретать: MyParam, FMyParam, AMyParam.
2 июн 19, 23:53    [21900019]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 35 36 37 38 39 40 [41] 42 43 44   вперед  Ctrl
Все форумы / Delphi Ответить