【发布时间】:2011-10-26 19:56:02
【问题描述】:
我喜欢 Pascal 的清晰性,因此请相信以下代码 sn-p 以及问题标题是不言自明的:
procedure TForm1.FormClick(Sender: TObject);
const
N = 42; { fnord }
type
{ this structure merely defines memory layout }
TStringStruct = record
NumberOfCharacters: Cardinal;
{ this array supposed to be friendly for the string type }
StringCompatibleArray: array [0..N-1] of Char;
end;
{ actual work is done with pointer to that structure }
PStringStruct = ^TStringStruct;
var
StringStruct: PStringStruct;
S: string;
begin
StringStruct := PopulatedElsewhere;
{ most pleasant code but will copy no more than N characters }
S := StringStruct^.StringCompatibleArray;
{ this construct works but is way too ugly and complex }
SetString(
S,
{ in particular: must reference the array and then typecast to make it work }
{ default $T- state assumed, unfortunately $T+ has global effect and not useful here }
PChar(@StringStruct^.StringCompatibleArray),
StringStruct^.NumberOfCharacters
);
end;
如果有人想要正式的问题:我想看看我必须执行哪些选项来执行此类分配,最好比SetString 电话显示的更隐蔽。
注意:我知道哪些解引用运算符对于结构化类型是可选的。
【问题讨论】:
-
看起来你正在实现一些类似 Pascal 字符串的东西。您可以尝试使用运算符重载。重载隐式和显式转换运算符。附言在选民徽章上做得很好!
-
如果你不知道;您可以使用双反斜杠注释掉一行代码,而不是用大括号括起来,例如"// 这个结构仅仅定义了内存布局"