我正在用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;
答案 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中进行索引?