ich glaube, Sie haben schaffte es, sich durch das wa zu verwirren y Sie haben Ihr albumRecord.Tracks deklariert. Was Sie hätten tun sollen, ist einen trackArray-Typ zu deklarieren und deklariert Ihre readTracks, um eine Instanz dieses Array-Typs zurückzugeben.
Ihr Hauptproblem bestand darin, dass Ihr readAlbum ein albumRecord zurückgibt, aber Sie haben sein Spurenfeld so eingerichtet, dass es von readTracks zugewiesen wird, das den falschen Typ, also albumRecord, anstelle eines Arrays von Spuren zurückgibt. Ein anderer Weg, da Sie readAlbum zum Zurückgeben eines albumRecord deklariert haben, generiert der Compiler Code, der beim Eintritt in die Funktion eine Instanz von albumRecord auf dem Stack einrichtet, die schließlich als Rückgabewert von zurückgegeben wird die Funktion, wenn sie abgeschlossen ist. Ihr Code in der Funktion besteht einfach darin, die Felder dieses Datensatzes auszufüllen und nicht eine andere Instanz davon zu erstellen, wie es Ihre result.tracks := readTracks()
getan hätte, vorausgesetzt, Sie hatten readTracks deklariert.
Der folgende Code ändert die Deklarationen und den Code in readTracks, so dass es das tut, was Sie beabsichtigen.
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, ich glaube, Sie Ihren Code viel klarer finden würden, wenn Sie es nach einer Weile zurückkommen, wenn man sich angewöhnt, eine Namenskonvention für Erklärungen von Aufnahme- und Array-Typen zu verwenden, die sie auszeichnet von Instanzen von ihnen. Eine Konvention besteht darin, dem Typnamen ein "T" voran zu stellen, also wäre dies TtrackRecord, TalbumRecord, TtrackArray.
Auch btw, die Sie in Ihrem q sagen
The current error when executing the code is: Error: Incompatible types
Eigentlich ist das nicht ganz richtig. Der Fehler tritt auf, während der Compiler den Code kompiliert, nicht wenn der Code ausgeführt wird. Dies ist ein wichtiger Unterschied: Ihr Fehler wird als Fehler bei der Kompilierung bezeichnet, während einer, der bei der Ausführung Ihres Programms auftritt (was nur nach erfolgreicher Kompilierung möglich ist), wird als Laufzeitfehler bezeichnet.