有时我会编写很短的汇编函数
function SeniorBit(Value: LongWord): Integer;
asm
OR EAX,EAX
JZ @@Done
BSR EAX,EAX
INC EAX
@@Done:
end;
Run Code Online (Sandbox Code Playgroud)
这似乎是内联的最佳候选人:
function SeniorBit(Value: LongWord): Integer; inline;
Run Code Online (Sandbox Code Playgroud)
但是Delphi编译器不允许它.为什么?
更新:
感谢ldsandon,有一份关于QC的一份有着5.5年历史的公开报告.该报告包含一些提议(如扩展asm指令)以简化编译器的asm内联.我更倾向于在过程/函数级别上引入"裸"指令,该指令向编译器说它不必为过程创建堆栈帧,并且可选地应保留哪些寄存器(在eax,edx和ecx中).
如果使用BASM代码进行高效内联过程的一般任务很困难(并且可能是不必要的),那么一个好主意是为最重要的案例启用内联(如明确声明的寄存器使用的裸函数).
我假设XML和Delphi文档指南正在成为源代码记录注释的事实标准.那很好.不好的是我找不到任何完全支持这些标准的Delphi文档生成器(免费或商业)(例如Doc-O-Matic Express不支持<list>标签).
问题是:XML文档标准和Delphi源代码XMLDoc文档生成器现在可以使用了什么?
我尝试使用Delphi的匿名方法语法:
type
fun = reference to function(): Integer;
Run Code Online (Sandbox Code Playgroud)
Fpc显示语法错误:
Error: Identifier not found "reference"
Run Code Online (Sandbox Code Playgroud)
什么是免费Pascal相当于Delphi的匿名方法,如果有的话?
Delphi Xe,Win 7,系统TimeZone UTC + 4:0,系统中一周的第一天 - 星期一,时间与time.windows.com同步
在标准组件Delphi Win32的调色板中有组件MonthCalendar,其属性为WeekNubers = true(显示周数),date = now,第一天 - 星期一.
显示19号(今天) - 第43周的数字.
我通过dateutils.WeekOfTheYear(now)=请求号码返回42.

来源(0.5 Mb)http://www.sendspace.com/file/yuz6ko
通过组件MonthCalendar的初始代码判断 - 就像所有它都是真的(即使不暴露一周的第一天,它从系统参数中获取值).
并在询问WeekOfTheYear它被告知,所有被认为也适用标准ISO,但数字不重合:(
无论如何,我不明白,一周消失 - 如果要查看日历,应该是43,如果考虑,那个星期53和去年的第一个问题......
顺便说一下,2011年1月1日的WeekOfTheYear也会回来52但是应该返回1 ...
为什么区别和哪里是正确的?
我已经安装了 Julia、Atom 和 Juno。我曾经认为在开始编写任何代码之前应该创建一个项目,但我在 Juno IDE 中找不到“新项目”项。
Julia 是否支持项目的概念?如果是,我如何创建一个简单的项目,向其中添加 Julia 文件,运行它等?
我正在寻找一个生成Delphi源代码文档的工具,我想尝试一下Doc-O-Matic Express(免费).是否有任何指导初学者如何使用Doc-O-Matic Express来记录Delphi源代码(管理doc-o-matic项目,首选docblock样式,完整的docblock语法等)?
我有RTTI TRttiMethod.Invoke,stdcall和const参数的问题:
obj := TClassRecordTest.Create;
try
b.a := 10; b.b := 100;
a.a := 1; a.b := 2;
writeln('b.a='+IntToStr(b.a)+' b.b='+IntToStr(b.b));
writeln;
writeln('call test1');
writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
r := VToRec(RTTICall(obj, 'Test1', @a, @b));
writeln('test1 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));
a.a := 2; a.b := 3;
writeln('call test2');
writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
r := VToRec(RTTICall(obj, 'Test2', @a, @b));
writeln('test3 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));
a.a := 3; a.b := 4;
writeln('call test3');
writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
r := VToRec(RTTICall(obj, 'Test3', @a, @b));
writeln('test3 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));
a.a := 4; a.b := 5;
writeln('call test4'); …Run Code Online (Sandbox Code Playgroud) 例如,如何为类过程声明类型
type
TTest = class
procedure Proc1;
class procedure Proc2;
class procedure Proc3; static;
end;
TProc1 = procedure of object;
TProc2 = ???;
TProc3 = ???;
Run Code Online (Sandbox Code Playgroud) Delphi文档说可能会使Inc和Dec运算符超载; 我认为没有有效的方法可以做到这一点.以下是尝试重载Inc运算符; 一些尝试导致编译错误,一些尝试导致运行时访问冲突(Delphi XE):
program OverloadInc;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TMyInt = record
FValue: Integer;
// class operator Inc(var A: TMyInt); DCC error E2023
class operator Inc(var A: TMyInt): TMyInt;
property Value: Integer read FValue write FValue;
end;
class operator TMyInt.Inc(var A: TMyInt): TMyInt;
begin
Inc(A.FValue);
Result:= A;
end;
type
TMyInt2 = record
FValue: Integer;
class operator Inc(A: TMyInt2): TMyInt2;
property Value: Integer read FValue write FValue;
end;
class operator TMyInt2.Inc(A: TMyInt2): TMyInt2;
begin
Result.FValue:= A.FValue + 1; …Run Code Online (Sandbox Code Playgroud) 我刚刚安装了 FPC 3.2.0(在 Linux Mint 19.3 上)并尝试使用 FPC IDE。bin我从安装子文件夹启动IDE ./fp,在IDE中编写了一个最简单的程序
program hello;
begin
writeln('hello');
end.
Run Code Online (Sandbox Code Playgroud)
将程序保存为hello.pas,当我编译它时,我得到
(3,1) Fatal: Can't find unit system used by hello
(0) Fatal: Compilation aborted
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为system是编译器的单位,而不是用户的单位。
我尝试用谷歌搜索这个问题,在不同的论坛上找到了几个帖子,其中一个问题可以追溯到2007年,但没有一个问题得到解答。
哪里有办法解决这个问题,或者 FPC IDE 已经死了大约 15 年了?