-
Сергей М. © (04.04.08 11:19) [38]
В программе должно быть все красиво - и размер, и скорость, и структура, внешняя и внутренняя. Не должно быть ничего лишнего. Если программирование искусством считать, конечно. А для себя я считаю именно так.
-
clickmaker © (04.04.08 11:23) [39]
Как раз таки я и пытаюсь жонглировать паскалевскими строками, а не нуль-терминированными. Использую встроенный в Windows менеджер памяти (HeapAlloc, HeapFree), он не вызывает исключения, если его специально не просить.
-
> В программе должно быть все красиво
У тебя искаженные представления о красоте.
> Не должно быть ничего лишнего
Не пользуйся типами данных с управляемым временем жизни - не будет ничего лишнего. Но и не хнычь при этом, мол, "pchar не хочу, асм тоже не хочу, хочу длинные строки, че за фигню мне впаривает компайлер")
-
> пытаюсь жонглировать паскалевскими строками
А как же насчет "ничего лишнего" ? Ведь длинные длинные строки содержат "лишний заголовок" !) Как же ты с этим миришься при таких амбициях ?)
-
Понимаешь ли, создавать свою красоту резонно лишь полностью постигнув чужую)
-
Сергей М. © (04.04.08 11:32) [43]
> Ведь длинные длинные строки содержат "лишний заголовок" !)
Их размер что-ли? Так это наоборот очень хорошо - во-первых, в них можно хранить любые бинарные данные, а во-вторых, не нужно пробегать по всей строке, чтобы вычислить длину.
-
> Тыщ (04.04.08 11:34) [45]
> в них можно хранить любые бинарные данные
Ты их и в нуль-терминированной строке хранить можешь, ничто этому не препятствует.
Там еще и сч-к имеется, а к работе со сч-ками (и не только с ним) тебе прилагается довольно увесистый "джентльменский набор" подпрограмм в составе system.pas.
Если тебе не понадобится львиная доля этих п/программ, то как насчет красоты, притом что они будут фигурировать в твоем исп.модуле мертвым грузом ?)
-
Сергей М. © (04.04.08 11:44) [46]
> Ты их и в нуль-терминированной строке хранить можешь, ничто этому не препятствует.
Встретится там #0, и обрежет строку.
> ...
Вы не правы, из "джентльменского набора" исключаются все неиспользуемые функции и не будут мертвым грузом.
-
> Встретится там #0, и обрежет строку.
зависит от того, кто встретит
-
> Встретится там #0, и обрежет строку
Чавой-то ?!
Какая такая "обрежет", если ты сознательно работаешь с буфером строки как с областью памяти, содержащей произвольные бин.данные ?
> Вы не правы
Где аргументы ?)
-
Сергей М. © (04.04.08 11:54) [49]> Какая такая "обрежет", если ты сознательно работаешь с буфером строки как с областью памяти, содержащей произвольные бин.данные ? Буфер - это уже не нуль-терминированная строка, и размер его вычисляется не позицией #0. >> исключаются все неиспользуемые функции > Где аргументы ?) var s:string;
begin
s:='Test';
end. program.map: Address Publics by Value
0001:00000000 @GetMem
0001:00000010 @FreeMem
0001:00000020 Move
0001:00000080 @LStrAsg
0001:000000C4 @NewAnsiString
0001:000000F0 ExitProcess
0001:000000F8 GetProcessHeap
0001:00000100 HeapAlloc
0001:00000108 HeapFree
0001:00000110 System
0001:00000114 SysInit
0001:00000138 PROGRAM
0002:00001000 s
-
Естественно, я использую свои собственные System.pas и Sysinit.pas.
-
> размер его вычисляется не позицией #0
А кто тебя заставляет пользоваться п/программами, занимающимися именно таким вычислением ?
> program.map
И где здесь аргумент, отрицающий факт присутствия в образе исп.модуля машкода, соответствующего, например, ф-ции _IntfClear ?
-
> я использую свои собственные System.pas и Sysinit.pas
И при этом компилятор упорно вставляет блок и все работает ? Даже если в покоцаном system нет ни намека на п/п HandleFinally ?
Чудеса)
Впрочем, покоцал исп.модуль ты сам, а не компилятор. Компилятор честно включил весь машкод сист.юнитов в будущий объектный код)
-
> будущий
Это я сморозил.
-
Сергей М. © (04.04.08 12:09) [52]
> А кто тебя заставляет пользоваться п/программами, занимающимися именно таким вычислением ?
Давайте закончим обсуждение нуль-терминированных строк на том, что в нуль-терминированной строке нельзя хранить бинарные данные, содержащие нули.
> И где здесь аргумент, отрицающий факт присутствия в образе исп.модуля машкода, соответствующего, например, ф-ции _IntfClear ?
В program.map перечислены все используемые функции и переменные. Вам exe-шник показать?
-
> Тыщ (04.04.08 12:17) [55]
> exe-шник показать?
Ага. И исх.текст system.pas.
-
Сергей М. © (04.04.08 12:14) [53]
>И при этом компилятор упорно вставляет блок и все работает ? >Даже если в покоцаном system нет ни намека на п/п HandleFinally ?
В System.pas нигде нет конструкции, отвечающей именно за блоки обработки исключений. Она защита где-то в компиляторе, то есть, в dcc32.exe.
-
> Она защита где-то в компиляторе
Да ты что ?! А мужики-то и не знали) И это они сами придумали:
procedure _HandleFinally;
asm
MOV ESI, EBX
CMP ECX, UW_EXC_CLASS_BORLANDCPP JNE @@handleIt PUSH EAX
PUSH EDX
PUSH ECX
MOV EDX, [ESP+12]
CALL EDX
POP ECX
POP EDX
POP EAX
CALL SysRaiseCPPException
@@handleIt:
PUSH EAX
PUSH EDX
CALL UnblockOSExceptions
POP EDX
POP EAX
CALL MaybeCooptException
MOV EDX, [ESP]
CALL NotifyExceptFinally
PUSH EAX
MOV EBX, ESI
MOV [EAX].TRaisedException.HandlerEBP, EBP
CALL EDX
POP EAX
MOV [EAX].TRaisedException.HandlerEBP, $FFFFFFFF
PUSH EBP
MOV EBP, ESP
CALL SysRaiseException
MOV EAX,[ESP+4]
MOV EDX,[ESP+8]
TEST [EAX].TExceptionRecord.ExceptionFlags,cUnwindInProgress
JE @@exit
MOV ECX,[EDX].TExcFrame.desc
MOV [EDX].TExcFrame.desc,offset @@exit
PUSH EBX
PUSH ESI
PUSH EDI
PUSH EBP
MOV EBP,[EDX].TExcFrame.hEBP
ADD ECX,TExcDesc.instructions
CALL NotifyExceptFinally
CALL ECX
POP EBP
POP EDI
POP ESI
POP EBX
@@exit:
MOV EAX,1
end;
-
Сергей М. © (04.04.08 12:21) [56]>> exe-шник показать? >Ага. http://tysch.narod.ru/test10.zipSystem.pas пока что не могу показать. Сергей М. © (04.04.08 12:31) [58]Ткните меня носом, где написано mov fs:[eax],esp , пожалуйста.
|