---------------------------------------------
/usr/share/fpcsrc/rtl/objpas/sysutils/sysstrh.inc(111,10) Error: не найден идентификатор: StrToInt
Вы лазит ошибка. Когда хочу посмотреть код StrToInt.
Добавлено спустя 18 часов 50 минут 28 секунд:
ну чего? тупой вопрос задал(и все решили что это не царское дело отвечать на дурость) или никто не сталкивался?
Ошибка. Не могу посмотреть Код ф-ии
Модератор: Модераторы
[quote="gen"]---------------------------------------------
/usr/share/fpcsrc/rtl/objpas/sysutils/sysstrh.inc(111,10) Error: не найден идентификатор: StrToInt
Вы лазит ошибка. Когда хочу посмотреть код StrToInt.
Добавлено спустя 18 часов 50 минут 28 секунд:
ну чего? тупой вопрос задал(и все решили что это не царское дело отвечать на дурость) или никто не сталкивался?[/quote
вопрос может не тупой он не полный не понятно в контексте какого текста вылазиет ошибка, а исходник можно и в текстовом редакторе посмотреть
/usr/share/fpcsrc/rtl/objpas/sysutils/sysstrh.inc(111,10) Error: не найден идентификатор: StrToInt
Вы лазит ошибка. Когда хочу посмотреть код StrToInt.
Добавлено спустя 18 часов 50 минут 28 секунд:
ну чего? тупой вопрос задал(и все решили что это не царское дело отвечать на дурость) или никто не сталкивался?[/quote
вопрос может не тупой он не полный не понятно в контексте какого текста вылазиет ошибка, а исходник можно и в текстовом редакторе посмотреть
ну я просто открыл лазарус(просто открыл) и в редакторе кода написал одно слово StrToInt. Потом нажал на контрл и кликнул мышкой по нему. Я хотел посмотреть как на асме реализовали эту ф-ию. А в результате вылезла ошибка.
Добавлено спустя 13 минут 35 секунд:
то есть мне нечего особо показать, я не писал код или что то там.
Добавлено спустя 21 минуту 46 секунд:
спросите если что не понятно. Просто я не понимаю что не понятно может быть.
Добавлено спустя 13 минут 35 секунд:
то есть мне нечего особо показать, я не писал код или что то там.
Добавлено спустя 21 минуту 46 секунд:
спросите если что не понятно. Просто я не понимаю что не понятно может быть.
странно как то но спрошу еще одну вещь ты кроме бинарной части FPC его исходные тексты ставил, хотя алгоритм преобразования строки в число не так уж сложен)), отрезаешь первый символ (тестишь что это цифра), дальше по коду понимаешь что это такое кидаешь в обнуленый суматор, если не конец умножаешь на 10, далее так же добавляешь в суматор умножаешь и пока не конец (или на число соответсвуещее системе счисления может ты из бинарной строки цифру хош получить),и так пока не конец
Функция StrToInt вызывает универсальную функцию Val, а её исходник с помошью Lazarus непосмотришь 
а в делфе вроде можно было. Жаль раз так.
Все просто:
посути при Val(S, result, Error) вызывается fpc_Val_SInt_AnsiStr
Код: Выделить всё
[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
