구조체

|
#사용자 정의 자료형 (typedef)
새로운 자료형을 정의하는데 사용한다.
긴 이름의 자료형을 짧게 정의할 수 있다. 

정의 예)
typedef unsigned char BYTE;
typedef unsigned WORD;
typedef int VECTOR[3];
크기가 3인 int형 배열을 VECTOR라는 자료형으로 정의
typedef char* STRNIG;
문자를 가리키는 포인터형을 STRING이라는 자료형으로 정의

선언 예)
BYTE ch;
WORD aword;
VECTOR matrix3;
크기가 3인 int형 배열 matrix3을 선언하였다. 총 12바이트의 메모리 공간을 차지한다.
STRING aString;
char형 포인터 변수 aString을 선언하였다. 포인터 변수이므로 4바이트의 메모리 공간을 차지한다.


#구조체
배열 :
의미상 서로 연관된 자료형이 동일한 자료들을 하나의 이름으로 묶은 것이다.
각각의 요소를 접근하기 위해서는 배열이름[index]를 사용한다.

구조체 :
의미상 서로 연관이 되지만 자료형이 서로 다른 자료들을 하나의 이름으로 묶은 것이다.
각각의 요소를 접근하기 위해서는 구조체 변수이름.멤버이름를 사용한다.

구조체와 배열을 서로 중첩하여 정의할 수 있어 복잡한 구조의 자료를 효울적으로 구성할 수 있다.

1) 구조체의 원형을 정의한 후, 변수를 선언하는 방법 (태그 있음)
struct student {
    char name[20];
    int english;
    int math;
};

struct student st1;
struct student st2;
구조체 변수 st1, st2가 만들어졌다.

2) 구조체의 원형과 변수의 선언을 동시에 하는 방법 (태그 있음)
struct student {
    char name[20];
    int english;
    int math;
} st1;
struct student st2;
구조체 변수 st1, st2가 만들어졌다.

3) 구조체의 원형을 정의한 후, 단 한 번만 변수로 사용하는 방법 (태그 없음)
struct {
    char name[20];
    int english;
    int math;
} st1;
구조체 변수 st1은 만들어졌으나 struct 뒤에 태그가 없어 Noname Type이 되어 st2를 만들 수 없다.
만드려면 아래와 같은 방법이 있다.
struct {
    char name[20];
    int english;
    int math;
} st1, st2;

struct {
    char name[20];
    int english;
    int math;
} st1;
struct {
    char name[20];
    int english;
    int math;
} st2;


4) typedef을 이용하여 구조체의 자료형을 새로운 자료형으로 정의하는 방법 (struct를 생략할 수 있음, 가장 많이 사용)
typedef struct _student {
    char name[20];
    int english;
    int math;
} student;
student st1;


#구조체의 초기화
typedef struct {
    int x;
    int y;
} POINTER;
POINTER p1 = { 0, 0 };
POINTER p2 = { 0, 0 };
초기값이 구조체 멤버의 자료형과 일치해야 한다.

배열은 복사가 불가능하지만 구조체는 복사가 가능하다. 따라서 다음과 같이 할 수 있다.
POINTER p1 = { 0, 0 };
p2 = p1;


#구조체 배열
일반적으로 구조체는 구조체 배열이나 연결리스트의 노드로 많이 사용된다.
typedef struct {
    char name[15];
    char countryp20];
    int age;
} STUDENT;

STUDENT st[5];


#구조체 포인터
구조체 변수의 시작주소를 값으로 저장한다. 
typedef struct {
    char name[15];
    char country[20];
    int age;
} STUDENT;

STUDENT *sp;

구조체 멤버 접근 방법
1) (*sp).name = "Jack";
2) sp->name = "Jack";
2)의 방법을 많이 쓴다.


#구조체와 함수
1) 구조체 변수의 멤버를 함수의 인수로 전달하는 경우
인수의 갯수가 많아진다.

2) 구조체 변수를 함수의 인수로 전달하는 경우
구조체 변수 전체의 값이 전달되므로 구조체의 용량이 큰 경우 좋지 않다.

3) 구조체 변수의 주소를 인수로 전달하는 경우
인수의 갯수도 많지 않으며, 값이 아닌 시작주소만 전달되므로 인수 1개당 4바이트만 차지한다.


#구조체 변수는 복사가 가능하고 배열은 복사가 불가능한 이유
구조체는 변수이므로 메모리 공간을 의미한다. 따라서 '메모리 공간 = 메모리 공간'이 되어 대입이 가능하다.
반면에 배열은 이름 자체가 배열의 시작주소를 의미한다. 따라서 '주소 = 주소'가 되어 대입이 불가능하다.
따라서 for문을 이용하여 복사한다. 단, 문자 배열인 경우는 strcpy()를 사용할 수 있다.


#구조체 사이즈 출력
구조체에 멤버를 선언하면 4바이트보다 작은 멤버는 같이 묶여 4바이트 내에 할당된다.
char, char, short --> 4바이트
short, char, char --> 4바이트
char, short, char --> 8바이트



구조체 자체는 새로 정의한 타입 자체이므로 구조체 타입으로 만든 변수가 아닌 구조체 자체는 메모리에 할당되지도 않으며, 따라서 값 자체를 가지지 못한다.





















'C' 카테고리의 다른 글

포인터 상수  (0) 2010.06.24
문자열  (0) 2010.06.13
버블 정렬 c 0609  (0) 2010.06.09
다중포인터  (0) 2010.06.08
16진수 0xffffffff의 값 (signed and unsigned)  (0) 2010.06.06
And

vim 사용법

|




#설치
우분투 : 
$ sudo apt-get install vim

윈도우 : 
Download path : 



'VIM 강좌' 카테고리의 다른 글

용어 tabstop shiftwidth  (0) 2010.08.23
folding  (0) 2010.08.15
ctags & cscope  (0) 2010.08.15
And

Qt Creator Manual

|
[File] - New File or Project... Ctrl+N

Projects
Qt4 Gui Application

Introduction and project location
Name: test
Create in: Project
Next click!

Select required modules
Next click!

Class Information
Class name: MyTest
Base class: QWidget
Header file: mytest.h
Source file: mytest.cpp
Generate form: non-checked
Form file: Inactive
Next click!

Project management
Finish click!

Projects
├test.pro ---------- 프로젝트 정보를 담고 있는 파일. Qt Creator에서 컴파일하려면 반드시 프로젝트를 생성해야 함.
├Headers ----------- 헤더 파일 폴더
│  └mytest.h -------- mytest 클래스의 헤더 파일
└Sources ----------- 소스 파일 폴더 ├main.cpp -------- main() 함수가 구현된 소스 파일
└mytest.cpp ------ mytest 클래스 소스 파일


─ │├ 

'Qt' 카테고리의 다른 글

qt 메뉴 등록  (0) 2010.09.23
[Qt Designer] 확장 다이얼로그  (0) 2010.09.22
Qt Designer  (0) 2010.09.18
Qt Compile  (0) 2010.06.06
And

c++ 0610

|


#함수 오버로딩
같은 이름의 함수를 여러 개 쓸 수 있다.
C는 함수의 이름으로만 심볼을 생성하기 때문에 동일한 이름의 함수를 사용할 수 없다.
C++는 함수의 이름에 시그니처(매개변수의 타입과 갯수, 리턴 타입은 포함되지 않음)에 대한 정보를 추가하여 심볼을 생성하기 때문에 동일한 이름의 함수를 사용할 수 있다.

오버로딩이 가능한 경우
1. 매개변수 갯수는 같지만 타입이 다른 경우
2. 매개변수 타입은 같지만 갯수가 다른 경우

오버로딩이 불가능한 경우
1. 두 함수의 매개변수가 각각 일반 자료형, 레퍼런스형인 경우 이 둘의 실인자의 구별이 불가능하다.
2. 두 함수의 리턴 타입만 다른 경우 이 둘의 실인자의 구별이 불가능하다.

함수 찾는 순서
1. Exact Match
2. Promotion
3. Standard Conversions
4. User-defined Conversions

#디폴트 인자
디폴트 인자는 항상 오른쪽부터 설정한다. 그래야만 함수의 인자들을 왼쪽부터 넣어도 문제가 없다.

오버로딩과 디폴트 인자의 충돌
void Ambiguous(int a, int b = 100);
void Ambiguous(int a);
void Ambiguous(10);

#동적 메모리 할당
컴파일 타임에는 크기를 알 수 없으며, 런 타임에 할당할 메모리의 크기가 결정되어 할당하는 방식
할당과 해제의 시점이 자유롭다.
함수 내에서 할당한 경우, 함수가 종료되더라도 Heap 영역에 남아있다.

Data 영역 - 전역 변수, Static 변수가 할당된다. 프로그램 시작시 할당, 프로그램 종료시 해제.
BBS 영역 - Data 영역에 포함된 영역. 초기화하지 않은 전역 변수가 할당된다.
Heap 영역 - 동적 할당에 사용되는 메모리
Stack 영역 - 지역변수가 할당된다. 함수 시작시 할당, 함수 종료시 해제.

main() 함수가 아닌 다른 함수에서 동적메모리를 할당하고 해제하지 않은 경우에는 반드시 그 포인터 변수를 main() 함수로 넘겨주어야 메모리 해제가 가능하다??















'C++' 카테고리의 다른 글

C++ 생성자  (0) 2010.08.13
생성자와 소멸자  (0) 2010.08.13
c++ 오버라이딩  (0) 2010.07.03
동적 할당 0614  (0) 2010.06.14
c++0608  (0) 2010.06.08
And

버블 정렬 c 0609

|
ㄹㄹ
ㄹㄹ
버블 정렬
#include <stdio.h>

void bubble_sort(int array[], int count);
void swap(int *px, int *py);
void printVector(int V[], int n);

int main()
{
	int vector[5] = {5, 4, 3, 2, 1};
	bubble_sort(vector, 5);

	return 0;
}

void bubble_sort(int array[], int count)
{
	int i;
	int j;

	for (i = 0; i < count - 1; ++i)
	{
		for (j = 0; j < count - 1 - i; ++j)
		{
			if (array[j] > array[j+1])
			{
				swap(&array[j], &array[j+1]);
				printVector(array, 5);
			}
		}
		printf("\n");
	}
}

void swap(int *px, int *py)
{
	int temp = *px;
	*px = *py;
	*py = temp;
}

void printVector(int V[], int n)
{
	int i;
	for (i = 0; i < n; ++i)
	{
		printf("%5d", V[i]);
	}
	printf("\n");
}


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    4    5    3    2    1
    4    3    5    2    1
    4    3    2    5    1
    4    3    2    1    5

    3    4    2    1    5
    3    2    4    1    5
    3    2    1    4    5

    2    3    1    4    5
    2    1    3    4    5

    1    2    3    4    5









#include <stdio.h>

int main()
{
    int i, j;
    int array[3][4] = {
    	{15, 23, 45, 56},
    	{34, 53, 76, 23},
    	{98, 29, 48, 43}};

    int *p = *array;

    for (i = 0; i < 12; ++i)
    {
    	printf("%d ", *(p+i));
    }
    printf("\n");

    return 0;
}





배열과 포인터 값과 주소 관계
#include <stdio.h>

int main()
{
	int i, j;
	int array[3][4] = {
		{15, 23, 45, 56},
		{34, 53, 76, 23},
		{98, 29, 48, 43}};

	int *p = *array;

	for (i = 0; i < 12; ++i)
	{
		printf("%d ", *(p+i));
	}
	printf("\n");

	printf("%p\n", &array[4]);
	printf("%p\n", array+4);
	printf("\n");

	printf("%p\n", array);
	printf("%p\n", array[0]);
	printf("%p\n", &array[0][0]);
	printf("\n");

	printf("%p\n", &array[0][0]);
	printf("%p\n", &array[1][0]);
	printf("%p\n", &array[2][0]);
	printf("\n");

	printf("%p\n", array[0]);
	printf("%p\n", array[1]);
	printf("%p\n", array[2]);
	printf("\n");

	printf("%p\n", array+0);
	printf("%p\n", array+1);
	printf("%p\n", array+2);
	printf("\n");

	printf("%p\n", &array+0);
	printf("%p\n", &array+1);
	printf("%p\n", &array+2);
	return 0;
}


Output:
15 23 45 56 34 53 76 23 98 29 48 43 
0xbf560034
0xbf560034

0xbf55fff4
0xbf55fff4
0xbf55fff4

0xbf55fff4
0xbf560004
0xbf560014

0xbf55fff4
0xbf560004
0xbf560014

0xbf55fff4
0xbf560004
0xbf560014

0xbf55fff4
0xbf560024
0xbf560054



'C' 카테고리의 다른 글

문자열  (0) 2010.06.13
구조체  (0) 2010.06.12
다중포인터  (0) 2010.06.08
16진수 0xffffffff의 값 (signed and unsigned)  (0) 2010.06.06
형식 지정자  (0) 2010.06.06
And

다중포인터

|




다중포인터
#include <stdio.h>

int main()
{
    int i = 100;
    int *p = &i;
    int **pp = &p;
    int ***ppp = &pp;

    printf("     i = 100; --> i = %d\n", i);

    *p = 90;
    printf("    *p =  90; --> i =  %d\n", i);

    **pp = 80;
    printf("  **pp =  80; --> i =  %d\n", i);

    ***ppp = 70;
    printf("***ppp =  70; --> i =  %d\n", i);

    return 0;
}

Result--------------------------------------------------------------------------------------------------------------

     i = 100; --> i = 100
    *p =  90; --> i =  90
  **pp =  80; --> i =  80
***ppp =  70; --> i =  70

Result--------------------------------------------------------------------------------------------------------------















'C' 카테고리의 다른 글

구조체  (0) 2010.06.12
버블 정렬 c 0609  (0) 2010.06.09
16진수 0xffffffff의 값 (signed and unsigned)  (0) 2010.06.06
형식 지정자  (0) 2010.06.06
상수의 표기  (0) 2010.06.06
And

c++0608

|


#namespace

하나의 프로그램에 같은 이름의 변수, 함수, 클래스 등이 있으면 안된다.

이러한 것을 막기 위해 namespace를 사용한다.

main() 함수 위에 선언되어 있어야 한다.

정의
namespace NAME
{
변수, 함수, 클래스 정의
...
}

namespace를 정의한 후 그 안에 포함된 것을 사용하기 위해서는
NAME::변수, NAME::함수, NAME::클래스 등과 같이 사용한다.

1) 개별적으로 줄여서 사용하는 방법
using NAME::myfunc;
2) 네임스페이스 자체를 기본으로 설정
using namespace NAME;




#include <iostream>

using namespace std;

namespace A
{
    void showTest()
    {
        cout << "namespace A test" << endl;
    }
}

namespace B
{
    void showTest()
    {
        cout << "namespace B test" << endl;
    }
}

using B::showTest;

int main()
{
    A::showTest();
    showTest();

    return 0;
}

Result--------------------------------------------------------------------------------------------------------------

namespace A test
namespace B test

Result--------------------------------------------------------------------------------------------------------------




레퍼런스

변수의 별명, 변수처럼 사용

포인터는 메모리가 할당되나 레퍼런스는 메모리가 할당되지 않고 해당변수의 별명으로만 추가될 뿐이다.

반드시 초기화해야 하며, 초기화 시에 상수를 대입할 수 없다.

한 번 초기화하면 초기화 시에 대입했던 변수 이외의 변수의 별명으로 바뀌지 않는다.









'C++' 카테고리의 다른 글

C++ 생성자  (0) 2010.08.13
생성자와 소멸자  (0) 2010.08.13
c++ 오버라이딩  (0) 2010.07.03
동적 할당 0614  (0) 2010.06.14
c++ 0610  (0) 2010.06.10
And

Qt Compile

|
Qt Compile (Windows)

>qmake -project
>qmake main.pro
>mingw32-make

예제1) Hello Qt!
#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QPushButton hello("Hello world!");
    hello.resize(100, 30);

    hello.show();
    return app.exec();
}

예제2) Quit
#include <QApplication>
#include <QFont>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QPushButton quit("Quit");
    quit.resize(75, 30);
    quit.setFont(QFont("Times", 18, QFont::Bold));

    QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));

    quit.show();
    return app.exec();
}

예제3) QWidget
#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget window;
    window.resize(200, 120);

    QPushButton quit("Quit", &window);
    quit.setFont(QFont("Times", 18, QFont::Bold));
    quit.setGeometry(10, 40, 180, 40);
    QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));

    window.show();
    return app.exec();
}

예제4) MyWidget
#include <QApplication>
#include <QFont>
#include <QPushButton>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    setFixedSize(200, 120);

    QPushButton *quit = new QPushButton("Quit", this);
    quit->setGeometry(62, 40, 75, 30);
    quit->setFont(QFont("Times", 18, QFont::Bold));

    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

예제5) LCD display
#include <QApplication>
#include <QFont>
#include <QLCDNumber>
#include <QPushButton>
#include <QSlider>
#include <QVBoxLayout>
#include <QWidget>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    QPushButton *quit = new QPushButton("Quit");
    quit->setFont(QFont("Times", 18, QFont::Bold));

    QLCDNumber *lcd = new QLCDNumber(2);

    QSlider *slider = new QSlider(Qt::Horizontal);
    slider->setRange(0, 99);
    slider->setValue(0);

    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
    connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(quit);
    layout->addWidget(lcd);
    layout->addWidget(slider);
    setLayout(layout);
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

예제6) Layout
#include <QApplication>
#include <QFont>
#include <QGridLayout>
#include <QLCDNumber>
#include <QPushButton>
#include <QSlider>
#include <QVBoxLayout>
#include <QWidget>

class LCDRange : public QWidget
{
public:
    LCDRange(QWidget *parent = 0);
};

LCDRange::LCDRange(QWidget *parent)
    : QWidget(parent)
{
    QLCDNumber *lcd = new QLCDNumber(2);
    QSlider *slider = new QSlider(Qt::Horizontal);
    slider->setRange(0, 99);
    slider->setValue(0);
    connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(lcd);
    layout->addWidget(slider);
    setLayout(layout);
}

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    QPushButton *quit = new QPushButton("Quit");
    quit->setFont(QFont("Times", 18, QFont::Bold));
    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));

    QGridLayout *grid = new QGridLayout;
    for (int row = 0; row < 4; ++row) {
    	for (int column = 0; column < 4; ++column) {
    		grid->addWidget(new LCDRange, row, column);
    	}
    }

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(quit);
    layout->addLayout(grid);
    setLayout(layout);
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}











'Qt' 카테고리의 다른 글

qt 메뉴 등록  (0) 2010.09.23
[Qt Designer] 확장 다이얼로그  (0) 2010.09.22
Qt Designer  (0) 2010.09.18
Qt Creator Manual  (0) 2010.06.10
And

16진수 0xffffffff의 값 (signed and unsigned)

|

#include <stdio.h>

int main()
{
    int inum;

    inum = 0xffffffff;

    printf("%8s   %8s %10s\n", "hexa", "type", "decimal");
    printf("%8x : %8s %10d\n", inum, "signed", inum);
    printf("%8x : %8s %10u\n", inum, "unsigned", inum);

    return 0;
}

RESULT-------------------------------------------------------------------------------------------------------------

    hexa       type    decimal
ffffffff :   signed         -1
ffffffff : unsigned 4294967295

RESULT-------------------------------------------------------------------------------------------------------------

'C' 카테고리의 다른 글

버블 정렬 c 0609  (0) 2010.06.09
다중포인터  (0) 2010.06.08
형식 지정자  (0) 2010.06.06
상수의 표기  (0) 2010.06.06
sizeof 연산자를 이용한 Data Type 크기 확인  (0) 2010.06.06
And

형식 지정자

|

 printf()  scanf()  형식
 %c  %c  단일 문자
 %s  %s  문자열
 %d  %d  부호있는 정수
 %i    부호있는 정수
   %i  10진수, 8진수, 16진수
 %f  %f  실수 (십진 표기)
 %e  %e  실수 (지수 표기)
 %g    실수
 %u  %u  부호없는 정수
 %x  %x  부호없는 16진수
 %o  %o  부호없는 8진수
 %p    16진수 메모리 주소

 printf()    형식
 %ld    long int
 %hd    short int
 %lo    long int 8진수
 %lx    long int 16진수
 %u    unsigned int
 %lu    unsigned long int
 %lf    double
 %Lf    long double


'C' 카테고리의 다른 글

다중포인터  (0) 2010.06.08
16진수 0xffffffff의 값 (signed and unsigned)  (0) 2010.06.06
상수의 표기  (0) 2010.06.06
sizeof 연산자를 이용한 Data Type 크기 확인  (0) 2010.06.06
Data type 사이의 대입 및 출력 형식  (0) 2010.06.05
And

상수의 표기

|

#include <stdio.h>

int main()
{
    signed int si_num = 43;
    unsigned int ui_num = 43U;

    signed long int sli_num = 43L;
    unsigned long int uli_num = 43UL;

    float f_num = 43.0F;
    double d_num = 43.0F;
    long double ld_num = 43.0L;

    printf("CONSTANT NOTATION\n\n");

    printf("Integer Type\n");
    printf("%8s %11s %5s (%3s) : %d\n", "signed", "int", "43", "%d", si_num);
    printf("%8s %11s %5s (%3s) : %u\n", "unsigned", "int", "43U", "%u", ui_num);
    printf("%8s %11s %5s (%3s) : %ld\n", "signed", "long int", "43L", "%ld", sli_num);
    printf("%8s %11s %5s (%3s) : %lu\n", "unsigned", "long int", "43UL", "%lu", uli_num);

    printf("\n");

    printf("Real Number Type\n");
    printf("%8s %11s %5s (%3s) : %f\n", "", "float", "43.0F", "%f", f_num);
    printf("%8s %11s %5s (%3s) : %lf\n", "", "double", "43.0F", "%lf", d_num);
    printf("%8s %11s %5s (%3s) : %Lf\n", "", "long double", "43.0L", "%Lf", ld_num);

    return 0;
}

RESULT-------------------------------------------------------------------------------------------------------------

CONSTANT NOTATION

Integer Type
  signed         int    43 ( %d) : 43
unsigned         int   43U ( %u) : 43
  signed    long int   43L (%ld) : 43
unsigned    long int  43UL (%lu) : 43

Real Number Type
               float 43.0F ( %f) : 43.000000
              double 43.0F (%lf) : 43.000000
         long double 43.0L (%Lf) : 43.000000

RESULT-------------------------------------------------------------------------------------------------------------

'C' 카테고리의 다른 글

16진수 0xffffffff의 값 (signed and unsigned)  (0) 2010.06.06
형식 지정자  (0) 2010.06.06
sizeof 연산자를 이용한 Data Type 크기 확인  (0) 2010.06.06
Data type 사이의 대입 및 출력 형식  (0) 2010.06.05
cl.exe 옵션 정리  (0) 2010.06.05
And

sizeof 연산자를 이용한 Data Type 크기 확인

|

#include <stdio.h>

int main()
{
    printf("Integer Type:\n");
    printf("%8s %11s : %2d\n", "signed", "char", sizeof(signed char));
    printf("%8s %11s : %2d\n", "unsigned", "char", sizeof(unsigned char));
    printf("\n");
    printf("%8s %11s : %2d\n", "signed", "short int", sizeof(signed short int));
    printf("%8s %11s : %2d\n", "unsigned", "short int", sizeof(unsigned short int));
    printf("\n");
    printf("%8s %11s : %2d\n", "signed", "int", sizeof(signed int));
    printf("%8s %11s : %2d\n", "unsigned", "int", sizeof(unsigned int));
    printf("\n");
    printf("%8s %11s : %2d\n", "signed", "long int", sizeof(signed long));
    printf("%8s %11s : %2d\n", "unsigned", "long int", sizeof(unsigned long));

    printf("\n");

    printf("Real Number Type:\n");
    printf("%8s %11s : %2d\n", "", "float", sizeof(float));
    printf("%8s %11s : %2d\n", "", "double", sizeof(double));
    printf("%8s %11s : %2d\n", "", "long double", sizeof(long double));

    return 0;
}

RESULT-------------------------------------------------------------------------------------------------------------
Integer Type: signed char : 1 unsigned char : 1 signed short int : 2 unsigned short int : 2 signed int : 4 unsigned int : 4 signed long int : 4 unsigned long int : 4 Real Number Type: float : 4 double : 8 long double : 12
RESULT-------------------------------------------------------------------------------------------------------------

'C' 카테고리의 다른 글

형식 지정자  (0) 2010.06.06
상수의 표기  (0) 2010.06.06
Data type 사이의 대입 및 출력 형식  (0) 2010.06.05
cl.exe 옵션 정리  (0) 2010.06.05
GCC 옵션 정리  (0) 2010.06.05
And

Data type 사이의 대입 및 출력 형식

|
Data type 구분

정수형 : char, short, int, long
실수형 : float, double, long double


대입 연산시 경고 메시지 출력 유무

No Warning
char, short, int, long <--> char, short, int, long
float, double, long double <--> float, double, long double


입력 형식 지정사 사용시 경고 메시지 출력 유무

Warning
char * --> %d (int *)
int * --> %c (char *)

형식 지정자 사용시 경고 메시지 출력 유무

No Warning
char, short, int --> %c, %d, %hd
long --> %ld
float, double --> %f, %lf
long double --> %Lf

'C' 카테고리의 다른 글

상수의 표기  (0) 2010.06.06
sizeof 연산자를 이용한 Data Type 크기 확인  (0) 2010.06.06
cl.exe 옵션 정리  (0) 2010.06.05
GCC 옵션 정리  (0) 2010.06.05
변환문자  (0) 2010.06.05
And

cl.exe 옵션 정리

|
MS C Compiler

명령어 : cl
>cl test.c
>dir
test.c
test.exe


옵션 :

/P : Preprocessing 후 .i 파일만 생성
>cl /P test.c
>dir
test.c
test.i


/Fa : Compiling 후 .asm 파일, .obj 파일, .exe 파일 생성
>cl /Fa test.c
>dir
test.asm
test.c
test.exe
test.obj


/c : Assembling 후 .obj 파일만 생성
>cl /c test.c
>dir
test.c
test.obj

'C' 카테고리의 다른 글

sizeof 연산자를 이용한 Data Type 크기 확인  (0) 2010.06.06
Data type 사이의 대입 및 출력 형식  (0) 2010.06.05
GCC 옵션 정리  (0) 2010.06.05
변환문자  (0) 2010.06.05
printf() 함수 내부  (0) 2010.06.04
And

GCC 옵션 정리

|
GCC (GNU Compiler Collection)

명령어 : gcc
$ gcc test.c
$ ls
a.out  test.c


옵션 :

-E -o 파일명 : Preprocessing 후 .i 파일만 생성 (-o 파일명을 하지 않으면 전처리 내용을 화면에 출력함)
$ gcc -E -o test.i test.c
$ ls
test.c  test.i


-S : Compiling 후 .s 파일만 생성
$ gcc -S test.c
$ ls
test.c  test.s


-c : Assembling 후 .o 파일만 생성
$ gcc -c test.c
$ ls
test.c  test.o


그 외 옵션 :

--save-temps : .i, .s, .o, 실행 파일을 모두 생성

-g : Debugging 정보까지 포함시켜 컴파일

-l : Library 파일이름을 지정 (소문자 엘)

-L : Library가 위치한 디렉토리를 지정

-Wall : 모든 경고 메시지 출력

예제) 현재 디렉토리에 mylib.o 또는 mylib.so 파일이 있는 경우
$ gcc --save-temps -Wall -g -lmylib -L. -o test test.c

중간 단계의 모든 파일을 생성하고 모든 경고 메시지를 출력하며 디버깅 정보를 포함하여 컴파일한다.

'C' 카테고리의 다른 글

sizeof 연산자를 이용한 Data Type 크기 확인  (0) 2010.06.06
Data type 사이의 대입 및 출력 형식  (0) 2010.06.05
cl.exe 옵션 정리  (0) 2010.06.05
변환문자  (0) 2010.06.05
printf() 함수 내부  (0) 2010.06.04
And

변환문자

|
int short long
decimal : %d %hd %ld
octal %o %ho %lo
hexa %x %hx %lx
unsigned %du %hu %lu


float double(long float) long double
%f %lf

#include <stdio.h>

int main()
{
    int inum;
    int *ip;
    short *sp;

    inum = 0x0F5A0B43;
    ip = &inum;
    printf("%-4s : %10x,\t%3s : %10p\n", "inum", inum, "*ip", ip);

    sp = (short *)ip;
    printf("%-4s : %10p,\t%3s : %10x\n", "sp", sp, "*sp", *sp);

    sp++;
    printf("%-4s : %10p,\t%3s : %10x\n", "sp", sp, "*sp", *sp);

    return 0;
}

'C' 카테고리의 다른 글

sizeof 연산자를 이용한 Data Type 크기 확인  (0) 2010.06.06
Data type 사이의 대입 및 출력 형식  (0) 2010.06.05
cl.exe 옵션 정리  (0) 2010.06.05
GCC 옵션 정리  (0) 2010.06.05
printf() 함수 내부  (0) 2010.06.04
And

쉘프로그래밍

|
터미널을 열고 아래와 같이 입력해보자.

$ echo "Hello world"
Hello world
$

echo는 '메아리' 또는 '울려퍼지다'라는 뜻을 가지고 있다. 따라서 뒤에 오는 문자열을 출력하는 기능을 수행한다.

이번에는 변수를 사용해 보자.

C언어처럼 자료형을 붙일 필요도 없고 선언할 필요도 없다. 그냥 쓰고 싶을 때 변수 이름만 쓰고 뒤에 값을 넣으면 된다.

아래와 같이 입력
$ str="Hello world"
$ echo $str
Hello  world
$

#주의사항
1. 변수에 값을 넣을 때에는 변수 앞에 $를 쓰지 않고, '변수명=값' 이렇게 붙여써야 한다.
2. 변수에 들어있는 값을 이용할 때에는 $를 붙여주어야 한다.

기본적인 사용법을 알았으니 간단한 쉘스크립트 파일을 만들어보자.

$vi ex01.sh
#!/bin/bash

str = "Hello world"
echo $str
:wq
$ chmod 755 ex01.sh
$ ./ex01.sh
Hello world










'linux' 카테고리의 다른 글

apt-get  (0) 2010.10.30
gst  (0) 2010.10.22
SHELL  (0) 2010.08.22
라이브러리 만들기  (0) 2010.05.31
gdb 사용법  (0) 2010.05.31
And

printf() 함수 내부

|
printf 함수
내부적으로 fprintf(stdout, string, mode) 호출
반환자료형은 int, 반환값은 화면에 출력된 문자의 갯수

./a.out > out.txt : stdout으로 설정된 문자열만 파일로 저장, 나머지는 화면으로 출력
./a.out 1> out.txt : stdout으로 설정된 문자열만 파일로 저장, 나머지는 화면으로 출력
./a.out 2> out.txt : stderr로 설정된 문자열만 파일로 저장, 나머지는 화면으로 출력

예전 슈퍼컴퓨터에서는 stdout을 모니터, stderr을 tape(?)로 지정하였으나, 현재에는 둘 다 모니터로 지정되어 있다.

fpin = fopen(filename, mode) --> fopen이 생성한 file descripter(?)의 시작주소를 넘김...파일 열지 못했을 경우 0을 넘김

int A = 100; 은 두가지 작업을 함
1. 메모리 확보
2. cpu에서 메모리로 값 전송

whlie(!(feof(fpin)) --> while(0 == feof(fpin))

리눅스에서는 장치도 파일 형식으로 인식함.

NULL은 0으로 define되어 있음 (매크로 : #define EOF (-1)

exit(1) - 모든 프로그램을 닫아버림

fscanf(...) -> 파일 끝에서 EOF 반환, 끝이 아닌 경우의 반환값은???

fclose(stdin) -> 입력받지 않고 그냥 다음 명령 수행
fclose(stdout) -> 출력하지 않고 그냥 다음 명령 수행
해당 파일을 닫는 동작임. stdin, stdout, stderr도 파일 형식으로 인식

'C' 카테고리의 다른 글

sizeof 연산자를 이용한 Data Type 크기 확인  (0) 2010.06.06
Data type 사이의 대입 및 출력 형식  (0) 2010.06.05
cl.exe 옵션 정리  (0) 2010.06.05
GCC 옵션 정리  (0) 2010.06.05
변환문자  (0) 2010.06.05
And

라이브러리 만들기

|
http://rohhy.kangwon.ac.kr/attach/roh/lecture/cppsrc/c/cchap1111.htm 헤더파일 설명
#include <stdio.h>

int input()
{
int in;
printf("What is your favorite number: ");
scanf("%d", &in);
return in;
}
:wq

$ vi output.c
#include <stdio.h>

void output(int out)
{
printf("Your favorite number is %d.\n", out);
}
:wq

$ vi main.c
#include <stdio.h>

int main()
{
int num;
num = input();
output(num);
return 0;
}
:wq

$ vi input.h
extern int input();
:wq

$vi output.h
extern void output(int)
:wq

$ ls
input.c  input.h  main.c  output.c  output.h
$ gcc -c input.c output.c
$ ls
input.c  input.h  input.o  main.c  output.c  output.h  output.o
$ ar r libmylib.a input.o output.o
ar: creating libmylib.a
$ ls
input.c  input.h  input.o  libmylib.a  main.c  output.c  output.h  output.o
$ ar s libmylib.a
$ ls
input.c  input.h  input.o  libmylib.a  main.c  output.c  output.h  output.o
$ ar t libmylib.a
input.o
output.o
$ ls
input.c  input.h  input.o  libmylib.a  main.c  output.c  output.h  output.o
$ gcc -o main main.c -lmylib -L.
$ ls
input.c  input.h  input.o  libmylib.a  main  main.c  output.c  output.h  output.o
$ ./main
What is your favorite number: 3
Your favorite number is 3.

'linux' 카테고리의 다른 글

apt-get  (0) 2010.10.30
gst  (0) 2010.10.22
SHELL  (0) 2010.08.22
쉘프로그래밍  (0) 2010.06.05
gdb 사용법  (0) 2010.05.31
And

gdb 사용법

|
$ gdb [실행 파일]
$ gdb [실행 파일] [core]
$ gdb [실행 파일] [processid]

gcc -g -o test test.c 로 -g 옵션을 주고 컴파일해야 함

list [[file:]n|func]
help [name]
break [[file:]n|function] <--> del (단축키 d)
clear [[file:]n|function]
run [arglist]
print expr
disp expr <--> undisp
continue [n] (단축키 c)
next [n]
step [n]
backtrace (단축키 bt)
up
down
return (단축키 ret)
quit


· list [[file:]n|func]
source file의 내용을 10줄씩 보여준다. 행 번호를 지정하면n번 행의 주변 10라인이 출력된다.
함수이름을 지정하면 그 함수의 내용이 출력된다. 두 개의 행 번호를 ‘,’로 분리해서 쓰면
첫 행 번호에서 시작해서 두 번째 행 번호까지의 소스가 출력된다.
· help [name]
name으로 지정된 gdb의 command나 관련 정보를 보여준다.
· break [[file:]n|function] <-> d (del)
지정된 file의 n번 행 또는 function에 breakpoint를 설정한다.
· clear [[file:]n|function]
지정된 file의 n번 행 또는 function에 설정된 breakpoint를 제거한다.
· run [arglist]
program을 시작한다.
· print expr
expr의 값을 한번 보여준다.
· disp expr <-> undisp
expr의 값을 실행되는 동안 계속 보여준다.
· c [n] (또는 continue)
breakpoint등에 의해 멈춰진 프로그램의 실행을 계속한다. n이 지정될 경우, 이후 n-1번은
breakpoint는 무시하고, n번째 breakpoint에 걸릴 때 멈춘다.
· next [n]
멈춰진 프로그램에서 프로그램의 다음 n(default=1)개의 문장을 실행하고 다음 번에 실행할
문장을 출력한다. 함수일 경우 함수 전체를 실행한다.
· step [n]
멈춰진 프로그램에서 프로그램의 다음 n(default=1)개의 문장을 실행하고 다음 번에 실행할
문장을 출력한다. 함수일 경우, 함수 내부로 들어가 한 문장씩 실행한다.
· bt (또는 backtrace)
program에서 function들이 불린 순서의 program stack을 보여준다.
· up
현재의 함수를 호출한 함수를 보여준다.
· down
현재의 함수가 호출한 함수를 보여준다.
· ret (또는 return)
현재 함수를 반환하며 빠져나간다.
· quit
gdb를 종료한다.

'linux' 카테고리의 다른 글

apt-get  (0) 2010.10.30
gst  (0) 2010.10.22
SHELL  (0) 2010.08.22
쉘프로그래밍  (0) 2010.06.05
라이브러리 만들기  (0) 2010.05.31
And

컴파일러 옵션

|
http://fussion.egloos.com/9674149 동적라이브러리 설명 상세히

MS Visual Studio Compiler

명령어 : cl
>cl test.c
>dir
test.c
test.exe


옵션 :

/P : Preprocessing 후 .i 파일만 생성
>cl /P test.c
>dir
test.c
test.i


/Fa : Compiling 후 .asm 파일, .obj 파일, .exe 파일 생성
>cl /Fa test.c
>dir
test.asm
test.c
test.exe
test.obj


/c : Assembling 후 .obj 파일만 생성
>cl /c test.c
>dir
test.c
test.obj


GCC (GNU Compiler Colletion)

명령어 : gcc
$ gcc test.c
$ ls
a.out  test.c


옵션 :

-E -o 파일명 : Preprocessing 후 .i 파일만 생성 (-o 파일명을 하지 않으면 전처리 내용을 화면에 출력함)
$ gcc -E -o test.i test.c
$ ls
test.c  test.i


-S : Compiling 후 .s 파일만 생성
$ gcc -S test.c
$ ls
test.c  test.s


-c : Assembling 후 .o 파일만 생성
$ gcc -c test.c
$ ls
test.c  test.o


그 외 옵션 :

--save-temps : .i, .s, .o, 실행 파일을 모두 생성

-g : Debugging 정보까지 포함시켜 컴파일

-l : Library 파일이름을 지정 (소문자 엘)

-L : Library가 위치한 디렉토리를 지정

-Wall : 모든 경고 메시지 출력



GCC는 GNU Compiler Collection 의 준 말이지요.  전에는 C Compiler 였으나, C++이나 자바, 포트란 등을 모두 컴파일 할 수 있을 정도로 커져서 컴파일러 콜렉션이라고 바뀌었습니다.

 

GCC는 컴파일러입니다.  컴파일러의 패스를 보면 쉽게 쉽게 이해 됩니다.

 

전처리기 -> 컴파일러 -> 어셈블러 -> 링커

 

이 과정으로 되는 것을 GCC 하나로 모두 진행 시켜서 소스 파일을 실행 파일로 생성 시켜 줍니다.

 

전처리기는 cpp(C pre processor) 이며, 소스 파일의 주석 제거 및 define을 치환하는 기능 등을 합니다.

그다음은 cc 이며, C Compiler 입니다.  이것은 전처리기를 거친 소스 파일을 어셈 파일로 변환합니다.

그다음은 as 이며, assmeber 입니다.  이것은 에셈파일을 오브젝트 파일로 변환해주십니다.

마지막으로 ld 이며, linker 입니다.  이것은 오브젝트 파일들을 묶어서 실행 파일로 변환해 줍니다.

 

GCC는 옵션이 아주 많이 있지만, 자주 쓰이는 옵션은 제한 되어 있습니다.

 

--help : 간단한 옵션을 출력해줍니다.

--version : gcc의 버젼을 출력해 줍니다.

 

-o : 출력 파일명을 지정할 때 사용합니다.

-c : 링킹 과정을 진행 하지 않고 .o 파일인 오브젝트 파일까지만 생성 하게 됩니다.

-S : 어셈블러까지 진행 하지 않고, 컴파일러까지의 출력은 .S 어셈블러 파일을 생성하게 됩니다.

-O1 ~ -O3 : 최적화 수준을 지정합니다. 숫자가 클수록 높은 수준의 최적화를 하게 됩니다.

-g : 디버깅을 위한 정보를 컴파일 하면서 생성하게 됩니다.

-D : define 을 할수 있는 옵션입니다.

-l (엘) : 라이브러리 이름을 지정합니다.

 -L : 추가 라이브러리 디렉토리를 지정합니다.

-W : 모든 에러 메시지 출력

-w : 모든 에러 메시지를 출력 하지 않음

-I(아이) : 추가 헤더 파일이 있는 디렉토리를 지정합니다.


많이 사용되는 옵션을 축약했습니다.
외의 자세한 사항은 매뉴얼 명령어를 참고하시면 됩니다.
터미널을 여신 후 입력창에  'man gcc'를 입력합니다.

'Compile 강좌' 카테고리의 다른 글

라이브러리  (0) 2010.06.26
[컴파일 강좌] 2강 - C++ 분할 컴파일  (0) 2010.06.22
[컴파일 강좌] 1강 - C 분할 컴파일  (0) 2010.06.21
And

make 활용 강좌 - 3강

|
make 활용 강좌 - 3강

2. 예제

먼저 gcc의 옵션과 삭제 명령에 대해 알아보자.

$ gcc -o test test.c
test.c를 컴파일(프리프로세싱-컴파일링 -어셈블링-링킹)하여 test라는 실행 파일을 만든다.

$ gcc -c test.c
test.c를 (프리프로세싱-컴파일링-어셈블링)만 하여 test.o라는 오브젝트 파일을 만든다.

$ rm test test.o
test 파일과 test.o 파일을 삭제한다.

#Makefile 작성 시 주의 사항 : gcc 앞에 tab이 있어야 한다.


예제1) test 실행파일 생성하기
$ vi Makefile
test : test.c
  gcc -o test test.c
:wq

$ make test
설명1) 
line1 : test 파일을 생성하려면 test.c 파일이 필요
line2 : line1의 조건이 만족되면 실행

실행 순서
  (1) 현재 디렉토리에 Makefile이 있는지 확인
  (2) 있으면 test 파일을 만드는 조건이 있는지 확인 --> test : test.c 발견
  (3) test.c라는 파일이 있는지 확인
  (4) 있으면 gcc -o test test.c 실행
  (5) 현재 디렉토리에 Makefile, test, test.c라는 파일이 존재함


예제2) test.o 파일만 생성하기
$ vi Makefile
test.o : test.c
  gcc -c test.c
:wq

$ make test.o


예제3) test.o 파일과 실행파일 모두 생성하기
$ vi Makefile
test : test.o
  gcc -o test test.o
test.o : test.c
  gcc -c test.c
:wq

$ make test
설명3)
line1 : test 파일을 생성하려면 test.o 파일이 필요
line2 : line1의 조건이 만족되면 실행
line3 : test.o 파일을 생성하려면 test.c 파일이 필요
line4 : line3의 조건이 만족되면 실행

실행 순서
  (1) 현재 디렉토리에 Makefile이 있는지 확인
  (2) 있으면 test 파일을 만드는 조건이 있는지 확인 --> test : test.o 발견
  (3) test.o 파일이 있는지 확인 --> 없음
  (4) test.o 파일이 없으므로 test.o 파일을 만드는 조건이 있는지 확인 --> test.o : test.c 발견
  (5) test.c 파일이 있는지 확인 --> 있음
  (6) gcc -c test.c 실행 --> test.o 파일 생성
  (7) test.o 파일이 생성되었으므로 line1의 조건을 만족함
  (8) gcc -o test test.c 실행 --> test 파일 생성
  (9) 현재 디렉토리에 Makefile, test, test.o, test.c 파일이 존재함


예제4) test, test.o 파일 삭제하기
vi Makefile
clean :
  rm test test.o
:wq

$ make clean
설명4) target file이 있어야 할 곳에 clean이라는 것이 있다. 그리고 dependency file도 없다.
clean이 파일이 아님에도 에러가 나지 않고 아래의 삭제 명령도 잘 실행된다.
그 이유는 파일 이름이 와야할 자리에 레이블도 올 수 있게끔 만들어 놓았기 때문이다.
따라서 위의 clean처럼 컴파일이 아닌 다른 작업을 할 때에는 파일 이름이 아닌 레이블을 적어준다.

'Makefile 강좌' 카테고리의 다른 글

make 활용 강좌 - 2강  (0) 2010.05.30
make 활용 강좌 - 1강  (0) 2010.05.30
And

make 활용 강좌 - 2강

|
make 활용 강좌 - 2강

make - GNU make utility to maintain groups of programs

#쉽게 이해하는 것이 목적이므로 본래의 의미와 약간 다를 수 있음을 미리 알려둔다.


0. 실행 방법
$ make 대상파일

위처럼 입력하면 현재 디렉토리에 Makefile라는 이름을 가진 파일이 있는지 확인한 후,
있으면 그 파일 안의 내용을 실행한다.
없으면 에러 메시지를 출력한다.


1. Makefile 작성법
#주의사항 command를 입력할 때에 반드시 TAB을 한 후 command를 작성해야 함
target file ... : dependency file ...
(TAB)command
...

번역하면

만들 파일 : 필요한 파일 ...
(탭)명령어
...

실행 순서
  (1) target file을 생성하기 전 dependency file이 있는지 확인
  (2-a) 있으면 command를 실행하여 target file을 생성
  (2-b) 없으면 dependency file을 먼저 생성한 후 target file을 생성

'Makefile 강좌' 카테고리의 다른 글

make 활용 강좌 - 3강  (0) 2010.05.30
make 활용 강좌 - 1강  (0) 2010.05.30
And

make 활용 강좌 - 1강

|
make 활용 강좌 - 1강

make - GNU make utility to maintain groups of programs

#쉽게 이해하는 것이 목적이므로 본래의 의미와 약간 다를 수 있음을 미리 알려둔다.

해석하면 프로그램 소스 관리 유틸리티가 된다.
간단히 설명하면 매일 반복되는 소스 수정과 컴파일 과정을 편리하게 해주는 유틸리티이다.
개발 실무를 접해 보지 못한 이들이 이해하기에는 다소 무리가 있을 것 같아 자세한 설명은 생략한다.
작성법을 살펴보고 예제를 통해 어떤 장점이 있는지 알아보자.

make라는 프로그램은 개발자가 작성해 놓은 Makefile이라는 이름을 가진 파일을 열어 그 안의 내용을 실행한다.

우선 test.c라는 간단한 소스파일과 Makefile을 작성해 보자.

1. test.c 작성
$ vi test.c
#include <stdio.h>
int main()
{
  printf("Hello world\n");
  return 0;
}
:wq


2. Makefile 작성
#주의 사항 : gcc 앞에 space bar가 아닌 TAB이 되어 있어야 함.
$ vi Makefile
test : test.o
  gcc -o test test.o
test.o : test.s
  gcc -c test.o test.s
test.s : test.c
  gcc -S test.c
clean :
  rm test test.o test.s test
:wq


3. make 실행
$ make test
$ ls
Makefile  test  test.c  test.o  test.s
$ ./test
Hello world
$ rm test test.o test.s

$ make test.o
$ ls
Makefile  test.c  test.o  test.s
$ rm test.o test.s

$ make test.s
$ ls
Makefile  test.c  test.s
$ rm test.s

$ make test
$ ls
Makefile  test  test.c  test.o  test.s
$ make clean
$ ls
Makefile  test.c

'Makefile 강좌' 카테고리의 다른 글

make 활용 강좌 - 3강  (0) 2010.05.30
make 활용 강좌 - 2강  (0) 2010.05.30
And
prev | 1 | 2 | 3 | next