You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pascal文本菜单音乐播放器编译错误排查求助

Fixing Your Pascal Text Menu Music Player Compilation Errors

Hey there, let's work through those compilation errors one by one—they're all straightforward type mismatches, and once we fix those, you'll be well on your way to getting your text-based music player up and running.

Let's Break Down Each Error

1. Line 82: ShortString vs Album Mismatch

Your PrintAllGenres function is calling DisplayAlbum(albums[i].genre)—but genre is just a string, and DisplayAlbum expects a full Album record. The function name suggests you want to list all genres from your albums, so instead of passing the genre to a function meant for full albums, we'll directly print each genre.

2. Line 138: albumArray vs Album Mismatch

In the DisplayAlbums menu, when the user selects option 1 ("Display all albums"), you're passing the entire albums array to DisplayAlbum, which only accepts a single album. We need to loop through the array and call DisplayAlbum for each individual entry.

3. Line 164: albumArray vs Album Mismatch

The UpdateAlbum function is designed to modify a single album, but you're passing the whole array to it in the main menu's option 4. We'll adjust this to let the user pick an album index first, then update that specific entry in the array.

Also, you commented out the trackNum field in the Album record, but DisplayAlbum tries to use it—we'll fix that too.

Fixed Code with Explanations

Here's the corrected code with comments pointing out key changes:

program MusicPlayer;
uses TerminalUserInput;

type
  Track = record
    trackName: String;
    location: String;
  end;
  TrackArray = array of Track;

  Album = record
    albumName: String;
    artistName: String;
    genre: String;
    track: TrackArray;
    trackNum: Integer; // Uncommented since DisplayAlbum relies on this
  end;
  albumArray = array of Album;

function GetAlbums(): albumArray;
var
  fileName: String;
  myFile: TextFile;
  numOfAlb: Integer;
  trackNum: Integer;
  i: Integer;
  j: Integer;
begin
  fileName := ReadString('Enter filename: ');
  AssignFile(myFile, fileName);
  Reset(myFile);
  ReadLn(myFile, numOfAlb);
  setLength(result, numOfAlb);
  for i:= 0 to High(result) do
  begin
    ReadLn(myFile, result[i].albumname);
    ReadLn(myFile, result[i].artistName);
    ReadLn(myFile, result[i].genre);
    ReadLn(myFile, trackNum);
    result[i].trackNum := trackNum; // Store track count in the album record
    setLength(result[i].track, trackNum);
    for j:= 0 to trackNum -1 do
    begin
      ReadLn(myFile, result[i].track[j].trackName);
      ReadLn(myFile, result[i].track[j].location);
    end;
  end;
end;

procedure DisplayAlbum(a: Album);
var
  i: Integer;
begin
  WriteLn('Album name is: ', a.albumName);
  WriteLn('Album artist name is: ', a.artistName);
  WriteLn('Album genre is: ', a.genre);
  WriteLn('Number of tracks are: ', a.trackNum); // Now trackNum exists in the record
  for i:= 0 to High(a.track) do
  begin
    WriteLn('Track name is: ', a.track[i].trackName);
    WriteLn('Track location is: ', a.track[i].location); // Fixed typo from "Album name"
  end;
end;

// Updated to print genres correctly
function PrintAllGenres(albums: albumArray): albumArray;
var
  i: Integer;
begin
  result := albums; // Return original array as function expects a return value
  WriteLn('All Genres:');
  for i := 0 to High(albums) do
  begin
    WriteLn('- ', albums[i].genre); // Directly print each genre
  end;
end;

procedure SelectAlbum(const albums: albumArray);
var
  val: Integer;
  i: Integer;
  found: Boolean;
begin
  WriteLn('<< Welcome to the Track Player >>');
  val := ReadInteger('Enter an Album''s index (0 to ', High(albums), '): ');
  found := False;
  for i := 0 to High(albums) do
  begin
    if i = val then
    begin
      WriteLn('Album "', albums[i].albumName, '" is now playing.');
      found := True;
      Break;
    end;
  end;
  if not found then
  begin
    WriteLn('Album was not found, now returning to Main Menu ');
  end;
end;

function UpdateAlbum(a: Album): Album;
begin
  a.albumName := ReadString('Please enter a new name for this album: ');
  a.genre := ReadString('Please enter a new genre for this album: ');
  result := a; // Added return statement to pass back modified album
end;

procedure DisplayAlbums(albums: albumArray);
var
  val: Integer;
  i: Integer;
begin
  repeat
    WriteLn('<< Displaying Albums >>');
    WriteLn('1. Display all albums');
    WriteLn('2. Display genre');
    WriteLn('3. Return to main menu');
    val := ReadInteger('Enter a number to enter menu: ');
    case val of
      1: 
        begin
          // Loop through each album and display it
          for i := 0 to High(albums) do
          begin
            DisplayAlbum(albums[i]);
            WriteLn('------------------------'); // Add separator for readability
          end;
        end;
      2: PrintAllGenres(albums);
    end;
  until val = 3;
end;

procedure Main();
var
  albums: albumArray;
  val: Integer;
  albumIndex: Integer;
begin
  repeat
    WriteLn('<< Text Music Player Menu >>');
    WriteLn('1. Read in Albums');
    WriteLn('2. Display Albums');
    WriteLn('3. Select an Album to play');
    WriteLn('4. Update an existing Album');
    WriteLn('5. Quit');
    val := ReadInteger('Enter a number to enter menu: ');
    case val of
      1: albums := GetAlbums();
      2: DisplayAlbums(albums);
      3: SelectAlbum(albums);
      4: 
        begin
          if Length(albums) = 0 then
          begin
            WriteLn('No albums loaded yet! Please read in albums first.');
            Continue;
          end;
          albumIndex := ReadInteger('Enter the index of the album to update (0 to ', High(albums), '): ');
          if (albumIndex >= 0) and (albumIndex <= High(albums)) then
          begin
            albums[albumIndex] := UpdateAlbum(albums[albumIndex]);
            WriteLn('Album updated successfully!');
          end
          else
          begin
            WriteLn('Invalid album index, returning to main menu.');
          end;
        end;
    end;
  until val = 5;
end;

begin
  Main();
end.

Key Fixes & Improvements:

  • Restored and populated the trackNum field in Album so DisplayAlbum can show track counts correctly.
  • Rewrote PrintAllGenres to directly list genres instead of misusing DisplayAlbum.
  • Added a loop in DisplayAlbums option 1 to show every album in the array.
  • Updated main menu option 4 to let users select an album index before updating it.
  • Added input validation for album indices to handle invalid entries.
  • Fixed a typo in DisplayAlbum where it incorrectly labeled track locations as "Album name".

These changes should resolve all three compilation errors and fix some logical gaps in the code.

内容的提问来源于stack exchange,提问作者Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:17:07