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,因为它在读取(写入)之前被分配(读取)。