Ошибка. Не могу посмотреть Код ф-ии

Вопросы программирования и использования среды Lazarus.

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

Ошибка. Не могу посмотреть Код ф-ии

Сообщение gen » 03.09.2009 19:23:09

---------------------------------------------
/usr/share/fpcsrc/rtl/objpas/sysutils/sysstrh.inc(111,10) Error: не найден идентификатор: StrToInt

Вы лазит ошибка. Когда хочу посмотреть код StrToInt.

Добавлено спустя 18 часов 50 минут 28 секунд:
ну чего? тупой вопрос задал(и все решили что это не царское дело отвечать на дурость) или никто не сталкивался?
gen
новенький
 
Сообщения: 74
Зарегистрирован: 18.06.2009 21:04:22

Re: Ошибка. Не могу посмотреть Код ф-ии

Сообщение grigoreo » 04.09.2009 14:19:23

[quote="gen"]---------------------------------------------
/usr/share/fpcsrc/rtl/objpas/sysutils/sysstrh.inc(111,10) Error: не найден идентификатор: StrToInt

Вы лазит ошибка. Когда хочу посмотреть код StrToInt.

Добавлено спустя 18 часов 50 минут 28 секунд:
ну чего? тупой вопрос задал(и все решили что это не царское дело отвечать на дурость) или никто не сталкивался?[/quote

вопрос может не тупой он не полный не понятно в контексте какого текста вылазиет ошибка, а исходник можно и в текстовом редакторе посмотреть
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: Ошибка. Не могу посмотреть Код ф-ии

Сообщение gen » 04.09.2009 14:30:00

ну я просто открыл лазарус(просто открыл) и в редакторе кода написал одно слово StrToInt. Потом нажал на контрл и кликнул мышкой по нему. Я хотел посмотреть как на асме реализовали эту ф-ию. А в результате вылезла ошибка.

Добавлено спустя 13 минут 35 секунд:
то есть мне нечего особо показать, я не писал код или что то там.

Добавлено спустя 21 минуту 46 секунд:
спросите если что не понятно. Просто я не понимаю что не понятно может быть.
gen
новенький
 
Сообщения: 74
Зарегистрирован: 18.06.2009 21:04:22

Re: Ошибка. Не могу посмотреть Код ф-ии

Сообщение grigoreo » 04.09.2009 16:20:04

странно как то но спрошу еще одну вещь ты кроме бинарной части FPC его исходные тексты ставил, хотя алгоритм преобразования строки в число не так уж сложен)), отрезаешь первый символ (тестишь что это цифра), дальше по коду понимаешь что это такое кидаешь в обнуленый суматор, если не конец умножаешь на 10, далее так же добавляешь в суматор умножаешь и пока не конец (или на число соответсвуещее системе счисления может ты из бинарной строки цифру хош получить),и так пока не конец
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: Ошибка. Не могу посмотреть Код ф-ии

Сообщение Mr.Smart » 04.09.2009 16:28:46

Функция StrToInt вызывает универсальную функцию Val, а её исходник с помошью Lazarus непосмотришь :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Ошибка. Не могу посмотреть Код ф-ии

Сообщение gen » 04.09.2009 17:25:58

а в делфе вроде можно было. Жаль раз так.
gen
новенький
 
Сообщения: 74
Зарегистрирован: 18.06.2009 21:04:22

Re: Ошибка. Не могу посмотреть Код ф-ии

Сообщение Inferno » 04.09.2009 18:04:24

Все просто:
Код: Выделить всё
[b]sysstr.inc[/b]

function StrToInt(const S: string): integer;
var Error: word;
begin
  Val(S, result, Error);
  if Error <> 0 then raise EConvertError.createfmt(SInvalidInteger,[S]);
end ; 

[b]astrings.inc[/b]

Function fpc_Val_SInt_AnsiStr (DestSize: SizeInt; Const S : AnsiString; out Code : ValSInt): ValSInt; [public, alias:'FPC_VAL_SINT_ANSISTR']; compilerproc;
Var
  SS : ShortString;
begin
  fpc_Val_SInt_AnsiStr:=0;
  if length(S)>255 then
    code:=256
  else
    begin
       SS := S;
       fpc_Val_SInt_AnsiStr := int_Val_SInt_ShortStr(DestSize,SS,Code);
    end;
end;

[b]sstrings.inc[/b]

Function fpc_Val_SInt_ShortStr(DestSize: SizeInt; Const S: ShortString; out Code: ValSInt): ValSInt; [public, alias:'FPC_VAL_SINT_SHORTSTR']; compilerproc;
var
  temp, prev, maxPrevValue, maxNewValue: ValUInt;
  base,u : byte;
  negative : boolean;
begin
  fpc_Val_SInt_ShortStr := 0;
  Temp:=0;
  Code:=InitVal(s,negative,base);
  if Code>length(s) then
   exit;
  if (s[Code]=#0) then
    begin
      if (Code>1) and (s[Code-1]='0') then
        Code:=0;
      exit;
    end;
  maxPrevValue := ValUInt(MaxUIntValue) div ValUInt(Base);
  if (base = 10) then
    maxNewValue := MaxSIntValue + ord(negative)
  else
    maxNewValue := MaxUIntValue;
  while Code<=Length(s) do
   begin
     case s[Code] of
       '0'..'9' : u:=Ord(S[Code])-Ord('0');
       'A'..'F' : u:=Ord(S[Code])-(Ord('A')-10);
       'a'..'f' : u:=Ord(S[Code])-(Ord('a')-10);
       #0 : break;
     else
      u:=16;
     end;
     Prev := Temp;
     Temp := Temp*ValUInt(base);
     If (u >= base) or
        (ValUInt(maxNewValue-u) < Temp) or
        (prev > maxPrevValue) Then
       Begin
         fpc_Val_SInt_ShortStr := 0;
         Exit
       End;
     Temp:=Temp+u;
     inc(code);
   end;
  code := 0;
  fpc_Val_SInt_ShortStr := ValSInt(Temp);
  If Negative Then
    fpc_Val_SInt_ShortStr := -fpc_Val_SInt_ShortStr;
  If Not(Negative) and (base <> 10) Then
   {sign extend the result to allow proper range checking}
    Case DestSize of
      1: fpc_Val_SInt_ShortStr := shortint(fpc_Val_SInt_ShortStr);
      2: fpc_Val_SInt_ShortStr := smallint(fpc_Val_SInt_ShortStr);
{$ifdef cpu64}
      4: fpc_Val_SInt_ShortStr := longint(fpc_Val_SInt_ShortStr);
{$endif cpu64}
    End;
end;

посути при Val(S, result, Error) вызывается fpc_Val_SInt_AnsiStr
Аватара пользователя
Inferno
новенький
 
Сообщения: 78
Зарегистрирован: 20.03.2009 14:40:20
Откуда: Тюмень


Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 44

Рейтинг@Mail.ru