StrToInt на чистом паскале.

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: StrToInt на чистом паскале.

Сообщение Seenkao » 12.01.2022 22:29:54

скалогрыз писал(а):а сейчас ты делаешь только половину работы.

по сути ты прочитал то, что я написал тут? Даже zub заглянул внутрь.
zub писал(а):т.е. ты предлагаешь брать результат из глобальной переменной?

вычисления все произведены. Хочешь значение, забираешь его из переменной. Сколько это дополнительно времени займёт? 0.01мс или 0.001мс на 100000 итераций?

Alexander, благодарю! Значит реализация не на всех компьютерах будет выдавать прирост более чем в два раза. Жаль... но всё равно почти в два раза, это не мало.
Seenkao
постоялец
 
Сообщения: 390
Зарегистрирован: 01.04.2020 03:37:12

Re: StrToInt на чистом паскале.

Сообщение скалогрыз » 13.01.2022 03:07:28

Seenkao писал(а):вычисления все произведены

окей! ты действительно ускорил Val
скалогрыз
долгожитель
 
Сообщения: 1799
Зарегистрирован: 03.09.2008 02:36:48

Re: StrToInt на чистом паскале.

Сообщение Seenkao » 17.01.2022 07:38:18

Обновил модуль.
Модуль предоставляет три функции:
Код: Выделить всё
  function geStrToInt(const Str: String; out Value: maxIntVal; Size: LongWord = isInteger): Boolean;  // для десятичных чисел со знаком.
  function geStrToUInt(const Str: String; out Value: maxUIntVal; Size: LongWord = isLongWord): Boolean; // для десятичных чисел без знака.
  function geHOBStrToUInt(const Str: String; out Value: maxUIntVal; Size: LongWord = isQWord): Boolean; // для работы с шестнадцатеричными, восьмеричными и двоичными значениями.


Инициализация данных происходит при включении модуля в проект. Поэтому больше ни чего инициализировать не надо.

Модуль редактирован для разных архитектур. Проверялось только на 64-х битной системе, на 32-х битной не должно вызвать проблем. Для 16-ти и 8-ми битных надо проверять.
В модуле можно поднять уровень текущей архитектуры (UP_CPU в начале модуля). Но вы должны знать, что компилятор это позволяет и система под которую вы это делает (в основном от компилятора зависит). Для 64-х битной системы поднять уровень нельзя на данный момент. При сильном желании (если так хотите) можно, объявите свои данные и работайте с ними. Процедуры вообще не должны зависеть от разрядности системы, поэтому можно поднимать хоть до бесконечности. :)

Добавлен файл конфигурации.

Все функции работают быстрее стандартных (в 2-3 раза), использующих функцию Val.

Модуль идёт под свободной лицензией Zlib.

Добавлено спустя 10 минут 15 секунд:
Проблемы с переполнением вроде решил, надо проверять.

Теперь осталось ещё посмотреть числа с плавающей запятой... доберусь ли я до них? :?:

Добавлено спустя 49 минут 7 секунд:
При работе с шестнадцатеричными, восьмеричными и двоичными данными, вы будете работать только с без знаковыми числами UInt.
Я не считаю, что данные числа должны быть знаковыми (по моему и неудобно). Потому, если вам это необходимо, то вы сами можете доделать те функции, которые вам необходимы.

Шестнадцатеричные можно объявлять: '$', '0x' или '0X'.
Восьмеричные можно объявлять: '&' или '0' (не видел больше ни каких объявлений, если не прав, поправьте меня).
Двоичные можно объявлять: '%', '0b' или '0B'.

Добавлено спустя 33 минуты 17 секунд:
переполнение можно обойти {$Q-} и {$R-} ???

Добавлено спустя 4 часа 38 минут 36 секунд:
Прикрепил файл, оказывается забыл вообще, что его надо подменить, и менял его у себя на яндекс-диске. :oops:
Скачать - дублирую.
Seenkao
постоялец
 
Сообщения: 390
Зарегистрирован: 01.04.2020 03:37:12

Re: StrToInt на чистом паскале.

Сообщение Seenkao » 19.01.2022 01:58:20

Решил проблемы с переполнением, теперь при включенных флагах переполнения и выхода за пределы, не должно быть ошибок.

Требуется как можно больше тестов, чтоб выявить все ошибки. :mrgreen: :mrgreen: :mrgreen:

Добавлено спустя 20 часов 15 минут 18 секунд:
Я не смог не предоставить версии для общего использования. :oops: По моему мнению, функции, предоставленные мной, не достаточно удобны для обычного пользователя. Потому я ввёл дополнительные функции, с которыми пользователю проще работать. В количестве 16. :roll:
Код: Выделить всё
(* Rus: Ниже реализованы стандартные функции для перевода строк в число. Их
*      использование будет проще для большинства. Функции отмечены префиксом.
*      s_ - функции возвращают результат (если операция была неудачной, то
*      в результате вернётся ноль, но вы не узнаете, что операция была неудачной).
*      sc_ - результат функций удачная или не удачная была операция. Сам
*      конечный числовой результат считывайте в Value.
*)
// sc_ - speed + check
// s_ - speed (not check)

// Rus: Числа со знаком. Здесь нельзя использовать шестнадцатеричные, восьмеричные
//      и двоичные числа.
function sc_StrToShortInt(const Str: String; out Value: ShortInt): Boolean;    // byte
function s_StrToShortInt(const Str: String): ShortInt;                         // byte
function sc_StrToSmallInt(const Str: String; out Value: SmallInt): Boolean;    // word
function s_StrToSmallInt(const Str: String): SmallInt;                         // word
function sc_StrToInt(const Str: String; out Value: Integer): Boolean;
function s_StrToInt(const Str: String): Integer;
function sc_StrToInt64(const Str: String; out Value: Int64): Boolean;
function s_StrToInt64(const Str: String): Int64;

// Rus: Числа без знака. Эти функции могут использоваться и для шестнадцатеричныи
//      и восьмеричных и двоичных чисел.
function sc_StrToByte(const Str: String; out Value: Byte): Boolean;
function s_StrToByte(const Str: String): Byte;
function sc_StrToWord(const Str: String; out Value: Word): Boolean;
function s_StrToWord(const Str: String): Word;
function sc_StrToLongWord(const Str: String; out Value: LongWord): Boolean;
function s_StrToLongWord(const Str: String): LongWord;
function sc_StrToQWord(const Str: String; out Value: QWord): Boolean;
function s_StrToQWord(const Str: String): QWord;   

Все функции критичны к архитектуре и на 16-ти битной архитектуре не будет функций sc_StrToInt, s_StrToInt64, sc_StrToLongWord и подобных. Они исключаться (если вы не использовали define UP_CPU).
Вложения
geStrToInt.7z
(8.98 КБ) Скачиваний: 49
Seenkao
постоялец
 
Сообщения: 390
Зарегистрирован: 01.04.2020 03:37:12

Re: StrToInt на чистом паскале.

Сообщение zub » 19.01.2022 23:01:28

плохие новости((
Код: Выделить всё
Int32:
Val(), score:        2113
rejected:            0
TryChars2Int, score: 646
rejected:            0
sc_StrToInt, score: 1206
rejected:            0
Int64:
Val(), score:        2183
rejected:            0
TryChars2Int, score: 558
rejected:            0
sc_StrToInt64, score: 759
rejected:            0
Press any key to exit...

это сравнительный тест с реализацией отсюда https://forum.lazarus.freepascal.org/in ... #msg431452
zub
долгожитель
 
Сообщения: 2809
Зарегистрирован: 14.11.2005 23:51:26

Re: StrToInt на чистом паскале.

Сообщение Seenkao » 20.01.2022 00:22:26

Ну не знаю, не знаю. Просматривая код, даже не стал бы им пользоваться.
Int32:
Val(), score: 5392
rejected: 0
TryChars2Int, score: 2028
rejected: 0
sc_StrToInt or sc_StrToLongWord, score: 1805
rejected: 0
Int64:
Val(), score: 5657
rejected: 0
TryChars2Int, score: 2352
rejected: 0
sc_StrToInt64 or sc_StrToQWord, score: 1915
rejected: 0
Press any key to exit...

Странно, а у меня другие показания. Я конечно понимаю, что я создавал свой код, но в данных тестах, я провёл дополнительную работу. Если одна функция вернула не верное значение, то я вызываю параллельную функцию, которая будет правильно обрабатывать.

Благодарю, я продолжаю работать над чем начал. )))

Добавлено спустя 4 минуты 55 секунд:
Это ещё раз подтверждает, что код должен быть как можно более простым.
Seenkao
постоялец
 
Сообщения: 390
Зарегистрирован: 01.04.2020 03:37:12

Re: StrToInt на чистом паскале.

Сообщение zub » 20.01.2022 00:55:36

Чтобы быть объективным вот тест подправленный мной из той темы. мои результаты с -O3 как было в оригинале.

зы. писец, на фрипаскальном форуме запрещено прикреплять lpr((

Добавлено спустя 1 минуту 17 секунд:
fpc у меня транковый, гдето месячной давности
Вложения
bench.zip
(1.76 КБ) Скачиваний: 50
zub
долгожитель
 
Сообщения: 2809
Зарегистрирован: 14.11.2005 23:51:26

Re: StrToInt на чистом паскале.

Сообщение Seenkao » 20.01.2022 01:06:24

Код: Выделить всё
procedure RunMy32;
var
  Score: Int64;
  Start: TTime;
  I, J, v1, r: Integer;
  v: LongWord;
begin
  r := 0;
  Start := Time;
  for J := 1 to 10000 do
    for I := 0 to High(a) do
      if not sc_StrToLongWord(a[i], v) then
        sc_StrToInt(a[i], v1);
  Score := MillisecondsBetween(Time, Start);
  WriteLn('sc_StrToInt or sc_StrToLongWord, score: ', Score);
  WriteLn('rejected:            ', r);
end;

procedure RunMy64;
var
  Score, v1: Int64;
  v: QWord;
  Start: TTime;
  I, J, r: Integer;
begin
  r := 0;
  v := 0;
  Start := Time;
  for J := 1 to 10000 do
    for I := 0 to High(a) do
      if not sc_StrToQWord(a[i], v) then
        sc_StrToInt64(a[i], v1);
  Score := MillisecondsBetween(Time, Start);
  WriteLn('sc_StrToInt64 or sc_StrToQWord, score: ', Score);
  WriteLn('rejected:            ', r);
end;                           

замени, попробуй.

Добавлено спустя 2 минуты 29 секунд:
С твоим кодом это конечно жестоко. ))) Всё же проще.

Добавлено спустя 1 минуту 24 секунды:
можно конечно ещё проверить ошибки, но тот код не будет выполняться вовсе. Нужно ли это?
Seenkao
постоялец
 
Сообщения: 390
Зарегистрирован: 01.04.2020 03:37:12

Re: StrToInt на чистом паскале.

Сообщение zub » 20.01.2022 01:35:41

Код не мой. это тест из https://forum.lazarus.freepascal.org/in ... #msg431452
Зачем что то менять, все в одинаковых условиях. проверяем скорость, ищем ошибки если есть

Код: Выделить всё
      if not sc_StrToLongWord(a[i], v) then
        sc_StrToInt(a[i], v1);

такой подход не годится
zub
долгожитель
 
Сообщения: 2809
Зарегистрирован: 14.11.2005 23:51:26

Re: StrToInt на чистом паскале.

Сообщение Seenkao » 20.01.2022 02:17:15

zub писал(а):такой подход не годится

что значит не годится? :mrgreen: :mrgreen: :mrgreen:
Может посмотришь что там в коде творится? Ты вставляешь код, даже не подумав, как он работает? Ни чего, что ты вставил код, который априори не будет работать с не десятичным форматом, в код, который кишит этим форматом напропалую? )))

Я предоставил полный вариант обработки абсолютно всех данных. Если первая функция выдала ошибку, то запускается вторая функция, которая обработает то, что не обработала первая.
Точнее я заставил работать две функции вместо одной и мой код быстрее сработал.

a[i] - это определённая строка. И у него в коде, как раз используется эта строка для Val. Мои функции, это замена Val, а не замена какой-то непонятной функции, которая сначала разбивает строку, а потом заставляет её собирать в моей функции.
Я и подставляю её абсолютно так же, как она была предоставлена Val.
Код: Выделить всё
procedure RunVal32;
var
  Score: Int64;
  Start: TTime;
  I, J, v, c, r: Integer;
begin
  r := 0;
  Start := Time;
  for J := 1 to 10000 do
    for I := 0 to High(a) do
      begin
        Val(a[I], v, c);
        Inc(r, Ord(c <> 0));
      end;
  Score := MillisecondsBetween(Time, Start);
  WriteLn('Val(), score:        ', Score);
  WriteLn('rejected:            ', r);
end;           

Скажи что это мой код. )))

Ты мыть руки тоже через магазин ходишь? )))

Добавлено спустя 9 минут 48 секунд:
Не нравится? Пожалуйста, проверяй:
Код: Выделить всё
procedure RunAlt32;
var
  Score: Int64;
  Start: TTime;
  I, J, v, r: Integer;
begin
  r := 0;
  Start := Time;
  for J := 1 to 10000 do
    for I := 0 to High(a) do
      if not TryChars2Int(a[I][1..Length(a[I])], v) then
        Inc(r);
  Score := MillisecondsBetween(Time, Start);
  WriteLn('TryChars2Int, score: ', Score);
  WriteLn('rejected:            ', r);
  for I := 0 to 10 do
    if TryChars2Int(a[I][1..Length(a[I])], v) then
    begin
      WriteLn(a[i]);
      WriteLn(v);
    end;
end;

procedure RunMy32;
var
  Score: Int64;
  Start: TTime;
  I, J, v1, r: Integer;
  v: LongWord;
begin
  r := 0;
  Start := Time;
  for J := 1 to 10000 do
    for I := 0 to High(a) do
      if not sc_StrToLongWord(a[i], v) then
        sc_StrToInt(a[i], v1);
  Score := MillisecondsBetween(Time, Start);
  WriteLn('sc_StrToInt or sc_StrToLongWord, score: ', Score);
  WriteLn('rejected:            ', r);
  for I := 0 to 10 do
    if sc_StrToLongWord(a[i], v) then
    begin
      WriteLn(a[i]);
      WriteLn(v);
    end
    else begin
      sc_StrToInt(a[i], v1);
      WriteLn(a[i]);
      WriteLn(v1);
    end;
end;


А я, пока в споре с тобой, нашёл какую-то ошибку в коде, пойду её править. Можно тебя поблагодарить! :D

Добавлено спустя 19 минут 43 секунды:
Да, после второй функции как раз можно и проверку ввести, что были ошибки или нет.
Код: Выделить всё
if not sc_StrToQWord(a[i], v) then
        if not sc_StrToInt64(a[i], v1) then
          inc(r);


Добавлено спустя 5 минут 28 секунд:
Ну и по сути, если ты проверил что выводится на экран, то там понятно, что работа идёт только с числами со знаком, а про числа без знака вроде как ни чего нет.

И, я считаю, правильно то, что ни шестнадцатеричные, ни восьмеричные, ни двоичные числа не могут быть отрицательными. А по его коду, они могут.

Выложил на Git: fast_StrToInt.
Seenkao
постоялец
 
Сообщения: 390
Зарегистрирован: 01.04.2020 03:37:12

Re: StrToInt на чистом паскале.

Сообщение zub » 20.01.2022 03:24:38

>>что значит не годится? :mrgreen: :mrgreen: :mrgreen:
Значит что если я хочу преобразовать строку в цифру, я буду использовать одну функцию, а не вызывать подряд несколько. Возможно в какихнибудь уникальных случаях я сделаю так из-за копеечного выигрыша или хитрого синтаксиса входной строки. Но не сейчас, я просто хочу укрупненно оценить возможности разных реализаций.
Для этого мне нужно особо не задумываясь (очень важно) оценить скорость и увидеть отсутствие ошибок. Тест avk мне это позволяет сделать, в отличии от твоего, который выводит понятную тебе, но непонятную мне информацию. Я не думая (у меня куча других проблем, мне нужно только оценить) вставил в тест avk твои функции (заметь, не в твой тест вставил функции avk, твой мне показался странным :( ) И сразу заметил что твои функции не справляются с не десятичными нотациями (пофиг, только оцениваю) - закоментил соответствующие строки.

>>Я предоставил полный вариант обработки абсолютно всех данных. Если первая функция выдала ошибку,
>>то запускается вторая функция, которая обработает то, что не обработала первая.
Вот именно это и негодится. Это какието твои хотелки - вызывать одно, если нет, то вызывать другое... я непонимаю смысла этого. Выигрыш скорости? сомневаюсь

>> И у него в коде, как раз используется эта строка для Val
Нет. вижу только в тесте чтоб было с чем сравнить.

Я понимаю - свой код ближе к телу... Но я сравнил объективно. имхо

да, забыл самое главное. У avk есть возможность конвертить подстроку не выдирая ее в отдельную строку, у тебя нет. А это съест твой выигрыш производительности((
zub
долгожитель
 
Сообщения: 2809
Зарегистрирован: 14.11.2005 23:51:26

Re: StrToInt на чистом паскале.

Сообщение Seenkao » 20.01.2022 03:53:29

zub писал(а):да, забыл самое главное. У avk есть возможность конвертить подстроку не выдирая ее в отдельную строку, у тебя нет. А это съест твой выигрыш производительности((

Это единственный нормальный факт, остальное - мыло мыльное. Просто что-то не нравится. Не нравится не пользуйся. )))

Конечно лучше иметь в функциональности 200 функций и не понимать что они делают, чем три рабочих выводящих конкретный результат.

Результат не в тестах!!! Результат, в решении. Предоставь мне в его коде возможность работать чисто с шестнадцатеричной системой счисления без знака!!!, чтоб он не выдавал минусов (или нулей), когда мне нужен именно результат. При чём я знаю, что этот результат есть.

А "выдирается" нужная строка из строки, явно не такими методами. Вы только мозги себе больше сломаете и всю производительность съедите, запихнув числа в строки, а потом выдирая и оттуда.
Ваши "выдирания" работают через две переменных (для короткой конечно можно и одну, только нагрузка будет больше на работу), которые покажут начало и конец "выдирания". И при чём они должны будут ещё ассоциироваться с кодом.

Хренью занимаетесь. ))) Изучите как машина работает и как ей проще будет воспринимать это всё, а потом учите остальных.

Вы там мастак в ООП? Вот и не лезьте в процедурное программирование. Когда я пересекусь с ООП, тогда и можно будет на ошибки указывать. Ладно бы по коду были какие-то ошибки, а то "мне это не нравится". :mrgreen: Не нравится, так не нравится, носи красные тапки, раз жёлтые не нравятся. Всё что тебе там не нравится - это goto, которым ты пользуешься каждый день когда программируешь, но будешь это отрицать до посинения. )))

Есть что по коду, выслушаю, нет, тогда хорош тут мыло разводить.

zub писал(а):Выигрыш скорости? сомневаюсь

Согласись, тут ты бред написал. Какой может быть выигрыш в скорости, если я вызываю две функции, вместо одной? :D Ну что за чушь?
Я тебе конкретно по коду показал, что мои две функции, работают быстрее его одной, хотя и обработка в первой не полная, но время она занимает.

Добавлено спустя 9 минут 47 секунд:
zub писал(а):если я хочу преобразовать строку в цифру, я буду использовать одну функцию, а не вызывать подряд несколько.

значит в мой код ты влез, посмотрел, не понравилось - ушёл. А в его код даже залазить не стал и решил, что у него ни чего не вызывается? )))
zub писал(а):оценить скорость и увидеть отсутствие ошибок

о, да, все же пишут код без ошибок с первого раза.
zub писал(а):твои функции не справляются с не десятичными нотациями

ткни пальцем.

ах да, ты же не читаешь что я пишу. У шестнадцатеричных, восьмеричных, двоичных чисел нет знака - вот ни фига себе... зато ты вставил именно ту функцию, которая не обрабатывает именно шестнадцатеричные, восьмеричные и двоичные числа.
И это ко мне претензия??? :mrgreen: Первопост почитать не хочешь? Я тут седьмую страницу об этом пишу. НЕТ У НИХ ЗНАКА!!! Надо использовать функцию, которая работает с беззнаковыми значениями (где тут стена, постучусь погромче).

Ты первый год в программировании? Тогда я пойму.
Seenkao
постоялец
 
Сообщения: 390
Зарегистрирован: 01.04.2020 03:37:12

Re: StrToInt на чистом паскале.

Сообщение zub » 20.01.2022 04:20:23

>>... я непонимаю смысла этого. Выигрыш скорости? сомневаюсь
в оригинале было так.

>>Результат не в тестах!!! Результат, в решении.
Но тесты сразу скажут что ждать от этого решения.

>>Предоставь мне в его коде возможность работать чисто с шестнадцатеричной системой счисления без знака!!!
Предоставь мне в своем коде в пятеричной системе... что за глупости?
Не было у меня ни разу такой нужды, да и тема называется StrToInt на чистом паскале.

>>А "выдирается" нужная строка из строки, явно не такими методами
если есть возможность не выдирать - не надо выдирать.

>>Вы только мозги себе больше сломаете и всю производительность съедите, запихнув числа в строки, а потом выдирая и оттуда.
Так а зачем вы пишете преобразование сттроки в число? храни сразу цифрами)) К сожалению цыферки обычно в гдето сидят, их еще выпарсить надо

>>Ваши "выдирания" работают через две переменных (для короткой конечно можно и одну, только нагрузка будет больше на работу)
Нет, это ваши так работают. Видимо вам пока не приходилось большие объемы данных обрабатывать, на мелочи да, разницу незаметишь

>>Хренью занимаетесь. ))) Изучите как машина работает и как ей проще будет воспринимать это всё, а потом учите остальных.
Да я уже понял, критику тут неправильно воспринимают(( пойду делом займусь
zub
долгожитель
 
Сообщения: 2809
Зарегистрирован: 14.11.2005 23:51:26

Re: StrToInt на чистом паскале.

Сообщение Seenkao » 20.01.2022 04:58:30

zub писал(а):в оригинале было так.

по сути ни чего не добавилось.

zub писал(а):Да я уже понял, критику тут неправильно воспринимают(( пойду делом займусь

что такое конструктивная критика знаешь? Это не когда кричат "мне это не нравится, мне это не нравится", это когда указывают, что функция не правильно работает, выдаёт не верный результат, и ещё тысячи проблем.

Мне не нравится код предоставленный avk, более того, я явно вижу указания на мой код, в определённых местах. Мне пойти кричать - "мне не нравится твой код, и ты часть у меня украл?" ))) Ну посмотрел он мой код (для кого я его комментировал?), ну взял что-то оттуда, ладно, может польза будет.

Но я не проверяю код предоставленными тестами, особенно, если он не показывает работы функции (да я и сам хорош, изначально только тесты скорости сделал). Я проверяю работу самого кода. Я не просто так брался за переписывание функции, а для того, чтоб она работала нормально.

То, что ты мне тут пишешь - это просто что-то размытое.

В первый раз ты мне написал, что не хорошо что переменная глобальная и туда записываются данные. Ну да, переделать недолго...
Но вот второй человек написал: "Это потоко не безопасно." - как тебе такой вариант ответа? А ведь он просто правду написал. Пройдутся два потока следом друг за другом, я переменную не успел считать - всё, данные потеряны. А где потеряны... ищи свищи.

То, что ты считаешь, что у avk, всё хорошо - так это вообще нонсенс. Как может быть библиотека (написанная за день-два на коленке) быть хорошо сделана? Её тестировать надо долго и упорно. Напильником подтачивать, там, где это ещё не доточено.

Мне нужна конкретика! Где и что не работает или работает неправильно .

Ну и отдельная благодарность! Ты заглянул в мои исходники и похоже неплохо, но разбираться сильно не стал. )))

Добавлено спустя 5 часов 55 минут 18 секунд:
Решил проблемы с восьмеричной системой счисления (самая муторная походу, не удивлюсь, если ещё раз туда залазить буду).
Оптимизировал код. Добавил дефайн ADD_FAST - который немного ускорит работу пользовательских функций (не основных!!!), но при этом немного увеличит размер кода.
Seenkao
постоялец
 
Сообщения: 390
Зарегистрирован: 01.04.2020 03:37:12

Re: StrToInt на чистом паскале.

Сообщение wavebvg » 20.01.2022 13:30:17

Ребят, так и не понял, чем классический вариант не устраивает?

Код: Выделить всё
procedure StrToInt(AStr: PChar; out AResult: Integer);
const
  MAX_VALUE = High(AResult) div 10;
  MAX_NUMER = High(AResult) mod 10;
  MAX_NNUMER = -Low(AResult) mod 10;
var
  n, o: SmallInt;
  p: PChar;
begin
  p := AStr;
  if p^ = #45 then
  begin
    n := 1;
    Inc(p);
  end
  else
    n := 0;
  if p^ = #0 then
    raise EConvertError.Create('Str empty');
  AResult := 0;
  repeat
    if (p^ >= #48) and (p^ <= #57) then
    begin
      o := Ord(p^) - 48;
      if (AResult >= MAX_VALUE) and (o > MAX_NUMER) then
        if (n = 0) or (o > MAX_NNUMER) then
          raise EConvertError.CreateFmt('"%s" is not valid integer', [AStr]);
      AResult := AResult * 10;
      AResult := AResult + o;
    end
    else
      raise EConvertError.CreateFmt('"%s" is not valid integer', [AStr]);
    Inc(p);
  until p^ = #0;
  if n = 1 then
    AResult := -AResult;
end;   
wavebvg
постоялец
 
Сообщения: 321
Зарегистрирован: 28.02.2008 04:57:35

Пред.След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru