![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какая стандартная функция в Дельфи не переводит строку во Float, [D7]
Кто---то © (2004-11-05 01:23:00)а лишь проверяет такую возможность ? Что-то не найду.
default (2004-11-06 19:29:00) [1]Defunct © (05.11.04 20:00) [25]
так в том-то и дело что nil компилятор не даст передать, так как подразумевается(если это var-параметр) его изменение изнутри вызываемого кода, а "трюк" этот чтобы компилятор "съел" nil вот и всё
GuAV (2004-11-05 21:25:00) [2]Defunct © (05.11.04 20:00) [25]
PExtended(nil)^) = nil^ = значение из ячейки с адресом 00000000 = AV = Чушь полнейшая
В общем случае да.
Однако при передаче как var параметр на переменные делаются ссылки, а если в параметре разрешение указателя, то указатель будет передан как есть.
Нет смысл рарешать ссылку, если с ней никакие действия не совершаются перед передачей в функцию.
В коде вызова функций написанных на Delphi разумеется не следует так писать.
Однако если имеется внешяя функция описанная с var параметром, а в справке объявлена с соотвествующим параметром-указателем (в С var параметров нет) и документировано, что она может принимать nil то эта техника ИМХО вполне приемлема.
Вы можете сказать что это стрёмный трюк, специфичный для данной реализации. Однако не менее стрёмный чем например asm-код.
<off>
2 Defunct
Закачал, запустил.
А почему для ХР дистрибутив меньше и при этом у меня в 9х вроде запустилось ?
</off>
Defunct (2004-11-05 20:00:00) [3]default © (05.11.04 12:26) [23]
> необоснованная категоричность
почему это необоснованная?
PExtended(nil)^) = nil^= значение из ячейки с адресом 00000000 = AV = Чушь полнейшая и т.д. все, что написано в [12].
насчет того что вы дальше написали.
так и передавайте NULL или Nil или 0.
зачем извращаться ( nil^)?
jack128 (2004-11-05 13:50:00) [4]GuAV © (05.11.04 11:04) [21]
В принципе Delphi функция c var параметром тоже может принимать nil.
Ну это лишь особенность реализации ссылок в дельфи...
default (2004-11-05 12:26:00) [5][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."
GuAV (2004-11-05 11:05:00) [6]GuAV © (05.11.04 11:04) [21]
AV гарантированно не будет.
...В вызывающей подпрограмме, если и будет, то в вызываемой.
GuAV (2004-11-05 11:04:00) [7]Кто---то © (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 гарантированно не будет.
Amoeba (2004-11-05 10:44:00) [8]
> Кто---то © (05.11.04 07:30) [19]
>
> > jack128 © (05.11.04 04:09) [16]
> > в тех, что ссылка не может иметь неопределённого значения
>
> Даже если это отрицательное число ? :)
LMD!
Кто---то (2004-11-05 07:30:00) [9]
> jack128 © (05.11.04 04:09) [16]
> в тех, что ссылка не может иметь неопределённого значения
Даже если это отрицательное число ? :)
Defunct (2004-11-05 04:15:00) [10]jack128 © (05.11.04 04:09) [16]
хорошо сказано
Defunct (2004-11-05 04:11:00) [11]> А в каких случаях отличается ?
Вот пример, поясняющий в каких случаях отличается:
// value - ссылка
procedure Set55(var Value:Integer);
begin
Value := 55;
end;
// value - указатель
procedure Set55_2(Value: PInteger);
begin
Value^ := 55;
end;
По ассемблерному коду эти процедуры будут идентичны, но как видите явное использование указателя предполагает применение доп. символа ^.
jack128 (2004-11-05 04:09:00) [12]в тех, что ссылка не может иметь неопределённого значения. В отличии от указателя, для которого есть специальный "признак неопределенного указателя" - nil. то есть указатель не указывает не на что.
ссылка - это синоним какой то существующей переменной. синонимом "ничего" ссылка быть не может.
Кто---то (2004-11-05 03:44:00) [13]
> jack128 © (05.11.04 03:17) [14]
> скажем так - ссылка не эквивалентна указателю
А в каких случаях отличается ?
jack128 (2004-11-05 03:17:00) [14]скажем так - ссылка не эквивалентна указателю, но реализуется именно с помощью указателя..
jack128 (2004-11-05 03:16:00) [15]Defunct © (05.11.04 2:58) [12]
. Если каким-то чудом вы избегаете AV, то это именно чудом.
В пятерке нет этой функции - но рискну предположить, там используется VARпараметр, что эквивалентно указателю..
Defunct (2004-11-05 02:58:00) [16]> GuAV ©
<offtop>
я вам там письмецо отправил по поводу преобразований ;>
взглянете?
</offtop>
> если бы в TryStrToFloat была проверка второго параметра на nilто можно было так сделать
if TryStrToFloat(PChar(S), PExtended(nil)^)
Чушь полная.
Если бы вторым параметром был бы указатель, но вторым параметром является тип Extended, поэтому AV должен возникнуть еще до вызова функции. Если каким-то чудом вы избегаете AV, то это именно чудом.
Defunct (2004-11-05 02:32:00) [17]> Хотя,возможно,есть что-то и попроще.
> А если Result ненужен ? Зачем лишние переменные вводить ?
var W : Integer;
AText : String;
AValue : Real;
Val( AText, AValue, W);
if W<>0 then
ShowMessage('симовол "'+AText[W]+'" портит всю кухню');
GuAV (2004-11-05 02:32:00) [18]default © (05.11.04 2:15) [9]
TryStrToFloat(PChar(S), PExtended(nil)^)
Интересная техника. Такое может работать в случае необязательного параметра импортированной внешняей функции. Например, последний параметр в CreateThread, необязательный в 2k и выше.
Однако вряд ли найдётся функция Дельфи, делающая проверку var-параметра на nil (тем более вряд ли это будет документировано), и писать свои такие функции также не советую.
default (2004-11-05 02:15:00) [19][6]
пиши свою тогда
если бы в TryStrToFloat была проверка второго параметра на nil то можно было так сделать
if TryStrToFloat(PChar(S), PExtended(nil)^)
но такой код не будет вызывать AV лишь при "нефлотной" строки
GuAV (2004-11-05 02:13:00) [20]В данном случае если пытаться проверить перед преобразованием имхо наибольшую сложность представляет проверка на вписывание в диапазон extended.
Стандарной функции нет.