【问题标题】:Why does setting a Char variable to nil cause compilation to fail?为什么将 Char 变量设置为 nil 会导致编译失败?
【发布时间】:2020-11-15 21:27:55
【问题描述】:

在我下面的例子中,我不希望在读取文件的第一个字符之前将c 分配给任何东西。

我尝试将Char 变量c 设置为nil (c := nil;) 但编译失败。我尝试了如下所示的空字符串,但仍然无法正常工作。

当我将它设置为空白时它可以工作,但我必须这样做似乎很奇怪。

有什么方法可以像在其他语言中那样将 Char 初始化为 null 类似的值?

program CSVToMarkdown;
 
{$mode objfpc}{$H+}{$J-}

uses
    Sysutils;

var
    f: File of Char;
    c: Char;

begin
    Assign(f, 'test.csv');
    Reset(f);
    c := '';

    while not Eof(f) do
    begin
        Read(f, c);
        Write(c);
    end;

     Close(f);

    ReadLn;
end.

【问题讨论】:

  • 相关:stackoverflow.com/questions/9618587/…。您可能已经知道这一点,但是您当然可以将c 设置为ASCII NUL 字符:c := #0。实际上,您不需要手动执行此操作,因为作为 全局 变量,c 已初始化为此。
  • 您不需要初始化变量 c,因为它在被读取(通过写入)之前已分配给(通过 Read)。跨度>

标签: pascal freepascal lazarus


【解决方案1】:

NIL 是指针的值,或一般的引用类型(接口、类、动态数组)。

非引用类型没有 NIL 值,char 类型可以取值从 #0 到 #255,并且都是有效的,尽管有时在与其他语言接口时 #0 被解释为字符串的结尾。

如果您指的是 Java 或 .NET 中的可空类型,则没有对它们的默认支持,因为它们的缺点是类型变得比需要的大(iow 成为添加了 NULL 布尔值的伪记录)。

有一些基于泛型的解决方案尝试实现可为空的类型,但我没有使用过它们,它们也不是标准分发的一部分。

【讨论】:

  • 我已经编辑了我的问题。我不小心放了initialize a string to a null,我的意思是initialize a Char to a null
  • @BugHunterUK:你的意思是 ASCII NUL 字符吗?如果是这样,它是#0,但c 在程序启动时已经具有该值,因为它是一个全局 变量。
  • 我很确定我收到了关于 c 未初始化的编译器错误。我通过删除c := ' '; 重试,它成功了。问题解决了。
  • 空格字符似乎与设置为 nil 或 null 值不同。看来您可能在这里使用试错法。
  • @DavidHeffernan 差不多。我刚刚开始学习语言。我正在关注pascal docs的一个例子。我不知道它已经初始化为#0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多