Delphi Array: переменная Myvar может быть не инициализирована - PullRequest
1 голос
/ 18 мая 2019

Я работаю над программой для школы (приложение 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.

Это весь мой код на данный момент. Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

В заголовке вы говорите о переменной 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);

Еще один комментарий заключается в том, что пользователю не предлагается ни одного приглашения при запросе выбора, но, возможно, это все еще в стадии разработки; -)

0 голосов
/ 18 мая 2019

Полученное сообщение верное, потому что вы работаете только с массивом внутри цикла 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. Почему?

...