2017-10-02 11 views
0

私は、ミュージック・アルバムを読むためにミニ・プログラムをパスカルで作成しています。私が直面している問題は、私のreadAlbum()関数内でreadTracks()関数を呼び出すことです。 エラー:互換性のないタイプ: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

私はあなたが持っていると思います自分自身を混乱させてしまったあなたはあなたのalbumRecord.Tracksを宣言しました。あなたがしなければならないのは、trackArray型を宣言し、この配列型のインスタンスを返すようにあなたのreadTracksを宣言することです。

あなたの主な問題は、あなたのreadAlbumがalbumRecordを返すことでしたが、トラックの配列ではなく、間違った型、つまりalbumRecordを返すreadTracksから割り当てられるようにトラックフィールドを設定していたことです。

別の言い方をすれば、あなたがalbumRecordを返すようにreadAlbumを宣言したので、コンパイラは、関数に入ると、スタックの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. 

はところで、私はあなたがしばらくそれに戻ってくるときに、あなたのコードがより明確に見つけるだろうと思いますそれらのインスタンスから。 1つのコンベンションでは、タイプ名の前に 'T'が付いているので、あなたはTtrackRecord、TalbumRecord、TtrackArrayになります。

はまた、ところで、あなたのqにあなたが

The current error when executing the code is: Error: Incompatible types

を言う実は、それはかなり正確ではありません。このエラーは、コンパイラがコードをコンパイルしているときに発生し、コードが実行されているときには発生しません。これは重要な違いです。エラーはコンパイル時エラーとして知られていますが、プログラムの実行中に発生するエラー(実行時にのみ正常にコンパイルされる)は実行時エラーと呼ばれます。

0

トラックの「albumRecord」予想しまった「albumRecord.Dynamic配列があるすべてのヘルプはあなたに感謝:)

を現在のエラーがコードを実行する場合はある、素晴らしいことです配列は、したがって、あなたはどのようにインデックス配列を知っていますかforループで

?あなたはどの番号を読んでいる。インデックスを必要とするので、あなたはreadalbumでそれを行うことができない理由?

関連する問題