如何在Pascal中输出Set的内容?

时间:2014-11-18 21:42:54

标签: freepascal

我在Pascal中使用简单集,只想输出集合的内容。每次运行代码时,我都会收到以下错误消息:' project1.lpr(17,13)错误:无法读取或写入此类型的变量'。

这是我的代码:

  program Project1;

{$mode objfpc}{$H+}

uses
  sysutils;

type TFriends = (Anne,Bob,Claire,Derek,Edgar,Francy);
type TFriendGroup = Set of TFriends;

Var set1,set2,set3,set4:TFriendGroup;    x:integer;

begin
set1:=[Anne,Bob,Claire];
set2:=[Claire,Derek];
set3:=[Derek,Edgar,Francy];
writeln(set1);
readln;
end.

输出集是否有特殊的方法/功能?

感谢

2 个答案:

答案 0 :(得分:5)

Free Pascal允许没有明确的typinfo调用的枚举的write / writeln()。

所以

{$mode objfpc}  // or Delphi, For..in needs Object Pascal dialect iirc.
var Person :TFriends;

 for Person in Set1 do
    writeln(Person);

工作正常。

使用WriteStr这也可以写入字符串。 (writestr函数类似于write / writestr但后来是一个字符串。最初是为ISO / Mac方言实现的)

答案 1 :(得分:3)

您无法直接将字符集显示为字符串,因为没有为其发出类型信息。为此,您的设置必须是类的已发布属性。

在类中发布后,您可以使用单位 TypInfo ,使用函数 SetToString()将该集显示为字符串。 TypInfo 是FPC单元,它执行所有编译器反射。

您尝试做的简短工作示例:

program Project1;
{$mode objfpc}{$H+}
uses
  sysutils, typinfo;

type
  TFriends = (Anne,Bob,Claire,Derek,Edgar,Francy);
  TFriendGroup = Set of TFriends;

  TFoo = class
  private
    fFriends: TFriendGroup;
  published
    property Friends: TFriendGroup read fFriends write fFriends;
  end;

Var
  Foo: TFoo;
  FriendsAsString: string;
  Infs: PTypeInfo;

begin
  Foo := TFoo.Create;
  Foo.Friends := [Derek, Edgar, Francy];
  //
  Infs := TypeInfo(Foo.Friends);
  FriendsAsString := SetToString(Infs, LongInt(Foo.Friends), true);
  //
  Foo.Free;
  writeln(FriendsAsString);
  readln;
end.

该程序输出:

  

[德里克,埃德加,Francy]

更进一步: