如何在函数内调用函数?
How do i call a function within a function?
我正在用 Pascal 创建一个小程序来读取音乐专辑。我面临的问题是在我的 readAlbum() 函数中调用 readTracks() 函数。任何帮助都会很棒,谢谢 :)
当前执行代码时的错误是:
错误:类型不兼容:得到 "albumRecord" 预期的“albumRecord.Dynamic 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;
tracks 是一个数组,因此需要索引。你在读几号?
在 for 循环中你知道如何索引数组,那你为什么不能在 readalbum 中做呢?
我认为您已经通过声明 albumRecord.Tracks 的方式混淆了自己。您应该做的是声明一个 trackArray 类型并将您的 readTracks 声明为 return 此数组类型的一个实例。
您的主要问题是您的 readAlbum return 是一个 albumRecord,但是您已经设置了它的曲目字段以从 readTracks 分配,return是错误的类型,即 albumRecord,而不是比一组曲目。
换句话说,当您将 readAlbum 声明为 return albumRecord 时,编译器将生成代码,该代码在进入函数时在堆栈上设置 albumRecord 的实例,最终是 returned 作为函数完成时的 return 值。函数中的代码只是填写此记录的字段,而不是像 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.
顺便说一句,如果您养成使用命名约定来声明记录和数组类型的习惯,以便将它们与实例区分开来,我想您会发现您的代码更加清晰他们中的。一种约定是在类型名称前加上 'T',因此您将是 TtrackRecord、TalbumRecord、TtrackArray。
顺便说一句,在你的问题中你说
The current error when executing the code is: Error: Incompatible types
实际上,这并不完全正确。该错误发生在编译器编译代码时,而不是您的代码执行时。这是一个重要的区别:你的错误被称为编译时错误,而当你的程序正在执行时发生的错误(它只能在成功编译后执行)被称为 运行-time错误。
我正在用 Pascal 创建一个小程序来读取音乐专辑。我面临的问题是在我的 readAlbum() 函数中调用 readTracks() 函数。任何帮助都会很棒,谢谢 :)
当前执行代码时的错误是: 错误:类型不兼容:得到 "albumRecord" 预期的“albumRecord.Dynamic 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;
tracks 是一个数组,因此需要索引。你在读几号?
在 for 循环中你知道如何索引数组,那你为什么不能在 readalbum 中做呢?
我认为您已经通过声明 albumRecord.Tracks 的方式混淆了自己。您应该做的是声明一个 trackArray 类型并将您的 readTracks 声明为 return 此数组类型的一个实例。
您的主要问题是您的 readAlbum return 是一个 albumRecord,但是您已经设置了它的曲目字段以从 readTracks 分配,return是错误的类型,即 albumRecord,而不是比一组曲目。
换句话说,当您将 readAlbum 声明为 return albumRecord 时,编译器将生成代码,该代码在进入函数时在堆栈上设置 albumRecord 的实例,最终是 returned 作为函数完成时的 return 值。函数中的代码只是填写此记录的字段,而不是像 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.
顺便说一句,如果您养成使用命名约定来声明记录和数组类型的习惯,以便将它们与实例区分开来,我想您会发现您的代码更加清晰他们中的。一种约定是在类型名称前加上 'T',因此您将是 TtrackRecord、TalbumRecord、TtrackArray。
顺便说一句,在你的问题中你说
The current error when executing the code is: Error: Incompatible types
实际上,这并不完全正确。该错误发生在编译器编译代码时,而不是您的代码执行时。这是一个重要的区别:你的错误被称为编译时错误,而当你的程序正在执行时发生的错误(它只能在成功编译后执行)被称为 运行-time错误。