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.

深入研究您的代码,您定义了 MovieListMovieInfo,但您只使用了 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);

另一条评论是,当要求用户进行选择时,不会出现任何提示,但这可能仍在开发中;-)