Pascal 为什么将Char变量设置为nil会导致编译失败?

Pascal 为什么将Char变量设置为nil会导致编译失败?,pascal,freepascal,lazarus,Pascal,Freepascal,Lazarus,在我下面的例子中,在读取文件的第一个字符之前,我不希望将c分配给任何内容 我尝试将Char变量c设置为nil(c:=nil;),但编译失败。我试过下面这样的空字符串,但仍然不起作用 当我将它设置为一个空的空间时,它会工作,但我必须这样做似乎很奇怪 是否有任何方法可以像在其他语言中一样将Char初始化为null类值 program CSVToMarkdown; {$mode objfpc}{$H+}{$J-} uses Sysutils; var f: File of Ch

在我下面的例子中,在读取文件的第一个字符之前,我不希望将
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.

NIL通常是指针或引用类型(接口、类、dyn数组)的值

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

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


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

NIL通常是指针或引用类型(接口、类、dyn数组)的值

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

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


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

我编辑了我的问题。我不小心将
初始化字符串为空
,我的意思是
将字符初始化为空
。@BugHunterUK:你是说ASCII NUL字符吗?如果是这样,它是
#0
,但是
c
在程序启动时已经有了该值,因为它是一个全局变量。我很确定我得到了一个编译器错误,关于
c
没有初始化。我通过删除
c:=''重试成功了。问题已解决。空格字符看起来与设置为nil或null值并不完全相同。“看来你可能在这里使用了试错法。”戴维费南说得很对。我刚开始学这门语言。我遵循的是pascal文档中的一个示例。我不知道它已经初始化为
#0
。我已经编辑了我的问题。我不小心将
初始化字符串为空
,我的意思是
将字符初始化为空
。@BugHunterUK:你是说ASCII NUL字符吗?如果是这样,它是
#0
,但是
c
在程序启动时已经有了该值,因为它是一个全局变量。我很确定我得到了一个编译器错误,关于
c
没有初始化。我通过删除
c:=''重试成功了。问题已解决。空格字符看起来与设置为nil或null值并不完全相同。“看来你可能在这里使用了试错法。”戴维费南说得很对。我刚开始学这门语言。我遵循的是pascal文档中的一个示例。我不知道它已经初始化为
#0
。相关:。您可能已经知道这一点,但当然可以将
c
设置为ASCII NUL字符:
c:=#0
。事实上,您不需要手动执行此操作,因为作为全局变量,
c
已对此进行初始化。您不需要初始化变量c,因为它在读取(写入)之前已分配给(读取)。相关:。您可能已经知道这一点,但当然可以将
c
设置为ASCII NUL字符:
c:=#0
。事实上,您不需要手动执行此操作,因为作为一个全局变量,
c
被初始化为该变量。您不需要初始化变量c,因为它在读取(写入)之前被分配(读取)。