Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Какая стандартная функция в Дельфи не переводит строку во Float, [D7]


Страницы:   1 2

Кто---то ©   (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.

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо