OS

[OS] C언어 코드 분석_5

효진인데요 2023. 12. 22. 16:53

 

 

작년, 그러니까 3학년 2학기에 운영체제 강의를 들으며 주어졌던 C code 분석 과제를 다시 한번 정리해보려고 한다.

 

C 언어로 작성된 코드를 주고 이를 분석하는 과제였는데, C 언어를 한 번도 사용해 본 적 없을 때라 (사실 현재까지도) 어려웠지만 흥미로웠던 기억이 있었다.

 

C 언어를 배우기 전이기도 하고, 구조에 대해 이해하고 코드를 분석해 보는 데에 의의를 둔 것이기에,

분석하고 정리한 내용이 정확하지 않을 수도 있는 점,,🙏🏻

 

https://jinnycoding.tistory.com/79

 

 

 

 

드디어 마지막~~!



 

 

최종적으로 연산을 수행하는 부분이다.

마찬가지로 사용된 함수에 대해 확인을 하고 코드를 분석해보려고 한다.

 

 

 

1.1 PushPostfix 함수

PushPostfix 함수

 

 

PushPostfix 함수는 정수형 변수 val과 PostfixStack 스택의 포인터 변수 poststck을 인자로 받는다.

Postfixnode 연결 리스트의 주소를 newnode라는 포인터 변수에 저장하고, newnode가 Postfixnode의 크기만큼의 메모리 공간 할당을 요청한다.

 

if문의 조건문과 같이 NULL 값과 같으면 메모리 할당 실패한 경우이므로 메모리를 할당하지 못했다는 메시지를 출력하고 NULL 값을 반환한다.

메모리 할당에 성공하면 val은 newnode가 가리키는 val 값을 받고, newnode의 다음 노드는 poststck 스택의 최상단을 가리킨다.

 

poststck의 top은 newnode가 가리키는 값이고 할당한 메모리의 첫 번째 주소를 반환한다.

 

 

1.2 PopPostfix 함수

PopPostfix 함수

 

PopPostfix 함수는 PostfixStack을 poststck이라는 포인터 변수에 주소를 저장한다.

Postfixnode 연결 리스트의 주소는 temp 변수에 저장하고 정수형 변수 val을 생성한다.

 

만약 poststck의 top이 NULL값이면 스택은 비어 있는 상태이기 때문에 에러 메시지를 출력한다.

빈 상태가 아니면 int val은 poststck의 top이 가리키는 val 값을 가리키게 되고, temp 연결 리스트도 poststck의 top을 가리키게 된다.

 

poststck의 top은 그 다음 스택으로 넘어가게 되고, 임시로 값을 가리키고 있던 temp에 할당되었던 메모리 공간을 해제한다. 그 후 val 값을 return한다.

 

 

 

 

만약 WillBreak의 값이 0이면 첫 번째 while문을 먼저 반복한다.

 

  1. MathStack 스택을 isStackEmpty 함수에 대입해 0을 가리킬 때까지 PopOp 함수로 인해 삭제되는 연산자들을 postfix 배열의 y번째에 넣는다.
  2. 스택이 비워지면 반복문을 끝내고 postfix의 가장 마지막에 \0을 넣어 마침표를 찍는다.

  3. 이제 다음 while문본격적으로 계산을 하는 과정이다.
    while문에 들어가기 전 CalcStack의 top NULL을 가리키도록 하여 상태가 비어 있도록 한다.

  4. 만약 postfix[i]가 \0이 아니면 계속하여 반복문을 돈다.
    postfix[i]는 isdigit함수를 사용하여 문자열을 입력받은 뒤 숫자로 변환이 가능한지 여부를 확인한다.

  5. 문자열로 받은 postfix[i]의 값을 정수로 변환하기 위해 문자열 ‘0’을 빼고 이를 PushPostfix 함수를 이용해 CalcStack에 삽입한다.

  6. 만약 숫자로 변환이 안되고, i가 연산자이면 val1과 val2의 값을 CalcStack에서 차례로 Pop해온다.

  7. 찾은 연산자에 따라 val1과 val2를 계산하여 resultVal 값에 저장할 수 있도록 코드를 작성한다.

  8. 결과 값 resultVal을 PushPostfix함수를 사용해 CalcStack에 삽입한다.

  9. LastExpReturn값은 한참 위에서 strcmpi 함수를 사용해 end 문자열을 찾던 if문에서 설정한 바가 있다. 
    마지막 결과 값을 출력하는 변수인데 이 값을 CalcStack의 top val을 가리키도록 한다.

  10. WillBreak를 0으로 설정해 종료한다.

 


 

 

main 함수의 가장 하단에 위치한 함수이다.


2.1 FreeAll 함수

FreeAll 함수

 

해당 함수는 스택과 연결 리스트에 할당되어있던 메모리를 free를 통해 해제하는 역할이다.

스택의 top이 NULL이 아니면 연결 리스트의 head가 스택의 top을 가리키고 head부터 하나씩 다음 노드를 가리켜가며 메모리를 해제한다.

 

만약 head가 다음 노드를 가리켰는데 NULL 값이면 함수의 역할은 끝난다.

 

2.2 getch 함수

getch 함수 원형

 

getch 함수는 사용자로부터 하나의 키를 입력받는 함수이다.

 

굉장히 간단한 함수이며 한 가지 재미있는 특징을 가지고 있다.

 

getch 함수는 표준 입력을 받는 함수와 달리 콘솔 입력을 사용하는 방식이기 때문에 버퍼에 저장되지 않는다.

즉, 표준 입력 함수는 사용자가 입력을 하고 enter 키를 눌러야 반응을 하지만, getch 함수는 어떤 키를 누르든지 반응을 하고 바로 종료한다.

 

 

 

작업을 마친 filePtr은 fclose 함수로 닫는다.

그 후 키를 눌러 종료하라는 메시지를 출력한 뒤 getch 함수를 사용하여 사용자가 어떠한 키를 누르면 즉각적으로 종료될 수 있도록 하였다.

 

 


 

 

이렇게 분석 과제가 끝났다,

오랜만에 꺼내보니 흥미롭고, 본격적으로 시작하기 전 처음 과제를 받았을 때, 어떻게 접근해야 할지 몰라서 카페에 가서 끙끙대던 기억이 새록새록 난다.

 

벌써 1년이나 지났다니... 믿을 수가 없어어ㅓㅓㅓㅓ

 

야속하게도 시간은 참 빠르게 흐르는 것 같다.

 

728x90