컨디션이 좀 회복되었음..
09:45 착석
한 번에 하나의 원소를 선택해서, 직전에 정렬이 완료된 배열 중에 적절한 위치에 삽입한다.
새로운 원소가 생기면 이미 정렬이 완료된 배열을 하나씩 밀면서
새로운 원소가 들어갈 자리를 만들어가다가, 자리가 생기면 들어가는 방식
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) {
let currentVal = arr[i];
let j;
for (j = i - 1; j >= 0 && arr[j] > currentVal; j--) {
arr[j+1] = arr[j];
}
arr[j+1] = currentVal;
}
return arr;
}
let arr = [2, 1, 4, 7, 34, 3];
insertionSort(arr);
console.log(arr);
합병과 정렬
분할 정복 알고리즘에 따라 배열을 잘게 쪼갠 후 정렬 후 합친다.
팀원이 fd로 파일 가져오는 함수 만들어서 기존 코드 완성했는데
일부 테스트 미통과
int read (int fd, void *buffer, unsigned length) {
check_address(buffer);
unsigned int bytesRead = 0;
if (fd == 0) {
for (unsigned int i = 0; i < length; i++) {
char c = input_getc();
((char *)buffer)[i] = c;
bytesRead++;
if (c == '\n') break;
}
} else {
struct file *f = get_file_from_fd_table(fd);
if (f == NULL) {
return -1;
}
bytesRead = file_read(f, buffer, length);
}
return bytesRead;
}
파일을 아예 못 읽는 거 같은데..
stdout은 구현한 적이 없는데 테스트에 있네..
else if (fd == 1) {
return -1;
그냥 이렇게 썼는데 테스트 통과함. 오..?
구현 자체가 안 된 듯..
FAIL
run: size of sample.txt (0) differs from expected (373): FAILED
파일과 버퍼과 길이를 넘기면 읽어와야 될 것 같은데..
bytesRead = file_read(f, buffer, length);
off_t
file_read (struct file *file, void *buffer, off_t size) {
off_t bytes_read = inode_read_at (file->inode, buffer, size, file->pos);
file->pos += bytes_read;
return bytes_read;
}
간단한 거였다!! 하지만 후련하다!!
int add_file_to_fd_table (struct file *file) {
struct thread *t = thread_current();
struct file **fdt = t->fd_table;
int fd = t->fd_idx;
while (t->fd_table[fd] != NULL) {
fd++;
}
t->fd_idx = fd;
fdt[fd] = file;
return fd;
}
fd 테이블 배열을 순회하면서 비어있으면 거기다가 파일 구조체 포인터 넣고 인덱스 반환하는 거였음!
"열린 파일 fd에 buffer에서 size 바이트를 씁니다. 실제로 쓰여진 바이트 수, 즉 쓰여지지 않은 일부 바이트를 제외한 수를 반환합니다. 파일의 끝을 넘어서 쓰기는 일반적으로 파일을 확장하지만, 기본 파일 시스템에 의해 파일 확장은 구현되지 않았습니다. 예상되는 동작은 파일의 끝까지 가능한 많은 바이트를 쓰고 실제로 쓰여진 바이트 수를 반환하거나, 아무 바이트도 쓰여지지 않았다면 0을 반환하는 것입니다. fd 1은 콘솔에 씁니다. 콘솔에 쓰기 위한 코드는 buffer의 모든 내용을 한 번의 putbuf() 호출로 써야 합니다. 이는 size가 몇백 바이트를 넘지 않는 한 합리적입니다(더 큰 버퍼는 나누어 쓰는 것이 타당합니다). 그렇지 않으면, 다른 프로세스에 의해 출력된 텍스트 라인이 콘솔에서 서로 섞여서 인간 독자와 평가 스크립트 모두에게 혼란을 줄 수 있습니다."
우선 file_write가 있음.
off_t
file_write (struct file *file, const void *buffer, off_t size) {
off_t bytes_written = inode_write_at (file->inode, buffer, size, file->pos);
file->pos += bytes_written;
return bytes_written;
}
1차로 대충 구현해 봄
syscall.c
int write (int fd, const void *buffer, unsigned length) {
check_address(buffer);
int bytesRead = 0;
if (fd == 1) {
putbuf(buffer, length);
return length;
} else {
struct file *f = get_file_from_fd_table(fd);
if (f == NULL) {
return -1;
}
bytesRead = file_write(f, buffer, length);
}
return 0; // 나중에 발겸함. 여기 왜 0으로 반환하지? bytesRead 반환해야 함.
}
stdin은 아까처럼하면 되지 않을까?
표준 입력은 에러처리 하면 될듯
if (fd == 0) {
return -1;
}
맞음.
read와 write 모두 핵심 코드가 틀린 것 같다..
return 0; // 나중에 발겸함. 여기 왜 0으로 반환하지? bytesRead 반환해야 함.
어? 이거 고치니까 write 통과함!