所以我的代码只从我的文本文件中读取一组专辑,并拒绝阅读文件中的其余部分。出于某种原因,为什么我要阅读相册,它只显示该文件包含" 1"专辑而不是" 2"。即使在我的循环中,我也将SetLength数组等于 albumNumber ,所以数组大小应设置为当我开始我的循环。
文本文件
2 (how many albums)
Adele (name)
Pop (genre)
2 (tracks)
Hello (Track 1)
ff (location)
Remedy (track 2)
dd (location)
Jcole
Rap
2
Toto
ff
Africa
dd
帕斯卡
type
TrackRec = record
name: String;
location: String;
end;
GenreType = (Pop, Rap, Rock, Classic);
AlbumRec = Record
name: String;
genre: GenreType;
tracks: array of TrackRec;
end;
type AlbumArray = array of AlbumRec;
procedure ReadAlbum(var albums: AlbumArray; var myFile: TextFile);
var
albumNumber, tracknumber, count, i: Integer;
begin
AssignFile(myFile, 'mytestfile.dat');
Reset(myFile);
ReadLn(myFile, albumNumber);
WriteLn('This file contained ', albumNumber, ' album/s');
SetLength(albums, albumNumber);
for i := 0 to High(albums) do
begin
ReadLn(myFile, albums[i].name);
ReadLn(myFile, albums[i].genre);
ReadLn(myFile, tracknumber);
SetLength(albums[i].tracks, tracknumber);
for count := Low(albums[count].tracks) to tracknumber - 1 do
begin
ReadLn(myFile, albums[i].tracks[count].name);
ReadLn(myFile, albums[i].tracks[count].location);
end;
end;
end;
procedure Main();
var
i, count, select, change: Integer;
albums: AlbumArray;
myFile: TextFile;
message: String;
begin
WriteLn('Please select an option: ');
WriteLn('-------------------------');
WriteLn('1. Read Filename');
WriteLn('2. Display Albums');
WriteLn('3. Select an Album');
WriteLn('4. Update an Album');
WriteLn('5. Exit');
WriteLn('-------------------------');
repeat
i := ReadInteger('Select option for menu:');
case i of
1: ReadAlbum(albums, myFile);
2: PrintAll(albums, myFile);
3: PlayAlbum(albums, myFile);
4: Update(albums, myFile);
end;
until i = 5;
end;
答案 0 :(得分:1)
您的代码包含许多例程(例如PlayAlbum) 没有包括来源。
无论如何,您可能会感到宽慰,实际上您的ReadAlbum
程序确实如此
工作正常,但也许你已经陷入混乱,认为它没有。
在下面,我已经解释了你如何调试它
验证它是否有效。现在,请使用以下代码替换您的ReadAlbum
和Main
,
其中还包括一些显示结果的程序。
完成后,请编译并运行该应用程序。
代码:
procedure ReadAlbum(var albums: AlbumArray; var myFile: TextFile);
var
albumNumber, tracknumber, count, i: Integer;
begin
AssignFile(myFile, 'D:\Delphi\Code\Lazarus\mytestfile.dat');
Reset(myFile);
ReadLn(myFile, albumNumber);
WriteLn('This file contained ', albumNumber, ' album/s');
WriteLn; // To space out the display
SetLength(albums, albumNumber);
for i := 0 to High(albums) do
begin
ReadLn(myFile, albums[i].name);
ReadLn(myFile, albums[i].genre);
ReadLn(myFile, tracknumber);
SetLength(albums[i].tracks, tracknumber);
for count := Low(albums[count].tracks) to tracknumber - 1 do
begin
ReadLn(myFile, albums[i].tracks[count].name);
ReadLn(myFile, albums[i].tracks[count].location);
end;
end;
end;
procedure PrintAlbum(Albums : AlbumArray; AlbumNumber : Integer);
var
Tracks : Integer;
Album : AlbumRec;
begin
// Note : This is incomplete, you should complete it yourself!
// I've used the local variable Album to avoid having to keep typing
// Albums[AlbumNumber] and because it makes inspection during debugging easier
Album := Albums[AlbumNumber];
WriteLn('Album number: ', AlbumNumber);
Writeln('AlbumName: ', Album.Name);
Writeln('AlbumGenre: ', Album.Genre);
Writeln; // to Space out the display;
end;
procedure PrintAlbums(Albums : AlbumArray);
var
AlbumNumber : Integer;
Album : AlbumRec;
begin
for AlbumNumber := 0 to High(Albums) do begin
Album := Albums[AlbumNumber];
PrintAlbum(Albums, AlbumNumber);
end;
end;
procedure Main();
var
albums: AlbumArray;
myFile: TextFile;
begin
ReadAlbum(Albums, MyFile);
PrintAlbums(Albums);
WriteLn('Done');
ReadLn;
end;
begin
Main;
end.
以下说明如何在免费软件Lazarus中开始调试 FPC的IDE。
1在IDE中打开项目后,在该行上设置调试器断点 对于i:= 0到高(专辑) 通过按 F5 或点击" gutter"中的蓝色圆圈 在编辑器窗口的左侧。无论哪种方式,该线应该变为红色。
2编译并运行应用程序。应出现黑色控制台窗口 然后调试器将停止在步骤1中设置的BP。
3按 Ctrl-F5 。这将弹出一个Watch Properties对话框。
监视是一种让调试器显示变量值的方法
当程序执行时。输入
相册
在Expression
框中。
如有必要,请拖动“监视列表”窗口,使其不与代码重叠 编辑器窗口或控制台窗口。
4现在,反复按 F8 并仔细观察Watch List窗口。 F8使调试器一次执行一行代码,称为"单步执行"对于 明显的原因。请注意,监视列表窗口已经知道"有2个专辑记录和那些字段。
当您单步浏览for i:=
和for count :=
时,请注意字段的方式
这两个记录的逐步填写。
顺便说一下,Count
对于实际代表的变量来说不是一个好名字
怨恨TrackNumber
5最终,for i:=
循环将结束,此时您知道相册数组已正确设置,包括第二张专辑记录。
6一旦您对调试器更加熟悉,就可以删除在步骤1中设置的BP。而是在最后一行ReadAlbums
上放置BP。编译并运行应用程序后,它将停止在BP上,以便您可以验证Albums
的内容,而无需单步执行两个for
循环的每一行。
7现在,完成PrintAlbum
的编码。如有必要,您可以按照步骤1-6
8搜索在线Lazarus调试教程并阅读它们直到它变得无聊。
希望在您完成所有这些操作之前,您可以更好地了解读者需要提供哪些信息(包括代码)才能提供帮助。关键 获得良好的帮助是让读者能够重现问题,而你的q并没有这样做。读者不应该猜测丢失的代码应该做什么。即使很明显,问题实际上可能会变成你所没有的代码中的某个地方,在这种情况下,读者无论如何都无法提供帮助。