2014-10-04 2 views
0

바라기를 이것은 내 문제입니다 (인쇄 오류 로그를 읽는 데 문제가 있습니다). 일치하는 문자열 (문자열로 변환 된 클라이언트의 PID)을 찾기 위해 목록을 검색하려고하지만 충돌이 발생합니다.Erlang : 일치하는 문자열 목록을 검색하십시오

... 
#7 ClientPID = pid_to_list(From), 
#8 list:member(ClientPID, #server.users), % 'users' being a list in the record 'server' 
... 

'서버'레코드의 '사용자'목록은 도움이 될 경우 사용자 = []에 정의됩니다.

충돌 보고서 :

** Reason for termination == 
** "{undef,[{list,member,[\"<0.568.0>\",2],[]}, {server,loop,2,[{file,\"server.erl\"},{line,8}]}, 
{genserver,loop,2,[{file,\"c:/Erlang/ServCli/genserver.erl\"}{line,13}]}]}" 

답변

2

모듈은하지 listlists이라고합니다. 그것은 일반적인 실수입니다 :)

당신의 주장은 거의 없습니다. 당신은 레코드를 사용하고 있으며, 적절한 사용법은 다음과 같습니다 : VariableThatStoresRecord#record_name.filed_name. 귀하의 경우에는 State#state.users과 같을 수 있습니다 (또는이 이중 상태가 마음에 들지 않으면 매개 변수를 loop에 입력하면 S으로 단축됩니다).

당신이하고있는 일은 실제로 의미 론적 suger입니다. 이것은 레코드/튜플 주어진 필드의 어떤 요소가 저장되는지 (모든 레코드는 사실 튜플에 있기 때문에)입니다. 당신의 경우에 #state.users2을 반환합니다. (첫 번째 요소는 레코드 이름이며, users은 레코드에 처음 정의 된 필드입니다).

오류 메시지에 관해서. 우선, undef 오류가 발생합니다. 즉, 정의되지 않은 함수를 호출하는 것을 의미합니다 (Erlang은 동적 언어이므로 매우 일반적입니다). 당신은 정의되지 않은 함수를 호출하기 때문에, 최신의 첫 번째는 가장 흥미로운이

[ { function call definition } 
    { function call definition } 
    { function call definition } ] 

같은 오래된에, 호출 추적을 대표하는 튜플의 목록을 얻을보다. 모듈 list과 기능 member이 호출됨을 알 수 있습니다. 그 외에는 실제 인수 또는 단지 진실성 (이 변수는 이미 erlang에서 가비지 수집 될 수 있음)과 함수 정의 (파일 및 행 번호와 같은)에 대한 일부 정보를 기대할 수 있습니다.

그리고 {list,member,[\"<0.568.0>\",2],[]}에서 "<0.568.0>"2 인수를 사용하여 list:member 함수를 호출하려고하는 것을 볼 수 있습니다. 전화를 lists:member(ClientPID, Server#server.users)으로 변경하면 제대로 작동합니다.

대부분의 오류 메시지는 일반적으로 중첩 된 튜플/목록이므로 한 줄로 표시하면 읽을 수 없습니다. 그래서 내가하는 일은 편집자에게 복사하고, 한 줄짜리 줄을 여러 줄로 나누고, 자동 들여 쓰기 (이맥스는 정말 멋지기도합니다. 그리고 편집자는 Erlang에 대한이 들음새를 따를 수 있습니다)입니다.

+0

그것은 놀라운 일입니다! 도움과 설명을 해주셔서 감사합니다. –

관련 문제