Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Процедура Val, нужен перевод 
:(
    Опции темы
Akella
Дата 25.5.2005, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Из справки
Цитата
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.


Объясните, что делает эта процедура, зачем она нужна, и что у неё за параметры?
PM MAIL   Вверх
Dynamic
Дата 25.5.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 5.7.2004
Где: Салехард

Репутация: 12
Всего: 15



Ну, дык, это же StrToInt:
Код

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



--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Akella
Дата 25.5.2005, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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

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

я так подразумеваю, что в случае ошибки в переменную Code заноситься номер ошибочного символа, так
PM MAIL   Вверх
Yanis
Дата 25.5.2005, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Я уже ответил.
http://forum.vingrad.ru/index.php?showtopic=53272

Это сообщение отредактировал(а) Yanis - 25.5.2005, 14:09


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Akella
Дата 25.5.2005, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



я тоже
PM MAIL   Вверх
~FoX~
Дата 25.5.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



S - откуда берется
I - куда кладется
Code - номер первого символа не являющегося числом.


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
NoeR
Дата 25.5.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 233
Регистрация: 6.2.2005

Репутация: нет
Всего: нет



Цитата
Code - номер первого символа не являющегося числом.

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

Это сообщение отредактировал(а) NoeR - 25.5.2005, 18:18
--------------------
По факту пропажи мужа, возбуждено... Два соседа.Если у Вас проблемы с ребенком, спросите у жены, может, это не Ваши проблемы!>>> NoeR++ <<<
PM MAIL ICQ   Вверх
Yanis
Дата 25.5.2005, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



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

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

Это сообщение отредактировал(а) Yanis - 25.5.2005, 19:08


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
poor_yorik
Дата 25.5.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 12.1.2005
Где: Общаги г. Киева

Репутация: нет
Всего: 8



Сode равен 0, если удалось перевести из строки в число.
Если нет то Code либо 100, либо еще что-то. smile
--------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай...
PM MAIL YIM   Вверх
Yanis
Дата 25.5.2005, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



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

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


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
~FoX~
Дата 26.5.2005, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



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


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
NoeR
Дата 26.5.2005, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 233
Регистрация: 6.2.2005

Репутация: нет
Всего: нет



Да... Место ошибки... smile
--------------------
По факту пропажи мужа, возбуждено... Два соседа.Если у Вас проблемы с ребенком, спросите у жены, может, это не Ваши проблемы!>>> NoeR++ <<<
PM MAIL ICQ   Вверх
And_
Дата 20.12.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



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

У меня такая проблема, как отследить что число в строке больше максимального значения Cardinal?
Если такое происходит, code не изменяет своего значения.
PM MAIL   Вверх
VICTAR
Дата 20.12.2007, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Если нужен просто перевод, то есть StrToInt64
PM MAIL   Вверх
SergeBS
Дата 21.12.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



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+} у меня пишет, что раздел не найден :(.  Киньте английский вариант - разберу. Скорее всего тут разделение на ошибку адресации в массиве и чисто ошибку допустимого значения.
Перевод - подстрочный - я вам не писатель!

PM MAIL   Вверх
And_
Дата 21.12.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Все верно, свою проблему решил директивами компилятора.
По умолчанию, переполнение не вызывает ошибку, например если в V типа Byte (0..255) попытаться поместить '257', то V станет равной 1. Если '258', то 2 ... и так по кругу.  Но как можно отследить этот факт я так и не понял.
При использовании директивы  {$R+}, при переполнении будет возникать ошибка класса ERangeError, которую можно обработать с помощью try ... except...
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0960 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.