Pascal 中记录的横向隐式/显式类型转换
crosswise implicit / explicit type conversation of records in pascal
我想在pascal 中实现两种记录类型的横向类型对话。但我收到错误“错误:预期过程或函数”。这是相关代码:
{$mode objfpc}{$H+}
interface
{$modeswitch advancedrecords}
uses
Classes, SysUtils;
type
TRGBA8 = packed record
r,
g,
b,
a: byte;
public
constructor Create(r_in, g_in, b_in, a_in: byte);
end;
TRGBA16 = packed record
r,
g,
b,
a: word;
public
constructor Create(r_in, g_in, b_in, a_in: word);
class operator Explicit(const c_in: TRGBA16): TRGBA8; inline;
class operator :=(const c_in: TRGBA16): TRGBA8; inline;
end;
TRGBA8Helper = record helper for TRGBA8
public
class operator Explicit(const c_in: TRGBA8): TRGBA16;
end;
我在声明 TRGBA8Helper 的 Operator Explicit 时收到错误。如何存档横向类型的对话。提前致谢。
我正在使用 Ubuntu 存储库中的 Lazarus 1.8.2 和 FPC 3.0.4。
我找到了解决办法。我的第一次尝试来源于FPC源码的TPoint class (/usr/share/fpcsrc/3.0.4/rtl/objpas/types.pp)。在 wiki.freepascal.org/Operator_overloading 中可以找到文档的 link:https://www.freepascal.org/docs-html/ref/refch15.html。此页面包含示例。所以我想到了这个解决方案:
{$mode objfpc}{$H+}
interface
{$modeswitch advancedrecords}
uses
Classes, SysUtils;
type
TRGBA8 = packed record
r,
g,
b,
a: byte;
public
constructor Create(r_in, g_in, b_in, a_in: byte);
end;
TRGBA16 = packed record
r,
g,
b,
a: word;
public
constructor Create(r_in, g_in, b_in, a_in: word);
end;
operator Explicit(const c_in: TRGBA16): TRGBA8; inline;
operator :=(const c_in: TRGBA16): TRGBA8; inline;
operator Explicit(const c_in: TRGBA8): TRGBA16; inline;
operator :=(const c_in: TRGBA8): TRGBA16; inline;
因此不需要辅助记录,也不会发生错误。
我想在pascal 中实现两种记录类型的横向类型对话。但我收到错误“错误:预期过程或函数”。这是相关代码:
{$mode objfpc}{$H+}
interface
{$modeswitch advancedrecords}
uses
Classes, SysUtils;
type
TRGBA8 = packed record
r,
g,
b,
a: byte;
public
constructor Create(r_in, g_in, b_in, a_in: byte);
end;
TRGBA16 = packed record
r,
g,
b,
a: word;
public
constructor Create(r_in, g_in, b_in, a_in: word);
class operator Explicit(const c_in: TRGBA16): TRGBA8; inline;
class operator :=(const c_in: TRGBA16): TRGBA8; inline;
end;
TRGBA8Helper = record helper for TRGBA8
public
class operator Explicit(const c_in: TRGBA8): TRGBA16;
end;
我在声明 TRGBA8Helper 的 Operator Explicit 时收到错误。如何存档横向类型的对话。提前致谢。
我正在使用 Ubuntu 存储库中的 Lazarus 1.8.2 和 FPC 3.0.4。
我找到了解决办法。我的第一次尝试来源于FPC源码的TPoint class (/usr/share/fpcsrc/3.0.4/rtl/objpas/types.pp)。在 wiki.freepascal.org/Operator_overloading 中可以找到文档的 link:https://www.freepascal.org/docs-html/ref/refch15.html。此页面包含示例。所以我想到了这个解决方案:
{$mode objfpc}{$H+}
interface
{$modeswitch advancedrecords}
uses
Classes, SysUtils;
type
TRGBA8 = packed record
r,
g,
b,
a: byte;
public
constructor Create(r_in, g_in, b_in, a_in: byte);
end;
TRGBA16 = packed record
r,
g,
b,
a: word;
public
constructor Create(r_in, g_in, b_in, a_in: word);
end;
operator Explicit(const c_in: TRGBA16): TRGBA8; inline;
operator :=(const c_in: TRGBA16): TRGBA8; inline;
operator Explicit(const c_in: TRGBA8): TRGBA16; inline;
operator :=(const c_in: TRGBA8): TRGBA16; inline;
因此不需要辅助记录,也不会发生错误。