Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Процедура Val


Автор: Akella 25.5.2005, 11:43
Из справки
Цитата
Converts a string to a numeric representation.

Unit

System

Category

string handling routines

Delphi syntax:

procedure Val(S; var V; var Code: Integer);

Description

In Delphi code, Val converts the string value S to its numeric representation, as if it were read from a text file with Read.

S is a string-type expression; it must be a sequence of characters that form a signed real number.

V is an integer-type or real-type variable. If V is an integer-type variable, S must form a whole number.

Code is a variable of type Integer.

If the string is invalid, the index of the offending character is stored in Code; otherwise, Code is set to zero. For a null-terminated string, the error position returned in Code is one larger than the actual zero-based index of the character in error.

Val performs range checking differently depending upon the setting of the $R compiler directive and the type of the parameter V.


Объясните, что делает эта процедура, зачем она нужна, и что у неё за параметры?

Автор: Dynamic 25.5.2005, 13:19
Ну, дык, это же StrToInt:
Код

var s: string;
      i, c: integer;
begin
  s := '123';
  Val(s, i, c);
  if c <> 0 then ConvertError!!!!!!
end;

Автор: Akella 25.5.2005, 14:05
а зачем остальные два параметра?
Добавлено @ 14:07
или хотябы один, один

Цитата
If the string is invalid, the index of the offending character is stored in Code

я так подразумеваю, что в случае ошибки в переменную Code заноситься номер ошибочного символа, так

Автор: Yanis 25.5.2005, 14:09
Я уже ответил.
http://forum.vingrad.ru/index.php?showtopic=53272

Автор: Akella 25.5.2005, 14:17
я тоже

Автор: ~FoX~ 25.5.2005, 14:24
S - откуда берется
I - куда кладется
Code - номер первого символа не являющегося числом.

Автор: NoeR 25.5.2005, 18:17
Цитата
Code - номер первого символа не являющегося числом.

В нем хранится код ошибки!

Автор: Yanis 25.5.2005, 18:47
Цитата(NoeR @ 25.5.2005, 18:17)
В нем хранится код ошибки!

Всё-таки в нём храниться номер первого символа не являющегося числом!

Автор: poor_yorik 25.5.2005, 18:56
Сode равен 0, если удалось перевести из строки в число.
Если нет то Code либо 100, либо еще что-то. smile

Автор: Yanis 25.5.2005, 19:06
Цитата(poor_yorik @ 25.5.2005, 18:56)
Если нет то Code либо 100, либо еще что-то.

Интересно сказал.

Автор: ~FoX~ 26.5.2005, 08:21
NoeR
Если хелп не читаете, то хоть проверяте на практике

Код

 Val('1233s', i, code);
 ShowMessage(IntToStr(code)); //----Вернет 5


Код

 Val('123s', i, code);
 ShowMessage(IntToStr(code)); //----Вернет 4


Код

 Val('12s', i, code);
 ShowMessage(IntToStr(code)); //----Вернет 3


Это по твоему коды ошибок? smile

Автор: NoeR 26.5.2005, 10:58
Да... Место ошибки... smile

Автор: And_ 20.12.2007, 20:32
StrToInt переводит в том случае, если значение не выходит за диапазон  Integer, а Val работает и с Cardinal. 

У меня такая проблема, как отследить что число в строке больше максимального значения Cardinal?
Если такое происходит, code не изменяет своего значения.

Автор: VICTAR 20.12.2007, 23:26
Если нужен просто перевод, то есть StrToInt64

Автор: SergeBS 21.12.2007, 15:03
2All:
Ну вы, блин, даете. Ведь нормальным английским все написано:
Цитата

val
Converts a string to a numeric representation.
Unit
System
Category
string handling routines

Delphi syntax:
procedure Val(S; var V; var Code: Integer);

Description
In Delphi code, Val converts the string value S to its numeric representation, as if it were read from a text file with Read.
S is a string-type expression; it must be a sequence of characters that form a signed real number. 
V is an integer-type or real-type variable. If V is an integer-type variable, S must form a whole number. 
Code is a variable of type Integer.
If the string is invalid, the index of the offending character is stored in Code; otherwise, Code is set to zero. For a null-terminated string, the error position returned in Code is one larger than the actual zero-based index of the character in error.
Val performs range checking differently depending upon the setting of the $R compiler directive and the type of the parameter V.
Setting    Result
{$R+}    An out-of-range value always generates a runtime error.
{$R-}    The values for out-of-range vary depending upon the data type of V.


Перевод (для особо упорных в шаманстве):
Val
Преобразует строку в числовое представление.
Юнит - систем smile
Категория - процедуры обработки строк.

Описание.
Val преобразует строковую величину S в ее численное (!!!) представление, как если бы она читалась из текстового файла через Read. S - выражение типа строка, оно должно быть последовательностью символов, которая формирует ЗНАКОВОЕ РЕАЛЬНОЕ число (!!!).
V - переменная типа целое ИЛИ РЕАЛЬНОЕ (!!!). Если V - переменная типа целое, то S должна формировать целое число.
Code - переменная типа целое.
Если строка неверна, то индекс нарушающего символа помещается в Code, иначе Code устанавливается в 0. Для нуль-терминированных строк позиция ошибки возвращенная в Code на 1 больше действительного с 0-начинающегося индекса символа с ошибкой.
Val производит проверку диапазона по-разному, в зависимости от установки директивы $R компилятора и типа параметра V. 

Установка Результат
{$R+} Величина выходящая за границы диапазона всегда генерирует ошибку времени выполнения
{$R-} величины выходящие за границы диапазона меняются в зависимости от типа данных V.

Прим. переводчика (т.е. мои smile ):
Где (!!!) и крупный шрифт - я специально отметил.
2 последние строки я не могу комментировать - в справке на {$R+} у меня пишет, что раздел не найден :(.  Киньте английский вариант - разберу. Скорее всего тут разделение на ошибку адресации в массиве и чисто ошибку допустимого значения.
Перевод - подстрочный - я вам не писатель!

Автор: And_ 21.12.2007, 16:44
Все верно, свою проблему решил директивами компилятора.
По умолчанию, переполнение не вызывает ошибку, например если в V типа Byte (0..255) попытаться поместить '257', то V станет равной 1. Если '258', то 2 ... и так по кругу.  Но как можно отследить этот факт я так и не понял.
При использовании директивы  {$R+}, при переполнении будет возникать ошибка класса ERangeError, которую можно обработать с помощью try ... except...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)