2017-10-02 24 views
0

저는 음악 앨범을 읽기 위해 파스칼로 미니 프로그램을 만들고 있습니다. 내가 겪고있는 문제는 내 readAlbum() 함수 내에서 readTracks() 함수를 호출하는 것입니다. 오류 : 호환되지 않는 유형 : 어떤 도움이 좋을 것,함수 내에서 함수를 어떻게 호출합니까?

코드를 실행 현재 오류가 당신을 :) 감사있어 "albumRecord은"

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

난 당신이 생각 그럭저럭 너 자신을 혼란에 빠뜨릴 수 있었다. 앨범 기록을 신고하셨습니다. 해야 할 일은 trackArray 유형을 선언하고이 배열 유형의 인스턴스를 반환하도록 readTracks를 선언하는 것입니다.

귀하의 주요 문제는 귀하의 readAlbum에서 albumRecord를 반환했지만 귀하는 해당 트랙 필드가 readTracks에서 할당되도록 설정했기 때문에 트랙 배열이 아닌 albumRecord 유형을 반환합니다.

다른 식으로 말하면, readRbum이 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 난 당신이 잠시 후에 다시에 올 때 당신이 그들을 구별하는 기록 - 어레이 형태의 선언에 대한 명명 규칙을 사용하는 습관을 가지고 있다면 당신은, 당신의 코드를 훨씬 명확하게 찾을 것이라고 생각 그 (것)들의 경우에서. 한 가지 규칙은 type-name 앞에 'T'를 붙이는 것이므로 TtrackRecord, TalbumRecord, TtrackArray가됩니다.

또한 BTW, 귀하의 질문에 당신은 사실, 즉 아주 정확하지

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

말한다. 이 오류는 컴파일러가 코드를 컴파일하는 동안 발생하며 코드가 실행될 때 발생하지는 않습니다. 이것은 중요한 차이입니다. 여러분의 에러는 컴파일 타임 에러 (compile-time error)라고 알려져 있습니다 만, 프로그램 실행 중 발생하는 에러는 런타임 오류로 알려져 있습니다.

0

트랙이 trackRecord의 "albumRecord.Dynamic 배열 예상 배열, 따라서 당신이 어떻게 인덱스 배열을 알고 for 루프에서

? 당신이 어떤 수를 읽고있다. 인덱싱이 필요, 그래서 당신은 readalbum에서 그것을 할 수없는 이유는 무엇입니까?