Delphi 数组:变量 Myvar 可能未初始化
Delphi Array: Variable Myvar might not been initialized
我正在为学校开发一个程序(Cinema 应用程序),但我的数组有问题。我的应用已关闭但未显示任何内容。
program TFE;
{$APPTYPE CONSOLE}
uses
SysUtils,
StrUtils,
Crt;
var
MovieList, MovieInfo: Text;
Choice: Byte;
i: Integer;
L: String;
S: array of String[14];
begin
i := 0
Assign(MovieInfo, 'MovieInfo.txt');
Reset(MovieInfo);
Readln(Choice);
i := 0;
ClrScr;
While not eof (MovieInfo) do
begin
Readln(MovieInfo, L);
S[i] := L;
i := i + 1;
end;
Writeln(S[Choice]);
Readln;
end.
这就是我目前所有的代码。
有人可以帮助我吗?
您收到的消息是正确的,因为您只在 while not eof
循环中使用数组。在那一刻,编译器无法知道文件的内容。就他而言,它可能是空白的。如果文件确实是空白的,他将完全跳过 while not eof
部分并直接进入数组写入部分。因为从未使用过该数组,所以它没有定义的值,因此出现此消息。
解决方法很简单:用 0:
初始化数组的值
program TFE;
{$APPTYPE CONSOLE}
uses
SysUtils,
StrUtils,
Crt;
var
MovieList, MovieInfo: Text;
Choice: Byte;
i: Integer;
L: String;
S: array of String[14];
begin
SetLength(s,10); //10 is an example
for i:=0 to Length(s) do
s[i]:='';
Assign(MovieInfo, 'MovieInfo.txt');
Reset(MovieInfo);
Readln(Choice);
i := 0;
ClrScr;
While not eof (MovieInfo) do
begin
Readln(MovieInfo, L);
S[i] := L;
i := i + 1;
end;
Writeln(S[Choice]);
Readln;
end.
深入研究您的代码,您定义了 MovieList
和 MovieInfo
,但您只使用了 MovieInfo
。为什么?
在标题中您提到了一个变量 MyVar
,但是代码没有显示任何这样的变量。为了将来参考,请在发帖前仔细校对您的问题。
您已经声明了一个动态数组:
S: array of String[14];
即14个字符串(短字符串)的数组。但是你从来没有设置这个数组的长度,所以它根本不能容纳任何字符串。
使用 procedure SetLength(var S: <string or dynamic array>; NewLength: Integer);
为数组中的项目分配 space。
由于您不知道(我推测)文件中可能有多少部电影,您必须先分配一些数量,然后准备扩展数组(重新调用 SetLength()
)如果在从文件中读取所有电影之前数组被填满。例如,用 space 初始化(在 while 循环之前)10 部电影:
SetLength(S, 10);
然后在 while 循环中,例如就在 ReadLn()
、
之前
if i > (Length(S)-1) then
SetLength(S, Length(S)+10);
另一条评论是,当要求用户进行选择时,不会出现任何提示,但这可能仍在开发中;-)
我正在为学校开发一个程序(Cinema 应用程序),但我的数组有问题。我的应用已关闭但未显示任何内容。
program TFE;
{$APPTYPE CONSOLE}
uses
SysUtils,
StrUtils,
Crt;
var
MovieList, MovieInfo: Text;
Choice: Byte;
i: Integer;
L: String;
S: array of String[14];
begin
i := 0
Assign(MovieInfo, 'MovieInfo.txt');
Reset(MovieInfo);
Readln(Choice);
i := 0;
ClrScr;
While not eof (MovieInfo) do
begin
Readln(MovieInfo, L);
S[i] := L;
i := i + 1;
end;
Writeln(S[Choice]);
Readln;
end.
这就是我目前所有的代码。 有人可以帮助我吗?
您收到的消息是正确的,因为您只在 while not eof
循环中使用数组。在那一刻,编译器无法知道文件的内容。就他而言,它可能是空白的。如果文件确实是空白的,他将完全跳过 while not eof
部分并直接进入数组写入部分。因为从未使用过该数组,所以它没有定义的值,因此出现此消息。
解决方法很简单:用 0:
初始化数组的值 program TFE;
{$APPTYPE CONSOLE}
uses
SysUtils,
StrUtils,
Crt;
var
MovieList, MovieInfo: Text;
Choice: Byte;
i: Integer;
L: String;
S: array of String[14];
begin
SetLength(s,10); //10 is an example
for i:=0 to Length(s) do
s[i]:='';
Assign(MovieInfo, 'MovieInfo.txt');
Reset(MovieInfo);
Readln(Choice);
i := 0;
ClrScr;
While not eof (MovieInfo) do
begin
Readln(MovieInfo, L);
S[i] := L;
i := i + 1;
end;
Writeln(S[Choice]);
Readln;
end.
深入研究您的代码,您定义了 MovieList
和 MovieInfo
,但您只使用了 MovieInfo
。为什么?
在标题中您提到了一个变量 MyVar
,但是代码没有显示任何这样的变量。为了将来参考,请在发帖前仔细校对您的问题。
您已经声明了一个动态数组:
S: array of String[14];
即14个字符串(短字符串)的数组。但是你从来没有设置这个数组的长度,所以它根本不能容纳任何字符串。
使用 procedure SetLength(var S: <string or dynamic array>; NewLength: Integer);
为数组中的项目分配 space。
由于您不知道(我推测)文件中可能有多少部电影,您必须先分配一些数量,然后准备扩展数组(重新调用 SetLength()
)如果在从文件中读取所有电影之前数组被填满。例如,用 space 初始化(在 while 循环之前)10 部电影:
SetLength(S, 10);
然后在 while 循环中,例如就在 ReadLn()
、
if i > (Length(S)-1) then
SetLength(S, Length(S)+10);
另一条评论是,当要求用户进行选择时,不会出现任何提示,但这可能仍在开发中;-)