【问题标题】:Delphi Array: Variable Myvar might not been initializedDelphi 数组:变量 Myvar 可能未初始化
【发布时间】:2019-05-18 12:39:23
【问题描述】:

我正在为学校(电影应用程序)开发一个程序,但我的阵列有问题。我的应用已关闭,但没有显示任何内容。

    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.

暂时是我的全部代码。 有人可以帮助我吗?

【问题讨论】:

  • 哎哟!关于文件处理,你的老师教你什么?你使用的技术已经过时了。如果您的 Delphi 版本可以追溯到这十年,您可以通过一次调用 TFile.ReadAllLines 得到您想要的;如果没有,我会建立一个TStringList 并在其上调用LoadFromFile
  • @MasonWheeler 我认为他学习了基本的文件处理。他的代码告诉我他是编程初学者。
  • @BogdanDoicin 当然,但这是基本文件处理的 1980 年代 Pascal 版本。自 Delphi 1 以来,出现了更好的技术,而他的老师不教现代版本是在伤害他。
  • @MasonWheeler 我同意
  • 没有名为 Myvar 的变量。

标签: delphi pascal


【解决方案1】:

在标题中,您谈到了变量MyVar,但代码没有显示任何此类变量。为了将来参考,请在发布前仔细校对您的问题。

你已经声明了一个动态数组:

S: array of String[14];

即14个字符串(短字符串)的数组。但是你从来没有设置这个数组的长度,所以它根本不能保存任何字符串。

使用procedure SetLength(var S: <string or dynamic array>; NewLength: Integer); 为数组中的项目分配空间。

由于您不知道(我推测)文件中可能有多少部电影,您必须先分配一些数量,然后准备扩展数组(通过新调用 SetLength())如果数组变为在从文件中读取所有电影之前填充。例如,初始化(在 while 循环之前)有 10 部电影的空间:

SetLength(S, 10);

然后在while循环中,例如就在ReadLn()之前,

if i > (Length(S)-1) then
  SetLength(S, Length(S)+10);

另一条评论是,当要求用户选择时,不会向用户显示任何提示,但也许这仍在开发中;-)

【讨论】:

    【解决方案2】:

    您收到的消息是正确的,因为您只使用 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。为什么?

    【讨论】:

    • 我不明白您尝试使用添加的 for 循环来实现什么。它当然不会...用 0... 初始化数组的值。数组是空的,没有什么要初始化的。相反,您首先引入错误,因为 0 与字符串不兼容,然后您无法写入空(0 长度)数组。
    • @TomBrunberg 是的。我匆匆写下答案。错误已更正。
    • 您添加的for 循环仍然没有意义。最后一次,数组(如图所示)没有任何元素!在使用 SetLength() 添加元素之前,您不能写入动态数组。
    • 也修复了这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2016-02-24
    • 2012-03-25
    • 2015-07-04
    相关资源
    最近更新 更多