【问题标题】:Can i define my own string type in pascal?我可以在 pascal 中定义自己的字符串类型吗?
【发布时间】:2023-07-18 06:40:01
【问题描述】:

我读过我不能真正动态地分配一个帕斯卡数组,但我也在考虑实现一个字符串结构。
在 C 语言中,我会通过创建一个 struct 来解决它,其中包含一个指向字符数组(包含字符)、一个长度整数和一个大小的指针。然后,当它需要调整大小时,我会 malloc char *realloc 它。

typedef struct {
    size_t size;
    size_t length;
    char* contents;
} String;

这可以在 (ISO) 帕斯卡中完成吗?如果是这样,一个人会怎么做?我不想使用内置的 pascal 动态数组,因为它有点违背了创建自己的字符串类型的目的。

从 cmets 看来,ISO pascal(标准和扩展)似乎不支持这些东西。那我怎么用 free pascal 做呢?

【问题讨论】:

  • 是的,这可以做到,而且可以通过许多不同的方式来做到。这也取决于您使用的是哪种 Pascal。今天使用了几种不同版本的 Pascal。 (FreePascal 和 Delphi 是其中的两个。)另外,根据您使用的 Pascal 的类型,dyn 数组方法可能不会太多地破坏目的。最后,我不知道你说不能“在 Pascal 中真正动态分配数组”是什么意思。
  • @AndreasRejbrand 我想到了 ISO 帕斯卡。我的意思是,因为数组都是它自己的类型,所以动态创建类型是行不通的。
  • 标准 Pascal (ISO 7185) 没有 malloc、GetMem 或其他变长分配功能,因此似乎无法在符合标准的程序中分配变长 contents。 Extended Pascal (ISO 10206) 也没有。
  • @Doj 所以扩展的帕斯卡是标准帕斯卡?好的,注意到了。那么,帕斯卡真的是有限的吗?伤心。似乎是一门很好的语言
  • 广泛使用的术语“标准帕斯卡”仅指 ISO 7185。术语“扩展帕斯卡”仅指 ISO 10206。这两个 ISO 标准都被认为已过时,主要用于教育目的. Free Pascal 和 Delphi 有自己的 Pascal 方言。

标签: memory-management pascal


【解决方案1】:

在 Free Pascal 中,它可以实现类似于提到的 C 方法:

type
TMyString = record
  size: SizeUInt;
  length: SizeUInt;
  contents: PAnsiChar;
end;

...

procedure AllocMyString(var S: TMyString; L: SizeUInt);
begin
  S.size := 0;
  S.length := L;
  GetMem(Pointer(S.contents), L);
end;

procedure ReallocMyString(var S: TMyString; L: SizeUInt);
begin
  S.size := 0;
  S.length := L;
  ReAllocMem(Pointer(S.contents), L);
end;

【讨论】:

    最近更新 更多