Текущий архив: 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.52 MB
Время: 0.038 c