2017-10-02 8 views
0

Ich erstelle ein Mini-Programm in Pascal, um Musikalben zu lesen. Das Problem, mit dem ich konfrontiert bin, ruft die Funktion readTracks() innerhalb meiner Funktion readAlbum() auf. Jede Hilfe wäre toll, danke :)Wie rufe ich eine Funktion innerhalb einer Funktion auf?

Der aktuelle Fehler bei der Ausführung des Codes ist: Fehler: Inkompatible Typen: got „albumRecord“ erwartet „albumRecord.Dynamic Array von 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; 

Antwort

2

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.

0

Spuren ein Array, und somit muss die Indizierung. Welche Nummer lesen Sie?

in der for-Schleife wissen Sie, wie das Array-Index, also warum kann man es in readalbum nicht tun?

Verwandte Themen