Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.21;
Скачать: CL | DM;

Вниз

Какая стандартная функция в Дельфи не переводит строку во Float,   Найти похожие ветки 

 
Кто---то ©   (2004-11-05 01:23) [0]

а лишь проверяет такую возможность ? Что-то не найду.


 
GanibalLector ©   (2004-11-05 01:42) [1]

А что мешает сделать try ... except и в зависимости от этого принять решение.


 
GanibalLector ©   (2004-11-05 01:49) [2]

Т.е. так :

boo:=true;
try strtofloat("123s");
except boo:=false;end;
if boo=false then messagedlg("А строка-то не float",mterror,[mbok],0);


Хотя,возможно,есть что-то и попроще.


 
GuAV ©   (2004-11-05 01:55) [3]

GanibalLector ©   (05.11.04 1:49) [2]
boo=false

Константы True и False для присвоения но не для сравнения !

В Дельфи сравнивать сравнительно безопасно, но не привыкай так писать !

GanibalLector ©   (05.11.04 1:49) [2]
Хотя,возможно,есть что-то и попроще.

есть.
boo := TextToFloat(PChar(S), Result, fvExtended);
if not boo then
 showmessage("А строка-то не float");


 
GanibalLector ©   (2004-11-05 02:01) [4]

2 GuAV ©  
Что сказать...Вы как всегда на высоте!


 
GuAV ©   (2004-11-05 02:05) [5]

Кстати ещё есть одна... TryStrToFloat


 
Кто---то ©   (2004-11-05 02:05) [6]


> boo := TextToFloat(PChar(S), Result, fvExtended);

А если Result ненужен ? Зачем лишние переменные вводить ?


 
GuAV ©   (2004-11-05 02:09) [7]

На самом деле есть много случаев где  довольно сложно проверить возможность того или иного действия. Проще сделать а потом смотреть получилось ли.


 
GuAV ©   (2004-11-05 02:13) [8]

В данном случае если пытаться проверить перед преобразованием имхо наибольшую сложность представляет проверка на вписывание в диапазон extended.

Стандарной функции нет.


 
default ©   (2004-11-05 02:15) [9]

[6]
пиши свою тогда
если бы в TryStrToFloat была проверка второго параметра на nil то можно было так сделать
if TryStrToFloat(PChar(S), PExtended(nil)^)
но такой код не будет вызывать AV лишь при "нефлотной" строки


 
GuAV ©   (2004-11-05 02:32) [10]

default ©   (05.11.04 2:15) [9]
TryStrToFloat(PChar(S), PExtended(nil)^)


Интересная техника. Такое может работать в случае необязательного параметра импортированной внешняей функции. Например, последний параметр в CreateThread, необязательный в 2k и выше.

Однако вряд ли найдётся функция Дельфи, делающая проверку var-параметра на nil (тем более вряд ли это будет документировано), и писать свои такие функции также не советую.


 
Defunct ©   (2004-11-05 02:32) [11]

> Хотя,возможно,есть что-то и попроще.

> А если Result ненужен ? Зачем лишние переменные вводить ?

var W      : Integer;
   AText  : String;
   AValue : Real;


 Val( AText, AValue, W);
 if W<>0 then
    ShowMessage("симовол ""+AText[W]+"" портит всю кухню");


 
Defunct ©   (2004-11-05 02:58) [12]

> GuAV ©

<offtop>
я вам там письмецо отправил по поводу преобразований ;>
взглянете?
</offtop>

> если бы в TryStrToFloat была проверка второго параметра на nil то можно было так сделать
if TryStrToFloat(PChar(S), PExtended(nil)^)


Чушь полная.
Если бы вторым параметром был бы указатель, но вторым параметром является тип Extended, поэтому AV должен возникнуть еще до вызова функции. Если каким-то чудом вы избегаете AV, то это именно чудом.


 
jack128 ©   (2004-11-05 03:16) [13]

Defunct ©   (05.11.04 2:58) [12]
. Если каким-то чудом вы избегаете AV, то это именно чудом.


В пятерке нет этой функции - но рискну предположить, там используется VAR параметр, что эквивалентно указателю..


 
jack128 ©   (2004-11-05 03:17) [14]

скажем так - ссылка не эквивалентна указателю, но реализуется именно с помощью указателя..


 
Кто---то ©   (2004-11-05 03:44) [15]


> jack128 ©   (05.11.04 03:17) [14]
> скажем так - ссылка не эквивалентна указателю

А в каких случаях отличается ?


 
jack128 ©   (2004-11-05 04:09) [16]

в тех, что ссылка не может иметь неопределённого значения. В отличии от указателя, для которого есть специальный  "признак неопределенного указателя" - nil. то есть указатель не указывает не на что.
ссылка - это синоним какой то существующей переменной. синонимом "ничего" ссылка быть не может.


 
Defunct ©   (2004-11-05 04:11) [17]

> А в каких случаях отличается ?

Вот пример, поясняющий в каких случаях отличается:


// value - ссылка
procedure Set55(var Value:Integer);
begin
 Value := 55;
end;

// value - указатель
procedure Set55_2(Value: PInteger);
begin
 Value^ := 55;
end;


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


 
Defunct ©   (2004-11-05 04:15) [18]

jack128 ©   (05.11.04 04:09) [16]

хорошо сказано


 
Кто---то ©   (2004-11-05 07:30) [19]


> jack128 ©   (05.11.04 04:09) [16]
> в тех, что ссылка не может иметь неопределённого значения

Даже если это отрицательное число ? :)


 
Amoeba ©   (2004-11-05 10:44) [20]


> Кто---то ©   (05.11.04 07:30) [19]
>
> > jack128 ©   (05.11.04 04:09) [16]
> > в тех, что ссылка не может иметь неопределённого значения
>
> Даже если это отрицательное число ? :)

LMD!


 
GuAV ©   (2004-11-05 11:04) [21]

Кто---то ©   (05.11.04 7:30) [19]
поэтому AV должен возникнуть еще до вызова функции

Нет. Причём никакого "чуда".

jack128 ©   (05.11.04 4:09) [16]
Функции WinAPI часто объявляют с var параметрами. Хотя иногда есть возможность передать NULL.

В принципе Delphi функция c var параметром тоже может принимать nil. Я немного изменил пример от Defunct ©.


// value - ссылка
procedure Set55(var Value:Integer);
begin
if @Value = nil then
  ShowMessage("nil")
else
  Value := 55;
end;

// value - указатель
procedure Set55_2(Value: PInteger);
begin
if Value = nil then
  ShowMessage("nil")
else
  Value^ := 55;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Set55(PINteger(nil)^);
 Set55_2(nil);
end;


Я не призываю так писать, однако при передаче nil как параметра AV гарантированно не будет.


 
GuAV ©   (2004-11-05 11:05) [22]

GuAV ©   (05.11.04 11:04) [21]
AV гарантированно не будет.

...В вызывающей подпрограмме, если и будет, то в вызываемой.


 
default ©   (2004-11-05 12:26) [23]

[12]
необоснованная категоричность
никакой это не бред
увидел как-то этот трюк в исходниках Inno Pascal-я
там он использовался в WriteProcessMemory
поскольку параметр LPDWORD lpNumberOfBytesWritten
был не нужен, переменную заводить влом и документация позволяет
"Points to the actual number of bytes transferred into the specified process. This parameter is optional. If lpNumberOfBytesWritten is NULL, the parameter is ignored. "


 
jack128 ©   (2004-11-05 13:50) [24]

GuAV ©   (05.11.04 11:04) [21]
В принципе Delphi функция c var параметром тоже может принимать nil.


Ну это лишь особенность реализации ссылок в дельфи...


 
Defunct ©   (2004-11-05 20:00) [25]

default ©   (05.11.04 12:26) [23]
> необоснованная категоричность

почему это необоснованная?

PExtended(nil)^) = nil^ = значение из ячейки с адресом 00000000 = AV = Чушь полнейшая и т.д. все, что написано в [12].

насчет того что вы дальше написали.
так и передавайте NULL или Nil или 0.
зачем извращаться (nil^)?


 
GuAV ©   (2004-11-05 21:25) [26]

Defunct ©   (05.11.04 20:00) [25]

PExtended(nil)^) = nil^ = значение из ячейки с адресом 00000000 = AV = Чушь полнейшая

В общем случае да.

Однако при передаче как var параметр на переменные делаются ссылки, а если в параметре разрешение указателя, то указатель будет передан как есть.
Нет смысл рарешать ссылку, если с ней никакие действия не совершаются перед передачей в функцию.

В коде вызова функций написанных на Delphi разумеется не следует так писать.

Однако если имеется внешяя функция описанная с var параметром, а в справке объявлена с соотвествующим параметром-указателем (в С var параметров нет) и документировано, что она может принимать nil то эта техника ИМХО вполне приемлема.

Вы можете сказать что это стрёмный трюк, специфичный для данной реализации. Однако не менее стрёмный чем например asm-код.

<off>
2 Defunct

Закачал, запустил.

А почему для ХР дистрибутив меньше и при этом у меня в 9х вроде запустилось ?
</off>


 
default ©   (2004-11-06 19:29) [27]

Defunct ©   (05.11.04 20:00) [25]
так в том-то и дело что nil компилятор не даст передать, так как подразумевается(если это var-параметр) его изменение изнутри вызываемого кода, а "трюк" этот чтобы компилятор "съел" nil вот и всё



Страницы: 1 вся ветка

Текущий архив: 2004.11.21;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.043 c
3-1098104727
Andrushk
2004-10-18 17:05
2004.11.21
Как восстановить связь с базой?


3-1098178436
mavor
2004-10-19 13:33
2004.11.21
Поиск в базе


1-1099663033
Mishenka
2004-11-05 16:57
2004.11.21
Как узнать над каким компонентом находится курсор мыши?


14-1098770331
Nikolay M.
2004-10-26 09:58
2004.11.21
Стиха, которую пишут обкуренные школьники


1-1099640079
denis24
2004-11-05 10:34
2004.11.21
dbgrid....title