'똘이'에 해당되는 글 71건

  1. 2013.01.05 media 모듈을 이용한 이미지 띄우기 by 똘이 임덕규
  2. 2013.01.04 FAT 파일 시스템 by 똘이 임덕규
  3. 2013.01.03 RFID를 이용한 간단한 학생관리 프로그램 기획 by 똘이 임덕규
  4. 2012.12.31 파티션 by 똘이 임덕규
  5. 2012.12.28 파일 입출력 by 똘이 임덕규
  6. 2012.12.28 레지스터 주소, 스펙보고 직접 등록하기 by 똘이 임덕규
  7. 2012.12.24 예외 처리, 예외에 안전한 코드 만들기 by 똘이 임덕규
  8. 2012.12.24 예외 처리, 함수 깊숙히 by 똘이 임덕규
  9. 2012.12.21 예외 처리 by 똘이 임덕규
  10. 2012.12.20 오버라이딩 by 똘이 임덕규


위와 같이 python에서 media 모듈을 이용하여 그림을 띄울려면, 우선 아래와 같이 모듈을 먼저 설치를 해 줘야 한다.

첫번째로 PyGraphics를 가져온다. 이때 svn 이 없을 경우 받아 올 수 없으니 유무에 따라 svn패키지를 설치한다.

sudo apt-get install subversion

PyGraphics를 저장소에서 가져온다.

svn checkout http://pygraphics.googlecode.com/svn/trunk/ pygraphics-read-only

현재 위치한 디렉토리에 pyrgraphic-read-only 라는 이름으로 가져오게 되며 다 받았으면 디렉토리에 진입하여 설치를 해준다.

python setup.py install --user

설치가 끝났으면 이제는 ampy를 받으로 간다. 아래 주소에서 ampy-1.2.3.tar.gz 또는 그 이상의 버전을 받도록 한다.

http://code.google.com/p/pygraphics/downloads/list


압축을 풀어주고 디렉토리에 들어가 설치를 해준다. 설치법은 위와 같다.

python setup.py install --user

아래의 패키지는 apt-get 을 이용하여 계속 설치

sudo apt-get install python-imaging python-numpy python-pygame 

여기까지 설치했으면 기본적인 사용기 가능하다. 하지만 아래의 에러 메시지를 만나면 tk 모듈 설치가 필요하다.


tk모듈 설치는 아래와 같다.

sudo apt-get install python-imaging-tk

실행을 위한 간단한 코드 입력

# coding: utf-8

""" 
media module을 이용한 사진 띄우는 소스.
tk 를 이용한다.

"""

import media                    # media 모듈을 불러온다.

def main():
    pic_file = media.choose_file()  # 파일선택창 띄우고 선택된 파일은 pic_file 객체에 넣는다.
    pic = media.load_picture(pic_file) # 사진을 불러 들여서 pic 객체에 최종적으로 넣고,
    media.show(pic)                    # 사진을 출력한다.

if __name__ == "__main__":
    main()

실행화면

이 부분이 media.choose_file() 함수가 하고,

Load하여 meda.show()함수가 이렇게 사진을 띄운다.

원본 출처(http://packages.python.org/PyGraphics/install.html)

Get PyGraphics:


svn checkout http://pygraphics.googlecode.com/svn/trunk/ pygraphics-read-only

In the main pygraphics folder, run the setup file to install PyGraphics to your local installation directory:

python setup.py install --user

Download ampy-1.2.3.tar.gz from the Downloads page , and follow the same procedure to install it as for PyGraphics.

Download and install Python’s imaging package, NumPy, and PyGame. They are available via apt-get:

apt-get install  python-imaging-tk python-numpy python-pygame

If you intend to run PyGraphic’s test suite, install Nose:

apt-get install python-nose

Now you and PyGraphics should be ready to make beautiful music (and pictures!) together.


저작자 표시
신고

'컴퓨터 언어 > Python' 카테고리의 다른 글

Tkinter 를 이용, 간단한 이미지 뷰어 제작  (0) 2013.01.06
Button Module  (0) 2013.01.06
창 띄우기  (0) 2013.01.05
media 모듈을 이용한 이미지 띄우기  (0) 2013.01.05
파이썬 학습과제 - 1  (0) 2012.10.03
파이썬 실행 해보기  (0) 2012.09.28
TAG image, media, Python, TK
FAT 파일 시스템의 탄생
  • FAT파일 시스템은 1976년 MicroSoftware의 제품인 Basic에서 플로피 디스크 관리를 위해 빌게이츠에 의해서 최초 구현됨

FAT 파일 시스템 종류

  • FAT12
    • 1984년에 발표된 DOS 3.0에서 이용하였으며 5.25inch 1.2mb 양면 플로피 디스크를 사용할 수 있도록 했다.
  • FAT16
    • HDD기술의 발달로 요구된 대용량의 파일을 수용할 수 있는 파일 시스템.
    • 클러스터 크기를 32kb로 할 경우 최대 2GB까지 표현
  • VFAT
    • Windows95에서 채택
    • 32bit 보호모드에 적합하게 코드를 재작성
    • 독점모드 추가로 여러 프로그램이 동시에 파일에 접근할 경우를 대비
    • 최대 255자까지의 긴 파일이름 가능
    • 여전히 2GB까지의 용량 한계 문제점
  • FAT32
    • VFAT기반으로 수정
    • 총 28bit를 이용해서 클러스트를 표현
    • 클러스트 크기를 16kb로 한다면 이론상 최대 4TB까지 표현이 가능하지만 여러 이유로 32GB의 최대 용량을 가진다.
    • FAT의 마지막 버전.
구분 FAT12 FAT16 FAT32
사용 용도 플로피 디스크용 저용량 하드디스크 고용량 하드디스크
클러스터 표현 비트 수 12bit 16bit 32bit(28bit만 사용)
최대 클러스터 개수 4,084 65,524 약 2^28
최대 볼륨 크기 16MB 2GB 2TB
파일의 최대 크기 볼륨 크기만큼 볼륨 크기만큼 4GB

요약

  • FAT 파일시스템 중에서는 FAT32가 가장 무난한 선택
  • FAT32는 MS-DOS, Windows95와는 호환되지 않는다.
  • 용량이 32MB 이하의 CF카드나 USB Memory Stick에서는 FAT16외엔 방법이 없다.


저작자 표시
신고

'Embedded > File System' 카테고리의 다른 글

NTFS MFT까지의 접근  (0) 2013.01.16
파일 시스템 요소들  (0) 2013.01.08
FAT File System의 구조  (0) 2013.01.08
FAT 파일 시스템  (0) 2013.01.04
파티션  (0) 2012.12.31


RFID Reader기를 이용하여 할 수 있는 것을 구상중에 학생관리 프로그램으로 결정, 아래 도표대로 만들기로 함.

  • RFID Reader가 가장 아랫단에서 카드의 정보를 읽고 쓴다.
  • Python 에서 Serial 통신으로 정보를 주고 받는다.
  • PyQt는 QT GUI를 구현하여 사용자 인터페이스를 구성하고, 정보를 출력 및 입력 받는다.
  • Python에서의 정보 입력 또는 읽기 요구에 따라 MySQL에 정보를 쿼리한다.
  • 쿼리 받은 정보의 최종 출력은 GUI를 통해 관리자 화면용으로 최종 출력하며 읽기만 가능한 정보는 웹으로 출력할 수 있도록 한다.


저작자 표시
신고

파티션

Embedded/File System 2012.12.31 14:54

파티션이란

파티션은 연속된 저장 공간을 하나 이상의 연속되고 독립된 영역으로 나누어서 사용할 수 있도록 정의한 규약이다.


파티션의 가장 큰 의미는 저장장치의 구역 나눔이다.

파티션의 사용 용도

  • 하나의 물리적인 디스크를 여러 논리 영역으로 나누어 관리를 용이하게 하기 위해
  • OS 영역과 DATA 영역으로 나누어 OS 영역만 따로 포맷 및 관리하기 위해
  • 여러 OS를 설치하기 위해
  • 하드디스크의 물리적인 배드 섹터로 특정 영역을 잘라서 사용하기 위해




저작자 표시
신고

'Embedded > File System' 카테고리의 다른 글

NTFS MFT까지의 접근  (0) 2013.01.16
파일 시스템 요소들  (0) 2013.01.08
FAT File System의 구조  (0) 2013.01.08
FAT 파일 시스템  (0) 2013.01.04
파티션  (0) 2012.12.31

기본 입출력 코드

#include <iostream>
#include <fstream>              // 파일 스트림 헤더

using namespace std;

int main()
{
    ofstream emb;    // 파일 객체생성
	
    emb.open("text.txt", ios_base::out | ios_base::app);
    if(false == emb.is_open())  // 파일 성공적으로 열었는지 검사
    {
        cout << "Failed to open the file." << endl;
    }
	
    emb << "hi" << endl;

    return 0;
}

생성자나 open() 멤버 함수를 사용할 수 있는데 파일 이름만 제공하며 출력, 혹은 입력용으로 파일을 생성한다. 여기에 좀 더 구체적인 옵션을 넣을 수 있다.

의미
app 파일의 끝에 자료를 추가하기 위한 용도로 연다.
ate 파일을 열고 파일의 끝으로 이동한다.
binary 텍스트가 아닌 바이너리로 입출력을 한다.
in 파일에서 값을 읽기 위한 용도로 연다.
out 파일에 값을 쓰기 위한 용도로 연다.
trunc 기존 파일이 있다면 지워버리고 새 파일을 연다.
  • ofstream의 멤버함수 is_open() 은 파일을 제대로 열었는지의 여부를 bool 타입으로 반환값을 돌려준다.
  • 파일을 다 사용한 후에는 close() 함수를 사용해서 닫아줘도 되지만 닫아주지 않아도 객체가 소멸시 소멸자에서 닫아주기 때문에 닫지 않아도 무방하다.
저작자 표시
신고

'컴퓨터 언어 > C++' 카테고리의 다른 글

파일 입출력  (0) 2012.12.28
예외 처리, 예외에 안전한 코드 만들기  (0) 2012.12.24
예외 처리, 함수 깊숙히  (0) 2012.12.24
예외 처리  (0) 2012.12.21
오버라이딩  (0) 2012.12.20
가상함수를 이용한 다형성 구현  (0) 2012.12.20
기본 제공해주는 avr.h를 사용해도 되지만 필요한 레지스터만 define하여 사용할 수 있다.

최종모습은 아래와 같다.
#define DDRF *((volatile unsigned char *)0x61)
위 코드는 보다시피 스펙에 나와있는 DDRF의 주소를 Register Summary에서 직접 찾아서 적을 수 있다.


이해하기 쉽게 순서대로 적어보겠다.
  1. 사용할 레지스터의 주소를 Spec 에서 찾아 적는다. 이때 주소는 ATmel사의 스펙북이라면 뒷쪽에서 찾을 수 있다.
  2. 예제로 사용할 레지스터인 DDRF의 주소를 찾는다.
  3. 헤더 파일에 아래와 같이 기본적인 명시(define)를 한다.

    #define DDRF 0x61
    
  4. 주소의 타입은 unsigned char * 이기 때문에 캐스팅을 해주고 다시 한번 괄호로 싸준다..
    #define DDRF ((unsigned char*)0x61)
    
  5. 주소가 가리키는 곳을 사용해야 하기 때문에 괄호 앞에 포인터를 찍어준다.
    #define DDRF *((unsigned char*)0x61)
    
  6. 컴파일러에 의해 의도적이지 않게 변경되는 것을 막기 위해 volatile을 붙여 준다.
    #define DDRF *((volatile unsigned char*)0x61)
    
  7. 완성
저작자 표시
신고

'Embedded > Atmega128' 카테고리의 다른 글

레지스터 주소, 스펙보고 직접 등록하기  (0) 2012.12.28

리소스를 정리하기 전에 예외가 발생한 경우

동적할당등을 받은 메모리가 아직 해제가 안된 상태에서 예외처리에 의한 함수 종료는 심각한 메모리 누수 현상을 가져올 수 있다.

#include 

using namespace std;

void A();
void B();
void C();

int main()
{
    try
    {
        A();
    }
    catch(int ex)
    {
        cout << "예외 처리" << endl;
    }
}

void A()
{
    // 메모리를 할당
    char* p = new char [100];   // 메모리를 100바이트 할당

    // 여기까지 실행
    cout << "예외가 발생하기 전" << endl;
    B();

    // 이곳은 실행하지 않음을 출력
    cout << "예외가 발생한 후" << endl;
    delete[] p;
    p = NULL;
}

void B()
{
    throw "Exception!!";
}
  • 위 소스는 A() 함수의 앞에서 할당된 메모리가 해제되지 않는 문제가 발생.
  • 함수 끝에서 무언가 정리 작업을 해주는 경우가 있다면 모두 이 문제점에 노출

소멸자로 리소스 문제 해결하기

  • 함수 소멸시 함수안의 모든 변수 및 객체가 소멸
  • 객체는  소멸시 소멸자를 호출하는 방법을 이용
  • 이점을 이용, 리소스를 해제하는 용도의 클래스를 제작
  • 이것을 스마트 포인터라 부른다.
#include 

using namespace std;

class SmartPointer
{
public:
    SmartPointer(char* p)
        :ptr(p)
        {
            
        }
    ~SmartPointer()
        {
            // 소멸자가 호출되는 것을 확인한다.
            cout << "메모리가 해제된다." << endl;

            delete[] ptr;
        }
public:
    char* const ptr;
};

void A();
void B();

int main()
{
    try
    {
        A();
    }
    catch(const char* ex)
    {
        cout << "예외 처리" << endl;
    }

    return 0;
}

void A()
{
    // 메모리를 할당
    char* p = new char [100];   // 메모리를 100바이트 할당

    // 메모리를 스마트 포인터로 보관한다
    SmartPointer sp(p);

    // 예외를 던지는 함수 호출
    B();

    // 이곳은 실행하지 않음을 출력
    cout << "예외가 발생한 후" << endl;
    
   
    // delete[] p;
    // p = NULL;
}

void B()
{
    throw "Exception!!";
}
  • 함수가 정상적으로, 또는 예외에 의해서 종료된 경우 모두 스마트 포인터 객체 sp의 소멸자를 호출한다.
  • 소멸자단에서 메모리 해제등을 시켜주기 때문에 따로 신경쓰지 않아도 되게 된다.

주의 해야 할 점은 다음과 같다.

  • 생성자가 올바르게 종료된 경우만 객체를 생성한 것으로 간주한다.
  • 생성자에서 예외가 발생한 경우라면 정상적으로 종료된게 않은 것이고  객체도 생성되지 않은 것이다.
  • 객체가 생성되지 않았으니 소멸자도 호출될 일이 없다.
  • 결국 생성자단에서 일어난 메모리 누수를 해결하기 위한 예외를 다시 던져야 한다.

소멸자에서의 예외는 반드시 막아야 한다.

  • 객체의 소멸자에서 예외가 던져지는 경우 프로그램이 비정상 종료할 수 있다.
  • 소멸자 밖으로는 예외가 던져지지 않게 막아야 한다.
  • 생성자에서 했던 것처럼 소멸자의 모든 코드를 try블록으로 감쌀 필요가 있다.
  • 잡아낸 예외는 절대로 소멸자 밖으로 다시 던져서는 안 된다

저작자 표시
신고

'컴퓨터 언어 > C++' 카테고리의 다른 글

파일 입출력  (0) 2012.12.28
예외 처리, 예외에 안전한 코드 만들기  (0) 2012.12.24
예외 처리, 함수 깊숙히  (0) 2012.12.24
예외 처리  (0) 2012.12.21
오버라이딩  (0) 2012.12.20
가상함수를 이용한 다형성 구현  (0) 2012.12.20

구조적 예외 처리와 관련된 규칙

예외는 함수를 여러 개 건너서도 전달이 가능하다.

#include <iostream>

using namespace std;

void A();
void B();
void C();

int main()
{
    try
    {
        A();
    }
    catch(int ex)
    {
        cout << "예외 = " << ex << endl;
    }
}

void A()
{
    B();
}

void B()
{
    C();
}

void C()
{
    throw 337;
}
  • 보는 것과 같이 함수에 아무리 깊게 들어가게 되더라도 던져진 예외는 즉시 Catch가 받아서 처리
  • 예외는 자신의 타입에 맞는 catch블록을 찾을 때까지 함수를 거슬러 올라간다.
  • main()함수까지 갔는데도 알맞은 catch블록을 못 찾았다면 프로그램이 비정상 종료
저작자 표시
신고

'컴퓨터 언어 > C++' 카테고리의 다른 글

파일 입출력  (0) 2012.12.28
예외 처리, 예외에 안전한 코드 만들기  (0) 2012.12.24
예외 처리, 함수 깊숙히  (0) 2012.12.24
예외 처리  (0) 2012.12.21
오버라이딩  (0) 2012.12.20
가상함수를 이용한 다형성 구현  (0) 2012.12.20

왜 예외처리가 필요한가?

대표적인 예외처리는 아래와 같다.
  • 컴퓨터에 사용 가능한 메모리가 부족한 경우
  • 하드디스크에 파일을 쓰는데 하드디스크의 남을 용량이 부족한 경우
  • 사용자가 범위 밖의 값을 입력하거나 존재하지 않는 파일의 이름을 입력한 경우

여기서 중요한것은 버가느 오류같이 개발자의 실수로 일어나는 문제점들과 예외를 구별할 줄 알아야 한다.

DynamicArray.h 보기

DynamicArray.cpp 보기

main.c

반환 값을 사용한 예외처리

DynamicArray 클래스의 SetAt(), GetAt() 함수에는 문제점이 있다. SetAt()함수에는 원소의 인덱스를 넘겨주게 되어 있는데 배열의 크기를 넘겨서 인덱스를 넘겨주는 경우에는 할당 되지 않는 메모리를 건드려서 프로그램이 비정상 종료할 수 있다.
DynamicArray.cpp
bool void DynamicArray::SetAt(int index, int value)
{
    if(index < 0 || index >= GetSize())
    {
        return false;
    }

    arr[index] = value;

    return true;
}
example.cpp
#include "DynamicArray.h"
#include <iostream>
using namespace std;

int main()
{
    // 크기가 10인 배열 객체를 만든다.
    DynamicArray arr(10);

    // 올바른 인덱스를 참조한다
    bool b;
    b = arr.SetAt(5, 0);
    if(false == b)
    {
        cout << "arr[5]  사용실패!!" << endl;
    }

    // 각 원소에 10, 20, 30.. 순으로
    for(int i = 0; i < 10; ++i)
    {
        arr.SetAt(i, (i + 1) * 10);
    }

    // 배열의 크기를 출력하고, 각 원소의 값을 역순으로 출력
    cout << "Size of arr = " << arr.GetSize() << endl;

    for(i = 9; i >= 0; --i)
    {
        cout << "arr[" << i << "] = " << arr.GetAt(i) << endl;
    }

    return 0;
}
여기서 SetAt() 함수에 잘못된 인덱스를 넘긴 사실은 '예외 상황'이 되고, SetAt() 함수에서 이를 감지한 후에 예외 상황을 외부에 알리는 과정이 '예외 처리'라고 볼 수 있다.

반환 값을 사용한 예외처리의 문제점
  • 함수를 호출할 때마다 매번 반환 값을 비교하는 번거러움
  • 이미 함수가 다른 용도의 반환 값을 사용하는 경우
  • 본연의 소스 코드와 예외 처리 코드가 섞여 지저분 해지고 가독성이 떨어진다.

구조적 예외 처리

구조적 예외 처리를 위한 세가지 키워드
  • try
    • 예외가 발생하는지 지켜보는 키워드
    • 일종의 if문과 비슷하다.
  • catch
    • 예외를 잡아서 처리하는 키워드
  • throw
    • 예외 발생시, 예외를 지켜라고 지시하는 키워드
#include <iostream>

using namespace std;

int main()
{
    try
    {
        cout << "Try 1" << endl;
        
        // throw 99;               // 이곳에서 점프하게 된다.
        throw 99.1f;               // 이곳에서 점프하게 된다.
        
        cout << "Try 2" << endl;
    }

    catch(int n)    // throw가 int 형을 던졌을 경우
    {
        cout << "Catch 1 :: " << n << endl;
    }

    catch(float n)    // throw가 float형을 던졌을 경우
    {
        cout << "Catch 2 :: " << n << endl;
    }

    cout << "End Program" << endl;
    
    return 0;
}

throw가 int 값을 던질 경우


throw가 float 값을 던질 경우


try와 catch는 항상 짝을 이뤄서 사용하게 된다.
  • catch 블럭은 오직 한 가지 타입의 값만 받는다
  • try 블럭 안에서 발생하는 예외만 이어지는 catch 블럭에 잡힌다.
  • throw에 의해서 던져지면 그 함수는 즉시 종료 된다.
  • throw에 의해서 던져진 예외는 함수를 뛰어 넘어서까지 전달된다.

예외 객체의 사용

기본 값 대신에 객체를 던지는 것도 가능. 어떤 장점이 있는가?
  • 다양한 정보 전달 가능
  • 다향성을 이용한 일관된 관리가 가능

더보기

  • 예외로 던질 객체에 대한 클래스를 정의한다.
  • 예외에 관한 정보를 담을 멤버 변수들을 정의 한다.
  • 예외 객체의 생성을 편리하게 하기 위한 생성자를 만든다.

더보기

DynamicArray.cpp

더보기

저작자 표시
신고

'컴퓨터 언어 > C++' 카테고리의 다른 글

예외 처리, 예외에 안전한 코드 만들기  (0) 2012.12.24
예외 처리, 함수 깊숙히  (0) 2012.12.24
예외 처리  (0) 2012.12.21
오버라이딩  (0) 2012.12.20
가상함수를 이용한 다형성 구현  (0) 2012.12.20
다중상속(Multiplex inheritance)  (0) 2012.12.20

순수 가상 함수

순수 가상 함수는 함수의 정의 부분을 필요로 하지 않는다.

virtual void Draw() const = 0;
위와 같은 함수 원형만 가지고 있는 함수가 바로 순수 가상 함수.
  • 함수정의가 없음
  • 하나 이상의 순수 가상 함수를 가짐
  • 자식 클래스에서 오버라이딩 한다
  • 다형성을 이용하여 함수 호출
  • 추상 클래스의 객체를 만드는것은 불가능
#include <iostream>

using namespace std;

// 일반적인 '도형'을 상징하는 클래스
class Shape
{
public:
    void Move(double x, double y);
    virtual void Draw() const = 0; // 순수 가상함수 생성

    Shape();
    Shape(double x, double y);

protected:
    double _x;
    double _y;
};

Shape::Shape()
{
    _x = _y = 0.0;
}

Shape::Shape(double x, double y)
{
    _x = x;
    _y = y;
}

void Shape::Move(double x, double y)
{
    _x = x;
    _y = y;
}

// void Shape::Draw() const
// {
//     cout << "[Shape] Position = (" << _x << ", " << _y << ")" << endl;
// }

Shape::Draw() 는 함수 선언부에서 '순수 가상 함수' 로 선언되었기 때문에 정의부에서 위와 같이 주석처리하였다. 이제부터는 객체타입에 따라 자동으로 Rectangle::Draw() 또는 Circle::Draw() 가 호출된다.
저작자 표시
신고

'컴퓨터 언어 > C++' 카테고리의 다른 글

예외 처리, 함수 깊숙히  (0) 2012.12.24
예외 처리  (0) 2012.12.21
오버라이딩  (0) 2012.12.20
가상함수를 이용한 다형성 구현  (0) 2012.12.20
다중상속(Multiplex inheritance)  (0) 2012.12.20
접근제어 키워드  (0) 2012.12.20


티스토리 툴바