是否有标准函数在Delphi中执行绝对的< - >相对路径转换?
例如:
'C:\Projects\Project1\''..\Shared\somefile.pas''C:\Projects\Shared\somefile.pas'我正在寻找这样的东西:
function AbsToRel(const AbsPath, BasePath: string): string;
// '..\Shared\somefile.pas' =
// AbsToRel('C:\Projects\Shared\somefile.pas', 'C:\Projects\Project1\')
function RelToAbs(const RelPath, BasePath: string): string;
// 'C:\Projects\Shared\somefile.pas' =
// RelToAbs('..\Shared\somefile.pas', 'C:\Projects\Project1\')
Run Code Online (Sandbox Code Playgroud) 在C/C++中你总是有
SizeOf(array[N] of T) = N * SizeOf(T);
Run Code Online (Sandbox Code Playgroud)
在Pascal/Delphi中,您可以使用'packed array'来确保上面的断言是正确的,但'packed'说明符对Delphi中的数组有什么实际价值吗?我无法创建一个'unpacked'数组的例子,数组似乎总是'打包':
type
A = array[0..2] of Byte;
B = array[0..99] of A;
C = packed record
C1, C2, C3: Byte;
end;
D = array[0..99] of C;
procedure TForm10.Button1Click(Sender: TObject);
begin
Assert(SizeOf(A) = 3);
Assert(SizeOf(B) = 300);
Assert(SizeOf(D) = 300);
end;
Run Code Online (Sandbox Code Playgroud)
(C/C++结构和Delphi记录是不同的 - 它们可以'解包',因此由于字段的对齐,结构的大小大于字段大小的总和.)
在Delphi中声明变量让我想到了一件我无法理解的事情.
问题是这样的:声明字符串,一个可以观察到string的一个保留字,同时宣布其他数据类型,比如整数数据类型修饰符是不是保留字,但一个标识符(即Integer,资本我告诉等等).
事实上,德尔福让你去的定义Integer,你发现它是包含在系统单元内,但它是唯一的代表,因为有评论指出,一些常量(像True),标识符(像Integer),函数和过程直接内置到编译器中.
我无法弄清楚这种选择背后的原因.
有人可以帮忙吗?
对类型string和Integer类型之间差异的一点解释.下一个代码
type
Integer = Char;
var
I: Integer;
begin
I:= 'A';
ShowMessage(I);
end;
Run Code Online (Sandbox Code Playgroud)
是正确的,并按预期工作,而下一行
type
string = Integer;
Run Code Online (Sandbox Code Playgroud)
给出编译时错误.
目前我在DUnit中使用2级测试层次结构(测试项目 - >测试用例 - >测试方法;参见下面的示例).是否有可能引入第三级甚至更多级别?

请考虑以下代码:
program Promote;
{$APPTYPE CONSOLE}
uses
SysUtils;
{$HINTS OFF}
type
MyWord = record
FValue: LongWord;
class operator Implicit(AValue: LongWord): MyWord;
end;
class operator MyWord.Implicit(AValue: LongWord): MyWord;
begin
Result.FValue:= AValue;
end;
procedure Test(AValue: MyWord); overload;
begin
Writeln('MyWord');
end;
procedure Test(AValue: UInt64); overload;
begin
Writeln('UInt64');
end;
var
LW: LongWord;
begin
Test(LW);
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
当我运行它(Delphi XE)时,我看到编译器将LongWord参数提升为UInt64(内置类型),而不是MyWord(用户定义的类型).
我是否可以假设Delphi编译器总是将内置类型提升为内置类型(如果在编译器本身中实现了此类提升)?
更一般地说,在这种情况下控制类型促销的规则是什么(比如我们有2个内置类型,或2个用户定义类型等)?
在Delphi中,我通常会编写一个简单的泄漏测试,如下所示:
program MemLeak;
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure Leak;
begin
{ Put leaking code here. }
end;
begin
ReportMemoryLeaksOnShutdown:= True;
try
Leak;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)
如何检测Free Pascal/Lazarus中的内存泄漏?
文档指出接口委派仅适用于Win32.目前我无法测试它,是否在64位编译器中停止了文档错误或接口委托?
请考虑以下过程
procedure InTests;
var
N, K: Integer;
begin
N:= 1111;
if N in [6, 8, 10] // this is correct, readable and effective code
then ShowMessage('OK');
K:= 11;
if N in [6, 8, 10, K] // this is correct but less effective
then ShowMessage('OK'); // (compiler creates local 16-bytes set var)
K:= 1111;
if N in [6, 8, 10, K] // this is a bug (K > 255)
then ShowMessage('OK');
end;
Run Code Online (Sandbox Code Playgroud)
in运营商而不是if链
if (N = 6) or …Run Code Online (Sandbox Code Playgroud) 我需要在Free Pascal中实现简单的性能基准测试.在Delphi中我使用的TStopWatch是Diagnostics单元的记录,我可以在Free Pascal/Lazarus中使用什么?
我们应该从64位Delphi编译器中的浮点支持中得到什么?
64位编译器是否会使用SSE来实现浮点运算?
64位编译器是否支持当前的80位浮点类型(扩展)?
这些问题密切相关,所以我将它们作为一个问题提出来.
delphi ×10
delphi-xe2 ×2
freepascal ×2
lazarus ×2
alignment ×1
arrays ×1
delegation ×1
dunit ×1
interface ×1
memory-leaks ×1
packed ×1
path ×1
stopwatch ×1