2017-05-29 1 views
1

私は複数のことができるメニューを持っているこのパスカルアプリケーションに取り組んでいます。Pascal:配列の書き換え中にエラーが発生しました

私のプログラムのようなアルバムを入力して、現在のアルバムを上書きして編集しようとすると、画像のようにエラーが発生します。

enter image description here

警告以外のコンパイル時にエラーは発生していません:

(100,9)警告:関数の結果変数は、ここで

を初期化していないようだ私ですコード:

program MusicPlayer; 
uses TerminalUserInput; 

type 
    // You should have a track record 
    TrackRec = record 
     name: String; 
     location: String; 
    end; 
    type TrackArray = array of TrackRec; 
    GenreType = (Pop, Rap, Rock, Classic); 
    AlbumRec = Record 
     name: String; 
     genre: GenreType; 
     location: array of TrackRec; // this and track should be track: array of TrackRec 
     numberOfTracks: Integer; 
     tracks: TrackArray; 
    end; 
type AlbumArray = array of AlbumRec; // this should be an array of AlbumRec 




function ReadGenre(prompt: String): GenreType; 
var 
    option: Integer; 
begin 
    WriteLn('Press 1 for Pop'); 
    WriteLn('Press 2 for Rap'); 
    WriteLn('Press 3 for Rock'); 
    WriteLn('Press 4 for Classic'); 
    option := ReadInteger(prompt); 

    while (option<1) or (option>3) do 
    begin 
     WriteLn('Please enter a number between 1-4'); 
     option := ReadInteger(prompt); 
    end; 

    case option of 
     1: result := Pop; 
     2: result := Rap; 
     3: result := Rock; 
    else 
     result := Classic; 
    end; 
end; 

function CheckLength(prompt: string): Integer; 
var 
    i: Integer; 
begin 
    i := ReadInteger(prompt); 
    while (i < 0) or (i > 20) do 
    begin 
     WriteLn('Please enter a number between 1-20'); 
     i := ReadInteger(prompt); 
    end; 
    result := i; 
end; 


function ReadTracks(count: Integer): TrackArray; 
var 
    i: Integer; 
begin 
    setLength(result, count); 
    for i := 0 to High(result) do 
    begin 
     result[i].name := ReadString('Track Name: '); 
     result[i].location := ReadString('Track Location: '); 
    end; 
end; 

function ReadAlbum(): AlbumRec; 
begin 
    result.name := ReadString('What is the name of the album?'); 
    result.genre := ReadGenre('What is the genre of the album?'); 
    result.numberOfTracks := CheckLength('How many tracks are in the album?'); 
    result.tracks := ReadTracks(result.numberOfTracks); 
end; 

function ReadAlbums(count: Integer): AlbumArray; 
var 
    i: Integer; 
begin 
    SetLength(result, count); 
    for i := 0 to High(result) do 
    begin 
     result[i] := ReadAlbum(); 
    end; 
end; 

function ChangeAlbum(count: Integer): AlbumArray; 
var 
    i: Integer; 
begin 
    for i := count to count do 
    begin 
     result[i] := ReadAlbum(); 
    end; 
end; 

procedure PrintAlbum(count: Integer; album: array of AlbumRec); 
var 
    i: Integer; 
begin 
    if count = 1 then 
    begin 
     for i := 0 to High(album) do 
     begin 
      WriteLn('Album Number: ', i); 
      WriteLn('Album name is: ', album[i].name); 
      WriteLn('Album genre is: ', album[i].genre); 
     end 
    end; 

    for i := 1 to count - 1 do 
    begin 
    WriteLn('Album name is: ', album[i].name); 
    WriteLn('Album genre is: ', album[i].genre); 
    end; 
end; 

procedure PrintTrack(tracks: TrackArray); 
var 
    i: Integer; 

begin 
    i := ReadInteger('Which track number do you wish to play?'); 
    i := i - 1; 
    WriteLn('Now playing track: ', tracks[i].name); 
    WriteLn('Track location: ', tracks[i].location); 
end; 

function CheckIfFinished(): Boolean; 
var answer: String; 
begin 
    WriteLn('Do you want to enter another set of tracks? '); 
    ReadLn(answer); 
    LowerCase(answer); 
    case answer of 
     'no': result := true; 
     'n': result := true; 
     'x': result := true; 
    else 
     result := false; 
    end; 
end; 

procedure Main(); 
var 
    i, count, select, change: Integer; 
    albums: AlbumArray; 
begin 
    WriteLn('Please select an option: '); 
    WriteLn('-------------------------'); 
    WriteLn('1. Read Albums'); 
    WriteLn('2. Display Albums'); 
    WriteLn('3. Select an Album'); 
    WriteLn('4. Update an Album'); 
    WriteLn('5. Exit'); 
    WriteLn('-------------------------'); 
    repeat 
     i := ReadInteger('Your Option:'); 
     case i of 
      1: 
      begin 
       count := ReadInteger('How many albums: '); 
       albums := ReadAlbums(count); 
      end; 

      2: 
      begin 
       WriteLn('1. Display All Albums'); 
       WriteLn('2. Display All Albums by Genre'); 
       select := ReadInteger('Your Option: '); 
       if i = 1 then 
        begin 
         PrintAlbum(select, albums); 
        end; 
       // if i = 2 then 
       // WriteLn('1. Pop'); 
       // WriteLn('2. Rap'); 
       // WriteLn('3. Rock'); 
       // WriteLn('4. Classic'); 
       // albums := ReadAlbums(count); 
      end; 

      3: 
      begin 
       select := ReadInteger('Which album would you like to play? '); 
       PrintAlbum(select, albums); 
       PrintTrack(albums[select-1].tracks); 
      end; 

      4: 
      begin 
       change := ReadInteger('Which album would you like to edit?'); 
       albums := ChangeAlbum(change); 
      end; 
     end; 
    until i = 5; 
end; 

begin 
    Main(); 
end. 
+0

一度に1つの質問がここにあります。私はそれを編集しました。 –

答えて

0

f

警告:関数の結果変数は

そして実際結果変数を初期化していないよう警告がライン100上を指し、慰めには、警告が言う

function ChangeAlbum(count: Integer): AlbumArray; 
var 
    i: Integer; 
begin 
    for i := count to count do 
    begin 
     result[i] := ReadAlbum(); 
    end; 
end; 

です初期化されていません。

しかし、機能の設計は間違っています。配列内の既存の要素を変更しようとしています。新しい配列を返すべきではありません。しかし、この機能は必要ではありません。削除するだけです。次に、関数を呼び出す場所を調べる必要があります。

あなたはこのように代わりにコードべき
change := ReadInteger('Which album would you like to edit?'); 
albums := ChangeAlbum(change); 

change := ReadInteger('Which album would you like to edit?'); 
albums[change] := ReadAlbum(); 

私はあなたのプログラムの中で何かを確認していませんでした。他の問題があると私は驚くことはありません。私はちょうどあなたが求めた特定の質問に対処しようとしました。

+0

はい、あなたよりもうまくいきました。私はあなたがそこで使ったロジックを見ることができます。配列の正しい位置にアクセスするために "-1"を追加してはいけませんか? –

+0

1ベースの入力が必要な場合はyesを、内部0ベースのインデックスに変換するには1を引く必要があります –

+0

すべてのアルバムを印刷するかどうか、または選択した場合のみジャンル別に質問すると、ここで、または私は90分待つ必要がありますか?できるだけ早く完了させようとしています –

関連する問題