如何在函数内调用函数?

时间:2017-10-02 14:06:36

标签: arrays function pascal procedure records

我正在用pascal创建一个迷你程序来阅读音乐专辑。我面临的问题是在readAlbum()函数中调用readTracks()函数。任何帮助都会很棒,谢谢:)

执行代码时的当前错误是: 错误:不兼容的类型:得到“albumRecord”预期“albumRecord.Dynamic Array of 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;

2 个答案:

答案 0 :(得分:2)

我认为你已经设法通过宣布你的albumRecord.Tracks的方式来迷惑自己。你应该做的是声明一个trackArray类型并声明你的readTracks返回这个数组类型的实例。

你的主要问题是你的readAlbum返回了一个albumRecord,但是你设置了它的track字段,这些字段是从readTracks中分配的,它返回了错误的类型,即albumRecord,而不是一系列的音轨。

换句话说,当你声明readAlbum返回一个albumRecord时,编译器将生成代码,在进入函数时,在堆栈上设置一个albumRecord实例,最终返回为该返回值。功能完成时。您在函数中的代码只是填写此记录的字段,而不是像result.tracks := readTracks()那样创建它的另一个实例,因为您已经声明了readTracks。

下面的代码更改了readTracks中的声明和代码,以便它可以执行您想要的操作。

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,我认为如果你习惯使用命名约定来记录记录和数组类型,并将它们与它们的实例区分开来,我认为你会发现你的代码更清晰了。 。一种惯例是在类型名称前加上'T',所以你的TtrackRecord,TalbumRecord,TtrackArray。

另外顺便说一下,在你的q中你说

  

执行代码时的当前错误是:错误:不兼容的类型

实际上,这并不完全正确。编译器在编译代码时发生错误,而不是在代码执行时发生。这是一个重要的区别:您的错误称为编译时错误,而在程序执行时发生的错误(只有在成功编译后才能执行)称为运行时错误。

答案 1 :(得分:0)

track是一个数组,因此需要建立索引。你在读哪个号码?

在for循环中,你知道如何索引数组,为什么不能在readalbum中进行索引?