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.