카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2019/01/03

함수 포인터

1. 재귀 호출

A(){
A();
}
재귀호출 == 반복문 + Stack 
  caller == callee

A()함수 ()호츨자의 피연산자 A는 함수 이름이다. 함수 이름은 메모리 주소이다. 함수 이름의 주소 체계는 프로시저 형식의 주소가 부여된다.

동일한 함수가 동일한 이름의 함수를 호출 하면은 스텍 크기가 증가한다. 

스텍또한 자료 구조이므로, 그 구조에 따른 형틀을 가지고 있으며, 그 용어를 stack frame라 한다. 

stack frame은 논리 구조의 자료 구조이다. 
스택의 논리 구조를 구현 할 필요는 없다. 누군가 이미 그 구조를 만들어 놓아기 때문이다. 
스택 프레임 자료에다가 반복문을 추가해 사용하게 된다면, 그게 바로 재귀 호출이 된다. 

스택 자료 구조의 특징 
스택이 증가하면 메모리 주소는 감소한다. 
순간 메모리 사용량 증가. 
연산량이 많아 느림 
파일시스템(폴더)나 트리구 형태의 자료에서 사용된다

재귀함수 분석 
디버그 모드 컴파일 
브레이크 포인트 설정
한줄단위 추적 ---> 메모리 맵에 흐름 확인

STDOUT 값 전달.

function factorial {
    (( $1 )) &&
    echo $(( $1 * $( factorial $(( $1 - 1 )) ) )) ||
    echo 1
}
factorial 5

function factorial {
    (( $1 )) || return 1
    factorial $(( $1 - 1 ))
    return $(( $1 * $? ))
}

factorial 5
echo $?

vi test.sh
#!/bin/bash
factorial()
{
    if [[ $1 -le 1 ]]
    then
        echo 1
    else
        last=$(factorial $[$1-1])
        echo $(($1 * last))
    fi
}
factorial 5

cp(recursive)은 디렉토리의 내용을 복사하고, 하위 디렉토리가 있는 경우(재귀 적으로)복사한다.

2. 함수 포인터 
callback 함수 사용.

함수의 이름은 곳 주소이다.

케릭터 포인터를 인수로 받아 int 형으로 반환하는 함수 포인터
int testfun(char*); 
int *(pTest(char*); // 캐릭터 포인터를 인수 값으로 받는다.

pTest = testfun();

동작구조 
sort 정렬
텍스트로된 파일의 행단위 정렬을 할때 사용하는 명령어이다. 
복잡한 워드문서등의 편집이 아닌 간단한 텍스트문서를 대상으로 정렬 작업을 할때 주로 사용되는 명령어이다.
이 명령어는 주로 특정 DB나 프로그램, 또는 쉘프로그램등의 입력값으로 사용되는 데이터를 직접 정렬하려고 할때 사용된다.

sort [-옵션] [-o 저장될 파일명] 정렬할 파일명 [병합할 파일명]

기본 정렬 : 맨 앞 글자 알파벳 오름 차순 정렬
ls -al | sort

-r 옵션
-r은 내림차순 정렬이다.
ls -al | sort -r

-k숫자 옵션
-k는 줄의 맨 앞 문자가 아닌 공백을 기준으로 n번째 문자를 기준으로 정렬하는 것이다.
ls -al | sort -k9

-g 옵션
-g은 알파벳 순이 아닌 숫자 크기 순으로 정렬하는 것이다. -k와 결합하여 적용해서 크기순으로 정렬
ls -al | sort -k5 -g

-u 옵션
비교하는 값이 동일할 경우 제거하는 옵션
ls -al | sort -k5 -g -u

크기 역순으로 정렬하기
이제 위에서 다룬 모든 옵션을 사용하여 크기 역순으로 중복을 제거하면서 파일을 정렬
ls -al | sort -k5 -g -u -r

Sort는 명령어 결과 혹은 문서 내용을 정렬
cat data.txt
5
3
2
7

sort data.txt
2
3
5
7

cat data2.txt
a 4 
c 5
f 1
z 2

두번 째 열 기준 정렬
sort + 1 data2.txt

f 1
z 2
a 4
c 5

sort/uniq 를 같이 사용해 정렬한 후 충복된 내용의 행이 연속적으로 있으면 하나만 나기고 삭제. 

댓글 없음:

댓글 쓰기