/* 본 포스팅은 최호성 저자의 '독하게 시작하는 C프로그래밍' 교재를 참조로 작성되었음을 먼저 알려드립니다. */ 함수의 이름 또한 배열의 이름처럼 '주소 상수'에 부여한 식별자다. 따라서 함수의 이름도 포인터 변수에 저장할 수 있다. 다만 변수의 자료형이 함수 호출에 필요한 정보들을 포함하고 있어야 변수를 이용해서 함수를 호출할 수 있다. // 호출에 필요한 정보는 매개 변수, 호출 규칙, 반환 자료형 등이 있다. 그래서 'void *'에 함수의 이름을 저장할 수는 있으나 호출을 할 수는 없다. 아래의 코드는 함수 포인터를 구체적으로 다루기에 앞서 함수의 이름이 주소임을 확인하기 위한 코드다. #include int main(void) { // void *는 어떤 주소든 담을 수 있는 자료형이다. /..
/* 본 포스팅은 최호성 저자의 '독하게 시작하는 C프로그래밍' 교재를 참조로 작성되었음을 먼저 알려드립니다. */ 함수 호출 규칙(calling convention)은 호출자 함수가 피호출자 함수를 호출하는 과정에서 매개변수를 전달하는 순서 및 매개변수가 사용한 메모리 관리방법 등에 관한 규칙이다. 대표적으로 __cdecl, __stdcall, __fastcall 등 세 가지 정도가 있는데 이 세 가지가 C 언어의 표준에서 정의하는 것은 아니다. 모두 약간씩 차이가 있는데 C/C++ 컴파일러의 기본 함수 호출 규칙은 __cdecl이다. 우리가 자동변수를 선언할 때 auto를 생략해도 되는 것처럼 __cdecl도 생략할 수 있다. 따라서 아무것도 기술하지 않으면 함수 호출 규칙은 __cdecl이다. 제대..
/* 본 포스팅은 최호성 저자의 '독하게 시작하는 C프로그래밍' 교재를 참조로 작성되었음을 먼저 알려드립니다. */ 함수의 이름도 배열의 이름처럼 주소상수에 부여한 식별자다. 그러므로 포인터 변수(함수 포인터)에 담을 수 있는 정보다. 만일 함수의 매개변수 구성을 알고 있고 이름 대신 주소를 알고 있다면 함수를 호출하는 데 전혀 문제가 없다. 같은 원리로 다른 함수에 내가 만든 함수의 주소를 알려줘서 호출하도록 코드를 만들 수도 있다. 함수라는 것은 결국 기계어로 번역이 되어 메모리 어딘가에 저장이 될텐데, 쓰기는 안되고 읽기와 실행만 되게끔 구성되어 있다. 인위적으로 쓰기가 가능하게끔 만들 수도 있지만 기본적으로는 쓰기 변조를 차단하고 있다. # 성능 향상을 위한 이론 함수를 호출하려면 비용(CPU +..
/* 본 포스팅은 최호성 저자의 '독하게 시작하는 C프로그래밍' 교재를 참조로 작성되었음을 먼저 알려드립니다. */ 형한정어 volatile을 적용해 변수를 선언하면 변수와 관련된 모든 연산에 대해 컴파일러가 '최적화' 규칙을 적용하지 않는다. 설령 그것이 컴파일러가 판단하기에 전혀 불필요한 연산이라고 해도. 컴파일러의 최적화에 도움을 주는 const와는 정반대의 역할을 수행하는 것으로 봐도 된다. '최적화'를 하지 않는 수준은 CPU 기계 수준까지 적용된다. CPU는 빠른 연산을 위해 캐시(cache)메모리를 사용하는데, volatile로 선언된 변수는 캐시로 처리되지 못한다. 효율은 떨어지겠지만 주기억장치(메모리)에 정말로 정보가 읽고 쓰이는 행위는 보장이되는 셈이다. 비효율적이지만 꼭 해야할 연산이..
/* 본 포스팅은 최호성 저자의 '독하게 시작하는 C프로그래밍' 교재를 참조로 작성되었음을 먼저 알려드립니다. */ 변수의 본질은 메모리이고, 상수의 본질은 메모리에 저장되는 정보 그 자체를 의미한다. 변수와 상수는 기본적으로 수(자료)이므로 모두 자료형 개념이 적용된다. # 형 한정어 const 형한정어 const는 변수를 '상수화'하는 역할을 한다. 변수를 변하지 않는 숫자로 만드는 것이다. 변수의 본질이 메모리임을 생각할 때 쉽게 생각하면 어떤 메모리를 '읽기 전용'메모리로 만들어주는 기능을 제공하는 것이다. 형한정어 const는 중요한 정보가 들어 있는 메모리를 보호하기 위한 것으로도 생각할 수 있다. 그러나 const 예약어는 변수를 선언할 때 사용한다. 즉, 처음에는 쓰기 가능한 변수였다가 몇..
# 피보나치 수열 문제 Fibonacci 수열은 다음과 같이 정의된다.$f_0 = 0, f_1 = 1 그리고 f_i = f_{i - 1} + f_{i - 2}(i > 1 일 때)$ $f_i$를 계산하는 C함수로 순환 함수와 반복 함수를 모두 작성하라. # 구현 // 반복버전에서 반복계수가 2부터 시작해서 n까지 간다는 것만 주의하면 된다. 반복계수가 2인 까닭은 2개의 초기값을 설정해줬기 때문에 0과 1을 지나쳐 2부터 시작되는 것이다. /************************************************* **Fibonacci iterative & recursive ver *************************************************/ #include in..
# 팩토리얼 문제 문제) 팩토리얼 (=계승) 함수 n!은 $n\le1$일 때 n * (n - 1)! 의 값을 가진다. n!을 계산하는 C프로그램을 순환과 반복버전으로 구현하라. # 구현 // 순환함수는 다들 쉽게 작성하시리라 믿고, 반복버전 코드를 배워가시면 좋을 것 같습니다. /************************************************* ** Factorial recursive ver & iterative ver *************************************************/ #include int recur_fac(int n); int iter_fac(int n); void main() { int n; int output1, output2; wh..
/* 잘못된 알고리즘의 예를 접한 후, 개선된 알고리즘을 접해보자. */ 2017/06/10 - [C 언어] - : 순환을 이용한 프로그램 * 기존의 게시물 (바로 윗 줄 링크)의 순환 알고리즘 문제점 파악 및 개선 #1 최대값 최소값 구하기의 문제점 기존의 게시물의 핵심 알고리즘은 이렇다. findMax() 함수와 findMin() 함수가 재귀적으로 정의되어 있다. 매개변수로 배열과 배열의 크기(n)을 받는다. 둘 중 더 큰 값을 반환하는 macro MAX와 MIN을 활용하여 순환적으로 비교를 하며 가장 큰 값을 찾아간다. 이 코드의 문제점을 파악할 수 있겠는가? 순환적인 개념을 아주 충실히 반영 했지만 이 코드는 아주 비효율적이다. /*************************************..
* 프로그램 제작 배경 및 참고자료 (제가 만든 게임은 본 포스팅의 하단 부에 위치해 있습니다.) #1 참고자료 (1) http://www.soen.kr/ 첫 번째 줄에 있는 링크는 '소프트웨어 공학 연구소 홈페이지'다. 이 홈페이지에 들어가서 C언어 목록을 들어가 보면, 테트리스에 대한 이론적 배경과 구현 방법을 아주 상세히 소개하고 있다. (물론 소스코드도 다 포함되어 있다.) 홈페이지에 들어가 C/C++ 목록을 클릭하고 2부. C 고급 항목으로 들어가면 저렇게 테트리스에 대해 자세히 기술해 놓은 자료들이 있다. 소스코드와 함께 홈페이지에 기술되어 있는 이론공부를 병행하면 테트리스에 대한 기본적인 이해를 할 수 있다. /* 본 배틀 테트리스는 홈페이지의 소스코드와 자료들을 바탕으로 응용해서 개발했다...
* 프로그램 개요 및 기능 /* 중위식을 후위식으로 변환하여 출력하고 계산 결과 또한 출력한다. */ 1. 사용자가 입력한 중위식을 후위식으로 변환하여 출력한다. 2. 후위식을 바탕으로 계산한 결과를 출력한다. /* 연결된 스택으로 구현된 프로그램으로 동적할당과 메모리 반납이 이루어집니다. */ * 프로그램 실행화면 및 간략 설명 /* 연산을 원하는 중위식을 입력하면, 후위식으로 변형되어 출력된다. */ /* 사용자가 입력한 중위식에서 정보를 추려내 연결된 스택으로 구현하여 저장한다. */ /* 저장함과 동시에 출력을 함으로써 출력 결과를 보인다. */ /* 스택에 저장된 데이터값을 후위식 계산 알고리즘에 적용한다. */ * 마치며 생능출판사의 'C언어로 쉽게 풀어쓴 자료구조' 책의 알고리즘을 적극 참고..
- Total
- Today
- Yesterday