2017-04-17 1 views
0

그래서 파일 페이지 관리자 프로그램에 대해 다음 기능을 코딩해야하지만 null 종료 기능을 처리하는 방법을 이해할 수 없습니다.파일 페이지 관리자 프로그램의 기능 이해

RC insertRecord(FileHandle &fileHandle, const vector<Attribute> 
&recordDescriptor, const void *data, RID &rid) 

제공된 레코드 설명자를 사용하여 제공된 핸들에 의해 식별 된 파일에 새 레코드를 삽입하십시오. 은 입력이 항상 정확하고 오류가 없다고 가정 할 수 있습니다. 즉, 을 확인하지 않아도 입력 레코드에 올바른 속성 수가 있는지 또는 속성 유형이 일치하는지 확인할 수 있습니다. 그러나 속성에서 NULL 값을 처리하기 위해 * 데이터의 첫 번째 부분에는 에 대한 각 바이트에 대한 정보를 전달하는 n 바이트가 포함됩니다. n 값은 수식을 사용하여 계산할 수 있습니다. ceil (레코드의 필드 수/8). 예를 들어 5 개의 필드가있는 경우 ceil (5/8) = 1 바이트입니다. 필드가 20 개인 경우 크기는 ceil (20/8) = 3 바이트가됩니다. 첫 번째 바이트 의 맨 왼쪽 비트는 첫 번째 필드에 해당합니다. 첫 번째 바이트의 가장 오른쪽 비트는 여덟 번째 필드에 해당합니다. 필드가 8 개 이상인 경우 두 번째 바이트의 가장 왼쪽 비트는 9 번째 필드 에 해당합니다. 각 필드의 해당 비트가 1로 설정된 경우 실제 데이터에는 이 필드에 대한 값이 포함되어 있지 않습니다. 예를 들어 레코드에 세 개의 필드가 있고 두 번째 필드에 NULL이 들어있는 경우 바이트의 비트 표현은 0100000입니다. 또한 실제 데이터에서 들어오는 레코드는 첫 번째와 세 번째 값만 포함합니다. 즉,이 경우 첫 번째 필드 값 바로 뒤에있는 세 번째 필드 값은 입니다.

우리는 3 개의 속성을 가지면 3/8 = 3 바이트이므로 데이터의 처음 3 바이트는 null 기능에 해당합니다. 그러나 우리는이 바이트를 C++의 비트로 변환하는 방법을 알고 있으므로 실제로 null 값의 위치를 ​​볼 수 있습니다.

답변

1

What the instructions describe is a bitmask. 레코드의 각 필드는 단일 비트로 표시됩니다. 해당 비트가 1이면 데이터에 필드 입력이 없습니다. 이를 통해 data이 가리키는 데이터의 길이를 결정할 수 있습니다.

일반적으로 1 바이트 당 8 비트이므로 필드가 9 개인 경우 9 비트가 필요하며 2 바이트가 필요합니다. 17 필드, 17 비트, 3 바이트 등. 이것은 널 정보의 길이를 계산하기 위해 제공된 공식의 근원입니다.

그래서 3 개의 필드가 있다면 3/8 = 0.375 바이트가 필요합니다. 이것은 가장 가까운 전체 바이트 또는 1 바이트로 반올림 (ceil 함수)해야합니다.