Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Вниз

Какая стандартная функция в Дельфи не переводит строку во 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.037 c
1-1099519559
BadProg
2004-11-04 01:05
2004.11.21
TClientSocket в Delphi 7


14-1099784918
Comp
2004-11-07 02:48
2004.11.21
DelphiX 6


1-1100084188
Артем К.
2004-11-10 13:56
2004.11.21
Баг в Меню?


4-1097650089
MegaVolt
2004-10-13 10:48
2004.11.21
Как освободить память из под файла отображенного в память?


3-1098711977
}|{yk
2004-10-25 17:46
2004.11.21
Вопрос по RecordCount





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский