2017-10-02 9 views
0

Je crée un mini programme en pascal pour lire des albums de musique. Le problème auquel je suis confronté appelle la fonction readTracks() dans ma fonction readAlbum(). Toute aide serait génial, merci :)Comment appeler une fonction dans une fonction?

L'erreur actuelle lors de l'exécution du code est: Erreur: types incompatibles: obtenu "albumRecord" prévu « Array albumRecord.Dynamic de TrackRecord

type 

trackRecord = record 
    trackName:string; 
    fileLocation: string; 
end; 

albumRecord = record 
    albumName:string; 
    tracks: array of trackRecord; 
end; 

function readTracks():albumRecord; 
var 
    i:Integer; 
    numOfTracks:Integer; 
begin 
    numOfTracks := readInteger('Enter number of tracks: '); 
    setLength(result.tracks, numOfTracks); 

    for i:= 0 to high(result.tracks)do 
    begin 
     Writeln('Enter Track ',i+1,' Details: '); 
     result.tracks[i].trackName := readString('Enter track name: '); 
     result.tracks[i].fileLocation := readString('Enter file 
     location: '); 
    end; 

end; 

function readAlbum (prompt: string): albumRecord; 
begin 
    result.albumName := readString('Enter Album Name: '); 
    result.tracks := readTracks(); 
end; 

Répondre

2

Je pense que vous avez réussi à vous confondre par le wa Vous avez déclaré votre album "RecordRecord.Tracks". Ce que vous auriez dû faire est de déclarer un type trackArray et de déclarer votre readTracks pour renvoyer une instance de ce type de tableau. Votre problème principal était que votre readAlbum renvoyait un albumRecord, mais que vous aviez configuré son champ de pistes à attribuer à readTracks, ce qui renvoie le mauvais type, c'est-à-dire albumRecord, plutôt qu'un tableau de pistes. Autrement dit, comme vous avez déclaré readAlbum pour retourner un albumRecord, le compilateur va générer un code qui, à l'entrée de la fonction, configure une instance de albumRecord sur la pile, qui est finalement retournée comme valeur de retour de la fonction quand elle se termine. Votre code dans la fonction est simplement de remplir les champs de cet enregistrement, pas de créer une autre instance comme votre result.tracks := readTracks() l'aurait fait, étant donné que vous aviez déclaré readTracks.

Le code ci-dessous modifie les déclarations et le code dans readTracks afin qu'il fasse ce que vous voulez.

uses TerminalUserInput; 

type 

trackRecord = record 
    trackName:string; 
    fileLocation: string; 
end; 

trackArray = array of trackRecord; 

albumRecord = record 
    albumName:string; 
    tracks: trackArray; 
end; 

function readTracks():trackArray; 
var 
    i:Integer; 
    numOfTracks:Integer; 
begin 
    numOfTracks := readInteger('Enter number of tracks: '); 
    setLength(result, numOfTracks); 

    for i:= 0 to high(result)do 
    begin 
     Writeln('Enter Track ',i+1,' Details: '); 
     result[i].trackName := readString('Enter track name: '); 
     result[i].fileLocation := readString('Enter file location: '); 
    end; 

end; 

function readAlbum (prompt: string): albumRecord; 
begin 
    result.albumName := readString('Enter Album Name: '); 
    result.tracks := readTracks(); 
end; 

begin 
    readAlbum('New album'); 
end. 

BTW, je pense que vous trouverez votre code beaucoup plus clair, quand vous revenez au bout d'un certain temps si vous avez l'habitude d'utiliser une convention de nommage pour les déclarations de types gistrements et tableau qui les distingue à partir d'exemples d'entre eux. Une convention est de précéder le nom de type avec un 'T', donc votre serait TtrackRecord, TalbumRecord, TtrackArray.

également BTW, dans votre q vous dites

The current error when executing the code is: Error: Incompatible types

En fait, ce n'est pas tout à fait correct. L'erreur se produit pendant que le compilateur compile le code, pas lorsque votre code est en cours d'exécution. C'est une différence importante: votre erreur est connue comme une erreur de compilation, tandis que celle qui se produit lorsque votre programme s'exécute (ce qu'elle ne peut faire qu'une fois qu'elle a été compilée avec succès) est connue comme une erreur d'exécution.

0

pistes est un tableau, et doit donc l'indexation. quel numéro vous lisez?

dans la boucle vous ne savez comment indexer le tableau, alors pourquoi ne pas vous le faire dans readalbum?