![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проверить на тип
Bobby Digital © (2004-11-24 05:02:00)можно ли как то проверить тип данных введных, например в Edit не используя try ... exсept
Германн (2004-11-27 00:58:00) [1]2 GuAV © (26.11.04 14:29) [40]
>var
> DummyParam: record
> case TDataType of
> dtInteger: (I: Integer);
> dtFloat: (F: Double);
> end;
Имхо, это все-таки не лучше absolute. Это просто другой путь имеющий свою ценность.
На Ваша реализация грешит явным переизбытком сущностей.
1. TDataType - явное излишество. Он никому не нужен никогда в данной ситуации.
2. Соответсвенно - dtInteger и dtFloat тоже.
Кроме того в более сложных ситуациях, которые упоминал я, необходимоиспользование волшебного слова packed.
А вообще-то есть пожалуй единственный плюс в Вашем варианте замены absoluteна record. В нем неважен порядок перечисления вариантов.
GuAV (2004-11-26 14:29:00) [2]Германн © (26.11.04 4:11) [39]
Но другим алгоритмом типа absolute я пользуюсь до сих пор и не собираюсь от него отказываться. Это вариантный record.
Это всё же IMHO лучше absolute. В этом случае и я бы им воспоьзовался - cм [30].
Германн (2004-11-26 04:11:00) [3]Честно говоря раньше часто использовал absoluteв контексте:
var
St : String;
LenSt : Byte absolute St;
Но тогда речь шла о паскалевских строках и при формировании этих строк удобнее было писАть LenSt:=N, чем St[0]:=Chr(N) или удобнее было писАть N:=LenSt, чем N:=Ord(St[0]);
Но другим алгоритмом типа absoluteя пользуюсь до сих пор и не собираюсь от него отказываться. Это вариантный record. Он мне жизненно необходим, поскольку я получаю ответ от некоего железа. И этот ответ зависит от того, что у него запрашивают.
TankMan (2004-11-25 19:39:00) [4]Мдаааа...:)
absolut'но полезно вести такие вот дискуссии...сколько на пасскале уж мелких прожек переписал, а вот про absolute даже не слышал...
З.Ы.
Пользуясь случаем хочу сказать ЮЗ спасибо за рекомендованную книгу про создание компонентов в Delphi. Это именно та книга, которой мне не хватало. (не по теме, ну гдеж я еще мог поблагодарить человека :) )
Sha (2004-11-25 19:17:00) [5]jack128 © (25.11.04 18:50) [36]
Обрати внимание на пролог/эпилог процедуры.
С constполучается намного короче и быстрее.
jack128 (2004-11-25 18:50:00) [6]jack128 © (25.11.04 18:49) [35]
я знаю, но это же НЕ серьёзно, ты же понимаешь.
jack128 (2004-11-25 18:49:00) [7]я знаю, но это же серьзно, ты же понимашь. Если бы шло копирование строки, то да.. А так.. Хотя если уж за каждый байт с стеке бороться, то может и имеет смысл ;-)
GuAV (2004-11-25 18:09:00) [8]jack128 © (25.11.04 17:34) [32]
procedure ValueStringParameter(S: string);
begin
ShowMessageFmt('ValueStringParameter. ref count = %D',
[PInteger((Integer(S)-8))^]);
end;
procedure ConstantStringParameter(const S: string);
begin
ShowMessageFmt('ConstantStringParameter. ref count = %D',
[PInteger((Integer(S)-8))^]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var S: string;
begin
S := StringOfChar('-', 5);
ShowMessageFmt('Caller. ref count = %D',
[PInteger((Integer(S)-8))^]);
ValueStringParameter(S);
ConstantStringParameter(S);
end;
Sha (2004-11-25 18:03:00) [9]jack128 © (25.11.04 17:34) [32]
Еще имеет смысл посмотреть в Debug Window :)
jack128 (2004-11-25 17:34:00) [10]Sha © (25.11.04 16:21) [31]
не имеет. Если только для читабельности.
Sha (2004-11-25 16:21:00) [11]Еще имеет смысл добавить const в описание параметра:
function GetDataType(const S: string): TDataType;
GuAV (2004-11-25 16:13:00) [12]Юрий Зотов © (25.11.04 15:38) [28]
Не согласен, что ДАННЫЙ код от этого становится плохо читаемым
Ок, согласен плохо читаемым не становится.
Юрий Зотов © (25.11.04 15:37) [27]
3. В глубоких рекурсиях (а никогда нельзя знать, где и как будет использована твоя процедура) даже 1 байт стека может оказаться критичным.
1 байт стека - это как ? :-)
Юрий Зотов © (25.11.04 15:37) [27]
Поэтому, если есть возможность что-то сэкономить без ущерба для остального - стоит это делать.
Однако шанс сделать ошибку - тоже "учерб для остального". Здесь конечно же вследствие absolut'ной прозрачности кода её обнаружить легко.
PS: Лично я бы предпочёл такой код:
var
DummyParam: record
case TDataType of
dtInteger: (I: Integer);
dtFloat: (F: Double);
end;
Sha (2004-11-25 16:11:00) [13]> Bobby Digital © (24.11.04 05:02)
Не забудь только, что
TryStrToInt считает $1 и 0x1 целыми
TryStrToFloat считает 1E-10 плавающим
Юрий Зотов (2004-11-25 15:38:00) [14]Удалено модератором
Примечание: дубль
Юрий Зотов (2004-11-25 15:37:00) [15]> GuAV © (25.11.04 14:55) [26]
1. Согласен, что я плохо подумал, что мои представления о компиляторе оказались ошибочными, и что надо писать I absolute F.
2. Не согласен, что ДАННЫЙ код от этого становится плохо читаемым (в более сложных случаях - да, возможно, там и я тоже не стал бы злоупотреблять базированием, но ДАННЫЙ случай слишком прост и absolut'но прозрачен). Ссылку на "а что такое absolute" аргументом не считаю, поскольку в ней продемонстрирована не запутанность кода, а элементарное незнание языка. С таким же успехом можно сказать, что указатели тоже запутывают код, потому что не все понимают, что это такое.
3. В глубоких рекурсиях (а никогда нельзя знать, где и как будет использована твоя процедура) даже 1 байт стека может оказаться критичным. Поэтому, если есть возможность что-то сэкономить без ущерба для остального - стоит это делать.
GuAV (2004-11-25 14:55:00) [16]Юрий Зотов © (25.11.04 14:42) [23]
ЧЕМ правильнее?
тем что если при незначительной выгоде от absolute (4 байта в стеке по памяти, по скорости 0 или почти 0) так легко сделать ошибку. Что Вы и продемонстрировали.
также тем что код становится менее понятным, что продемонстрировано в [18].
GuAV (2004-11-25 14:50:00) [17]Юрий Зотов © (25.11.04 14:42) [23]
Если первое утверждение верно, то неверно второе.
Я уже проверил. [17] - AV.
Компилятор однозначно отведёт 4 байта. Первое утверждение верно.
Я думал что второе утверждение верно, исходя из того что Вы проверили код передтем как запостить. Компилятор выделил бы 4 байта но недостающие 4 байта не содержали бы используемых данных. Да, я ошибся второе утверждение не верно.
jack128 (2004-11-25 14:48:00) [18]Юрий Зотов © (25.11.04 14:42) [23]
ЧЕМ правильнее?
вот этим, видимо
>GuAV © (25.11.04 1:36) [17][Ответить]
> Попробовал. GetDataType('7,8'); - AV. Прикольно.
;-)
Юрий Зотов (2004-11-25 14:42:00) [19]> GuAV © (25.11.04 01:25) [15]
> А не кажется ли Вам что
Мне кажется, что компилятор все же отведет 8 байт, а не 4.
> Вы можете конечно доказать, что ничего не перезаписываете, но
> всё же правильнее было бы I: integer absoulte F.
Если первое утверждение верно, то неверно второе.
> А ещё правильнее IMHO не экономить одно слово в стеке и
> объявиь F и I отдельно.
ЧЕМ правильнее?
ASoft (2004-11-25 10:56:00) [20]>>Leonid Troyanovsky[21]
Спасибо за инфу, собственно, то, что я и предполагал:
"on E: EDBEditError do
raise Exception.Create('My exception'); // do something" -
свой перехват Exception.