Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
ВнизIntToStr без System.pas Найти похожие ветки
← →
diimon (2007-09-04 07:18) [0]у меня проблема: хочу написать маленькое приложение(модули System.pas и SysInit.pas обрезаны)
мне необходимы функции IntToStr и StrToInt, но я не знаю как их теперь реализовать, думал выдернуть их из оригинального System.pas, но там одна функция тянет за собой другую... вообщем ничего у меня не выходит. Что делать??(Ассемблер я к сожалению почти не знаю :( )
← →
tmp (2007-09-04 08:19) [1]function IntToStr(N: Int64): string;
begin
Str(N,Result);
end;
function StrToIntDef(const S: string; DefVal: Integer): Cardinal;
var
N: Cardinal;
Code: Integer;
begin
Val(S,N,Code);
if Code = 0 then
Result := N
else
Result := DefVal;
end;
← →
tmp (2007-09-04 08:29) [2]В StrToIntDef лишняя переменная, лучше так:
function StrToIntDef1(const S: string; DefVal: Integer): Cardinal;
var
Code: Integer;
begin
Val(S,Result,Code);
if Code > 0 then Result := DefVal;
end;
← →
Anatoly Podgoretsky © (2007-09-04 09:00) [3]Если не использовать STR/VAL, то функции настолько тривиальны, что написание с нуля, занимает ничтожное время.
← →
Anatoly Podgoretsky © (2007-09-04 09:01) [4]Может тебе в KOL?
← →
homm © (2007-09-04 09:38) [5]> думал выдернуть их из оригинального System.pas
Опа. А что, они не в SysUtils.pas разве объявлены?
← →
clickmaker © (2007-09-04 10:27) [6]msvcrt.dll или ntdll.dll
atoi
_itoa
← →
palva © (2007-09-04 11:00) [7]> модули System.pas и SysInit.pas обрезаны
Можно их вообще стереть или забить мусором. На создание программ это не повлияет. Компилятор использует модули System.dcu и SysInit.dcu из папки LIB. Вот без них проблемно. Без System.dcu вообще невозможно получить программу, даже если вы не будете использовать IntToStr.
← →
sniknik © (2007-09-04 11:18) [8]palva © (04.09.07 11:00) [7]
не знаком с KOL? там есть замены которые можно скомпилить и использовать.
есть и описание как это сделать (не только для KOL/в нем, видел еще в статьях по минимизации получающегося екзешника)
вопрос судя по всему "того" плана, в смысле и минимизация и замены("обрезанные") в нем присутствуют... не факт что у автора все сделано верно, но "обрезка" возможна и судя по всему используется (надо верить людям. раз говорит обрезаны значит обрезаны.).
← →
palva © (2007-09-04 11:25) [9]не знаком с KOL?
Да, теперь я понял вопрос.
← →
Anatoly Podgoretsky © (2007-09-04 12:03) [10]> sniknik (04.09.2007 11:18:08) [8]
Для особо озабоченных, там есть генетически модифицированый System.pas
← →
diimon (2007-09-04 13:14) [11]
> tmp (04.09.07 08:19) [1]
> function IntToStr(N: Int64): string;begin Str(N,Result);
> end;
Компилятор ругается на эту строку "Str(N,Result);"
System unit out of date or corrupted: missing "@str0int64"
← →
homm © (2007-09-04 13:17) [12]Смотри в сторону [6].
← →
diimon (2007-09-04 13:23) [13]а на ассемблере как написать функцию
IntToStr и обратно?? мож у кого есть какие нить наработки??
← →
homm © (2007-09-04 13:26) [14]> [13] diimon (04.09.07 13:23)
См. в сторону KOL.
← →
tmp (2007-09-04 13:53) [15]
> diimon (04.09.07 13:14) [11]
>
>
> > tmp (04.09.07 08:19) [1]
> > function IntToStr(N: Int64): string;begin Str(N,Result);
>
> > end;
>
>
> Компилятор ругается на эту строку "Str(N,Result);"
>
> System unit out of date or corrupted: missing "@str0int64"
>
У меня на D7, WInXp все работает
program Project1;
uses
Windows;
function IntToStr(N: Int64): string;
begin
Str(N,Result);
end;
begin
MessageBox(0,PChar(IntToStr(High(Int64))),"Test",0);
end.
← →
Dib@zol © (2007-09-04 14:00) [16]> [15] tmp (04.09.07 13:53)
А ты попробуй отчекрыжить sysInit.pas/dcu и удивись :)
← →
sniknik © (2007-09-04 14:03) [17]> У меня на D7, WInXp все работает
ну у тебя же не обрезанный system. нет уж... сначала ты должен выкинуть процедуру Str (вместе с остальным) а потом проверять.
← →
homm © (2007-09-04 14:03) [18]> У меня D7, WInXp…
… и стойкое нежелание читать ветку?
← →
tmp (2007-09-04 14:49) [19]Да, не заметил
← →
clickmaker © (2007-09-04 14:57) [20]function MyIntToStr(N: int64): string;
var M: integer;
begin
Result := "";
while N > 0 do begin
M := N mod 10;
N := N div 10;
Result := Chr(M + 48) + Result;
end;
end;
StrToInt - домашнее задание
← →
diimon (2007-09-04 15:17) [21]
> clickmaker © (04.09.07 14:57) [20]
> function MyIntToStr(N: int64): string;var M: integer;begin
> Result := ""; while N > 0 do begin M := N mod 10;
> N := N div 10; Result := Chr(M + 48) + Result; end;
> end;StrToInt - домашнее задание
Компилятор ругается...
System unit out of date or corrupted: missing "@LStrClr"
:(
← →
Anatoly Podgoretsky © (2007-09-04 15:19) [22]Упс, у тебя порушеная Дельфи
← →
clickmaker © (2007-09-04 15:19) [23]
> [21] diimon (04.09.07 15:17)
операция обрезания прошла неудачно. Пациент умер от болевого шока
← →
sniknik © (2007-09-04 15:26) [24]> Упс, у тебя порушеная Дельфи
не, это просто неправильно порезанный System, дельфи тут не причем. (получал что то подобное при компилировании примера из какой то статьи по "минимизированному exe")
восстанавливается возвращением сохранённых оригиналов.
← →
Anatoly Podgoretsky © (2007-09-04 15:29) [25]> sniknik (04.09.2007 15:26:24) [24]
Что по сути одно и тоже.
← →
homm © (2007-09-04 15:44) [26]Закалебал. Нафига ты удалил эти функции из системного модуля, елс иони тебе нужны? Давай еше спрости, как мне работать в виндовс, который я стер, или как кататься в автомобиле, который я продал. Востанови хотя-бы те функции, которые тебе нужны.
← →
diimon (2007-09-05 07:43) [27]слыш, homm ©, если тебе нечего ответить по вопросу, нахера ты ваще чето пишешь?? Флейм тут тока разводишь.
Удалил потому что она тянет за собой другую функцию, та тянет третью и так далее до бесконечности. А мне требуется просто переписать ее заново, вот и все. Не знаешь как это сделать- не пиши вообще!!!
← →
homm © (2007-09-05 08:00) [28]Слышь, дятел, зачем ты ветку завел, если все равно не читаешь, что тебе пишут? Сто раз сказано, в KOL глянь. Дак чукча же не читатель, он пойдет еше фигни наспрашивает лучше, чем совету последовать.
function Int2Str( Value : Integer ) : String;
var Buf : array[ 0..15 ] of Char;
Dst : PChar;
Minus : Boolean;
D: DWORD;
begin
Dst := @Buf[ 15 ];
Dst^ := #0;
Minus := False;
if Value < 0 then
begin
Value := -Value;
Minus := True;
end;
D := Value;
repeat
Dec( Dst );
Dst^ := Char( (D mod 10) + Byte( "0" ) );
D := D div 10;
until D = 0;
if Minus then
begin
Dec( Dst );
Dst^ := "-";
end;
Result := Dst;
end;
procedure Int2PChar( s: PChar; Value: Integer );
var Buf : array[ 0..15 ] of Char;
Dst : PChar;
Minus : Boolean;
D: DWORD;
begin
Dst := @Buf[ 15 ];
Dst^ := #0;
Minus := False;
if Value < 0 then
begin
Value := -Value;
Minus := True;
end;
D := Value;
repeat
Dec( Dst );
Dst^ := Char( (D mod 10) + Byte( "0" ) );
D := D div 10;
until D = 0;
if Minus then
begin
Dec( Dst );
Dst^ := "-";
end;
StrCopy( s, Dst );
end;
function UInt2Str( Value: DWORD ): String;
var Buf : array[ 0..15 ] of Char;
Dst : PChar;
D: DWORD;
begin
Dst := @Buf[ 15 ];
Dst^ := #0;
D := Value;
repeat
Dec( Dst );
Dst^ := Char( (D mod 10) + Byte( "0" ) );
D := D div 10;
until D = 0;
Result := Dst;
end;
← →
homm © (2007-09-05 08:12) [29]Вот тебе еще, послаще малек.
function Int2Str( Value : Integer ) : String;
asm
XOR ECX, ECX
PUSH ECX
ADD ESP, -0Ch
PUSH EBX
LEA EBX, [ESP + 15 + 4]
PUSH EDX
CMP EAX, ECX
PUSHFD
JGE @@1
NEG EAX
@@1:
MOV CL, 10
@@2:
DEC EBX
XOR EDX, EDX
DIV ECX
ADD DL, 30h
MOV [EBX], DL
TEST EAX, EAX
JNZ @@2
POPFD
JGE @@3
DEC EBX
MOV byte ptr [EBX], "-"
@@3:
POP EAX
MOV EDX, EBX
CALL System.@LStrFromPChar
POP EBX
ADD ESP, 10h
end;
И вот сюда загляни, там замны систепмных модулей вские фокусы не вытворяют.
http://kolnmck.ru/files1.shtml
← →
diimon (2007-09-05 08:21) [30]содержимое sysinit.pas
unit SysInit;
interface
procedure _InitExe;
procedure _halt0;
procedure _InitLib(Context: PInitContext);
var
ModuleIsLib: Boolean;
TlsIndex: Integer = -1;
TlsLast: Byte;
const
PtrToNil: Pointer = nil;
implementation
procedure _InitLib(Context: PInitContext);
asm
end;
procedure _InitExe;
asm
end;
procedure _halt0;
asm
end;
end.
содержимое system.pas
unit System;
interface
procedure _HandleFinally;
type
TGUID = record
D1: Cardinal;
D2: Word;
D3: Word;
D4: array [0..7] of Byte;
end;
PInitContext = ^TInitContext;
TInitContext = record
OuterContext: PInitContext;
ExcFrame: Pointer;
InitTable: pointer;
InitCount: Integer;
Module: pointer;
DLLSaveEBP: Pointer;
DLLSaveEBX: Pointer;
DLLSaveESI: Pointer;
DLLSaveEDI: Pointer;
ExitProcessTLS: procedure;
DLLInitState: Byte;
end;
implementation
procedure _HandleFinally;
asm
end;
end.
по поводу
> homm © (05.09.07 08:00) [28]
компилер выдает System unit out of date or corrupted: missing "@LStrFromPChar"
← →
Сергей М. © (2007-09-05 08:39) [31]
> diimon (05.09.07 08:21) [30]
Это ты сам придумал так кастрировать сист.юниты или кто-то тебе посоветовал ?)
← →
diimon (2007-09-05 08:48) [32]прочитал в инете где то :))
Причем все работало... до тех пор, пока мне не понадобилось... IntToStr
← →
homm © (2007-09-05 08:52) [33]> компилер выдает System unit out of date or corrupted: missing
> "@LStrFromPChar"
Возвращай на место всю кипу функций для работы со String, либо попробуй Int2PChar.
← →
Сергей М. © (2007-09-05 08:53) [34]
> прочитал в инете где то
.. и бездумно содрал)
> все работало
Что "все" ?
> пока мне не понадобилось... IntToStr
Ты не понимаешь, как компилятор работает с LargeString-типами.
← →
homm © (2007-09-05 08:59) [35]> Причем все работало...
Ты еше не пробовал, наверное в проект модулей добавить, кроме project.dpr.
← →
sniknik © (2007-09-05 08:59) [36]> Это ты сам придумал так кастрировать сист.юниты или кто-то тебе посоветовал ?)
http://www.xakep.ru/magazine/xa/080/112/1.asp
diimon (05.09.07 08:21) [30]
ну так... тут же нет ничего вообще. насколько понимаю в нормальном борландовский менеджер памяти должен загружаться, или ты должен брать обработку на себя и т.д.
> до тех пор, пока мне не понадобилось... IntToStr
подозреваю что не только это, а вообще с работа со строками нарушилась. т.е. если бы это была функция IntToPChar то все было бы нормально. (насколько возможно в таких условиях)
p.s. сколько раз повторить про KOL?
← →
diimon (2007-09-05 09:14) [37]Короче ладно, засуну нормальные модули System.pas и SysInit.pas и буду уже потихоньку от туда вырезать лишнее. Спасибо за помощь
← →
Anatoly Podgoretsky © (2007-09-05 10:09) [38]Наука в прок не пошла.
От модератора: не указывай кому можно писать в твою ветку, а кому нет, если желаешь подобное, то сделай свой форум и там рули.
← →
homm © (2007-09-05 10:48) [39]> Короче ладно, засуну нормальные модули System.pas и SysInit.pas
> и буду уже потихоньку от туда вырезать лишнее. Спасибо за
> помощь
Ты ходил по ссылке?
http://kolnmck.ru/files1.shtml
[4] [8] [14] [28] [29] [36]
Сколько еше раз сказать?
← →
miek © (2007-09-05 18:06) [40]есть strtoint в составе shlwapi.dll
смотри в мсдн заголовок и пользуйся
а inttostr и сам за минуту напишешь
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.063 c