2017-05-29 5 views
1

Donc je travaille sur cette application pascal qui a un menu où vous pouvez faire plusieurs choses. Après avoir entré un album (ce que fait mon programme) et en essayant de le modifier en écrivant sur l'album en cours, j'obtiens une erreur comme indiqué dans l'image.Pascal: Erreur lors de la tentative de réécriture du tableau et de l'assistance pour l'impression de mon tableau

enter image description here

Il n'y a pas eu d'erreurs lors de la compilation, sauf l'avertissement:

(100,9) Attention: Fonction variable de résultat ne semble pas initialisé

Voici mon code:

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

Une question à la fois ici. Je l'ai édité pour être ainsi. –

Répondre

0

Le f Onction que l'avertissement se réfère, sur la ligne 100, est

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

L'avertissement dit:

Attention: variable de résultat de fonction ne semble pas initialisé

Et en effet, la variable de résultat n'a pas été initialisé.

La conception de la fonction est cependant incorrecte. Vous essayez de modifier un élément existant dans un tableau. Vous ne devriez pas retourner un nouveau tableau. La fonction n'est pas nécessaire cependant. Vous devriez simplement l'enlever. Ensuite, vous devez regarder le seul endroit où vous appelez la fonction.

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

Vous devez code au lieu que, comme ceci:

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

Je n'ai pas vérifié quoi que ce soit d'autre dans votre programme. Je ne serais pas surpris s'il y a d'autres problèmes. Je viens d'essayer de répondre à la question précise que vous avez posée.

+0

Oui cela a fonctionné que vous et moi pouvons voir la logique que vous avez utilisée là. Ne devrais-je pas aussi ajouter "-1" afin qu'il accède à la bonne position dans le tableau? –

+0

Si vous attendez une entrée basée sur 1, alors oui, vous devez soustraire 1 pour convertir à l'index 0 interne –

+0

Quant à mon autre question sur l'impression de tous les albums ou juste par genre si sélectionné, serait-il trop demander ici ou dois-je attendre les 90 minutes? Juste essayer de le faire dès que possible –