[FdF] FdF 과제 요구 사항 및 함수 정리

bolee·2022년 7월 1일
0

42seoul

목록 보기
12/27

Mandatory Part

이 프로젝트는 세그먼트(segment)를 통해 다양한 지점(x, y, z)을 연결하여 풍경의 단순화된 "골격"(wireframe) -프랑스어로 'fils de fer', 즉 프로젝트 이름 FdF - 그래픽을 만드는 것이다.

세그먼트(segment)
프로그램에 정의된 특정 영역으로, 코드, 데이터 등이 이에 해당된다.
세그먼트는 메모리의 거의 어느 곳에나 위치할 수 있고, 프로그램 실행을 위해 필요한 공간과 데이터를 처리하는 명령어들을 위한 프로그램이나 메모리의 부분이다.
주요 세그먼트
- 실행될 프로그램의 기계어 명령어를 포함하는 코드(code) 세그먼트
- 프로그램에서 정의된 데이터, 상수, 작업 영역 등을 포함하는 데이터(data) 세그먼트
- 프로그램이 임시로 사용하는 지역 함수 변수 등의 데이터가 저장되는 스택(stack) 세그먼트
- 크기가 고정되어 있지 않고 프로그래머가 직접 접근 가능한 힙(heap) 세그먼트
장점
- 세그먼트 단위로 메모리를 통제할 수 있다.
단점
- 메모리 영역이 동적으로 분할되기 때문에 할당될 프로그램 크기보다 세그먼트 영역이 작아 할당이 불가능한 외부 단편화(external fragmentation) 문제가 발생할 수 있다.

이 풍경의 좌표는 프로그램에서 매개 편수로 전달된 파일에 저장된다.
아래는 풍경의 좌표 예이다.

각 숫자는 공간의 한 점, 즉 좌표에 해당한다.

  • 수평 위치는 x 축에 해당한다.
  • 수직 위치는 y 축에 해당한다.
  • 값은 z 축에 해당한다.

fdf 프로그램을 실행하면 다음과 같이 실행되어야 한다.

$> ./fdf 42.fdf

libft를 사용하는 것을 기억해라.
get_next_line, ft_split, ft_getnbr을 사용하면 파일에서 데이터를 빠르고 간단하게 읽을 수 있다.

이 과제의 목표는 지도를 분석하는 것이 아니다.
즉, 파일에 포함된 지도가 올바른 형식으로 존재한다는 것을 의미한다.

그래픽 표현에 관해:

  • fdf는 등각 투영법을 사용해 지도를 표시해야 한다.
  • esc를 눌러 프로그램을 종료할 수 있어야 한다.
  • minilibX의 이미지를 사용해 프로젝트를 검증할 필요는 없지만, 사용하는 것을 강력히 권장한다.
  • 사용될 지도는 map.zip에 첨부되어 있다.

등각 투영법(isometrci projection)

육면체를 투영한 때, 3축의 선분이 각각 120도로 이루어져 윤곽이 정육각형이 되는 투영을 등각투영이라 한다.
이 경우, 좌표축상의 길이는 실제 길이보다 짧게 되지만, 이것을 실제 길이로 묘사한 것을 등각도라 한다.

Bonus Part

  • 추가 투영을 포함한다.(예: 평행 또는 원뿔 등)
  • 지도 확대, 축소(zoom in and zoom out)
  • 지도 회전

주의 사항 및 허용 함수들

  • 이 과제는 사람에 의해서만 평가된다. 따라서 여기에 나열된 제약 조건 내에서 원하는 대로 자유롭게 파일을 구성하고 이름을 지정해라.
  • 실행 파일의 이름은 fdf이어야 한다.
  • Makefile을 제출해야 한다.
  • 전역 변수를 사용할 수 없다.
  • 시스템에서 사용가능한 버전 또는 해당 소스(source)에서 miniLibX를 사용해야 한다.
  • 평가 중에 사용이 정당한 경우 보너스 부분을 완성하기 위해 다른 기능을 사용할 수 있다.
  • 포럼이나 slack 등에 질문할 수 있다.
  • 다음 함수 및 기능들을 사용할 수 있다.

open, read, write, close

#include <fcntl.h>

int		open(const char *path, int oflag, ...);

open()
파일을 사용하기 위해 여는(open) 함수

  • path: 대상 파일 이름(경로 포함)
  • oflag: 파일에 대한 열기 옵션

반환값

  • 성공: 파일 열기에 성공하면 파일 디스크립터의 양의 정수 값 반환
  • 실패: -1 반환 및 적당한 errno 값 설정

파일을 open할 때 용도에 따라 oflag에 옵션을 지정하여 연다.
아래의 옵션은 모두 fcntl.h에 정의되어 있다.

열기 옵션설명
O_RDONLY읽기 전용으로 열기
O_WRONLY쓰기 전용으로 열기
O_RDWR읽기와 쓰기 모두 가능

추가적인 옵션도 존재한다.

기타 옵션설명
O_CREAT해당 파일이 없으면 생성한다.
(주의) O_CREATE 가 아니라 끝에 E가 없는 O_CREAT 다.
O_CREAT로 파일을 생성하게 된다면 파일의 접근권한을 지정하기 위해 접근 권한 값을 추가해야 한다.
ex: open( "badayak.txt", O_WRONLY \| OCREAT, 0644);
O_EXCLO_CREAT를 사용했을 때, 파일이 이미 있어도 열기가 가능하여 쓰기를 하면 이전 내용이 사라진다.
O_CREAT를 사용할 때, O_EXCL를 함께 사용하면, 이미 파일이 있을 때에는 open() 되지 않아 이전 파일을 보존할 수 있다.
ex: fd = open( "./test.txt", O_WRONLY \| O_CREAT \| O_EXCL, 0644)
즉, 이렇게 O_EXCL을 함께 사용하면, 파일이 없을 경우에는 O_CREAT 영향을 받아 쓰기 전용의 파일이 생성하고, 파일이 이미 존재하면 open()이 실패된다.
O_TRUNC기존의 파일 내용을 모두 삭제한다.
O_APPEND파일을 추가하여 쓰기가 되도록 open 후에 쓰기 포인터가 파일의 끝에 위치하게 된다.
O_NOCITTY열기 대상이 터미널일 경우, 이 터미널이 플로그램의 제어 터미널로 할당하지 않는다.
O_NONBLOCK읽을 내용이 없을 때에는 읽을 내용이 있을 때까지 기다리지 않고 바로 복귀한다.
O_SYNC쓰기를 할 때, 실제 쓰기가 완료될 때 까지 기다린다.
즉, 물리적으로 쓰기가 완료되어야 복귀하게 된다.

이 외에도 더 다양한 옵션들이 존재한다.

#include <unistd.h>

ssize_t	read(int fildes, const void *buf, size_t, nbyte);
ssize_t write(int fildes, const void *buf, size_t nbyte);
int		close(int fildes);

read()
파일에 데이터를 읽는 함수

  • fildes: 데이터 전송 영역을 나타내는 파일 디스크립터
  • buf: 읽어드릴 데이터를 받아들일 버퍼의 포인터
  • nbyte: 읽을 데이터의 바이트 수

반환값

  • 성공: 읽어들인 바이트 수
  • 실패: -1 반환 및 적당한 errno 값 설정

write()
파일에 데이터를 출력하는 함수

  • fildes: 데이터 전송 영역을 나타내는 파일 디스크립터
  • buf: 전송할 데이터를 가지고 있는 버퍼의 포인터
  • nbyte: 전송할 데이터의 바이트 수

반환값

  • 성공: 전달한 바이트 수
  • 실패: -1 반환 및 적당한 errno 값 설정

close()
열린 파일을 닫는 함수
close()를 호출하면 fd 를 해제하며, 파일에서 프로세스를 분리한다.
프로세스가 종료되면 커널이 프로세스의 열린 파일들을 모두 자동으로 닫기 때문에 명시적으로 close() 함수를 호출하지 않는 프로그램들도 많다.

  • fildes: 데이터 전송 영역을 나타내는 파일 디스크립터

반환값

  • 성공: 0
  • 실패: -1 반환 및 적당한 errno 값 설정

malloc, free

#include <stdlib.h>

void * malloc(size_t size);
void free(void *ptr);

malloc()

  • 원하는 만큼 동적으로 메모리를 할당하여 주소값을 반환하는 함수
  • 동적으로 메모리를 할당할때 Heap(힙)영역에 할당 한다.

반환값

  • 성공: 할당한 메모리의 첫번째 주소
  • 실패: NULL

free()

  • 동적으로 할당된 메모리를 해제한다.

반환값

  • 없음

perror, strerror

#include <stdio.h>

void	perror(const char *s);

오류 메세지를 출력하는 함수

  • s: 사용자 정의 메세지

반환값

  • 없음

전역 변수 errno 의 값을 해석하여 이에 해당하는 시스템 오류 메세지를 표준 오류 출력 스트림(stderr)에 출력한다. 또한 추가적으로 전달하고자 하는 사용자 정의 메세지를 s 인자에 담아 출력할 수도 있다.

만약 s 가 NULL 포인터가 아니라면 사용자 정의 메세지가 시스템 오류 메세지 이전에 출력된다. 이 때 두 개의 메세지는 ": " 로 구분된다. 그리고 s 에 상관 없이 맨 마지막에는 개행 문자('\n')가 출력된다.

perror 은 오류가 발생한 바로 다음에 호출되어야 한다. 그렇지 않을 경우 다른 함수들의 호출에 의해 출력 결과가 달라질 수 있다.

errno
정수형 변수로 이전의 라이브러리 함수에 의해 발생한 오류에 대한 정보를 가지고 있다. 이 때, errno 에 값에 따라 perror 함수에 의해 출력되는 시스템 오류 메세지는 플랫폼이나 컴파일러에 따라 달라질 수 있다.

#include <string.h>

char	*strerror(int errnum);

오류 메세지 문자열을 가리키는 포인터를 얻어오는 함수

  • errnum: 오류 번호

반환값

  • 오류 번호에 해당하는 오류 문자열을 가리키는 포인터

errnum 의 값을 통해 발생하였던 오류에 알맞은 오류 메세지를 가리키는 포인터를 리턴한다.
이 때 리턴되는 포인터는 문자열 리터럴을 가리키고 있기 때문에 그 내용이 바뀔 수 없다.

strerror 에 의해 출력되는 오류 메세지는 현재 사용중인 컴파일러나 플랫폼에 따라 다를 수 있다.

exit

#include <stdlib.h>

void exit(int status);
  • 프로세스를 종료시키는 함수
  • 종료하기 전에 모든 열려진 파일들을 자동으로 닫는다.
  • 출력 버퍼 속에 데이터가 있으면 그것을 쓰기 완료시킨다.
  • 주로 에러가 났을 때 강제 종료시키기 위해 if문 속에서 사용된다.
  • 입력 인자로 전달하는 status는 운영체제에 전달하며 main함수의 return값과 같은 역할이다.
  • status 값은 에러 코드와 같으므로 정상 종료시 0을, 에러로 인한 종료시 0이 아닌 숫자, 대체로 1을 반환한다.

수학 라이브러리 내 정의된 모든 함수들

메뉴얼 참조

$> man 3 math

miniLibX 라이브러리 내 정의된 모든 함수들

miniLibX 라이브러리 문서 참조

참고 자료
https://www.scienceall.com/%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8segment/
https://terms.naver.com/entry.naver?docId=411777&cid=42327&categoryId=42327

0개의 댓글