c++에서는 클래스에 소멸자 개념이 있다. 


헌데 c언어는 절차 지향 언어라서 OPP개념인 소멸자는 없다...


헌데 c언어에서도 메인 함수가 종료되기 전에 함수 하나를 실행 할수 있다.


프로그램 종료 하기전에 꼭 처리해야 하는 것이 있으면 좋을거 같다.





코드만 보면 printf 함수를 마지막으로 어떤한 함수는 호출되지 않았습니다.


허나 컴파일 해서 보면 


beforeexit함수가 실행되었습니다.


atexit함수로 종료할떄 실행한것 인데요


이 함수는 어떠한 리턴 형태를 가질수 없고 어떠한 인자를 가질 수는 없습니다.



Posted by 준P

lib 파일은 dll 파일에서 함수를 연결(link)시켜주는 파일입니다.


dll 파일을 사용한다면 lib로 간단하게 링크할수 있습니다.


일단 응용 프로그램을 만들겟습니다. 저는 콘솔로 만들었습니다.



이름은 DLLPROJECTEXELIB로 하엿습니다.



다음으로 넘어가 주시고요 




빈프로젝트를 선택해주시고 마치시면 됨니다.


다음과 같이 입력해주세요 (함수명은 자신이 만들었던 함수명을 지정해주셔야 합니다.





프로젝트 - 속성- 구성 속성 - 링커 - 일반 - 추가 라이브러리 디렉터리 에서 dll파일을 만들었을떄 나온 lib 파일의 위치를 지정해 줌니다.


참고로 dll 파일 이름은 lib 파일명과 같기 떄문에 dll 파일의 이름을 수정하셧다면 lib파일명도 수정하셔야 합니다.



그리고 입력으로 가셔서 lib 파일의 파일명을 추가해주세요


그리고 마지막으로 dll파일을 exe파일 폴더내로 이동시켜주세요 


dll 파일의 위치를 찾지못해서 에러가 남니다.


참고로 exe를 배포할떄 dll파일도 같이 배포해야합니다.


lib파일은 같이 배포 할 필요가 없습니다.


그리고 실행해보면 밑과 같이 뜸니다.



Posted by 준P

저번에 dll함수를 만들어 보았습니다.


이번에는 그 dll 파일을 사용해 보는 것입니다.


새프로젝트를 만들겟습니다.



저는 콘솔을용 프로그램에서 만들었습니다.


프로젝트명은 DLLPROJECTEXE로 하였습니다.



다음으로 넘어 가줌니다.



콘솔응용프로그램을 선택하고 저는 추가 옵션으로 빈프로젝트를 선택하였습니다.


마치신 다음에 cpp파일을 만드신후에 다음과 같이 입력합니다.



제가 사용한 dll의 hell_func는 단순이 전달받은 두 인자 값의 곲을 리턴해주는 dll 파일 입니다.


Posted by 준P

dll을 기본적으로 제작을 할려면 프로젝트를 열어야합니다.


우선 win32 프로젝트로 만드셔야 합니다.



설명을 보시면 아시겟지만 win32응용프로그램이나 콘솔응용프로그램 DLL또는 정적 라이브러리를 만드는 프로젝트라고 나와 있습니다.



다음으로 넘어 가줍시다.



dll을 선택해주시고 추가 옵션에는 빈프로젝트나 내보내기 기호를 클릭 하지 말아 주세요


빈프로젝트로하면 입력해야할것이 많아져서 힘듬니다.



처음으로 프로젝트에 들어오시면 보이는 함수 입니다.


저는 해더를 하나 만들어서 사용 할것입니다.


파일을 여러개 만들어서 관리하기 싫으신 분은 그냥 제가 해더에 입력한 부분을 맨 상단에 입력하시면 됨니다.



해더명을 저는 MAKEDLL.h로 하였습니다.



해더에 다음과 같이 입력해 줌니다.


자세이 보시면 #ifdef등 여러 이상한 코드가 있는데요


win32프로젝트다보니 c언어로 나오는것이아니라서 Name Mangling이 발생합니다.


Name mangling 의 현상은 함수명이 이상하게 변환되어서 프로그램을 제작할떄 LoadLibrary로 dll을 로드 할떄 null이 반환되는 경우입니다.


이것이 위코드를 사용하지 않았을 경우에 생기는 Name Mangling 입니다.


위코드를 사용해서 만들면 정상적으로 변환이 됨니다.


위의 코드는 c언어로 변환하기위한 것입니다.


c++은 c언어 기반이므로 당연히 c++에서도 똑같이 하시면 됨니다.


그리고 저 가운데(제가 주석으로 함수를 정의하라고 한부분)에 변환할 함수명을 넣어야 c언어 형식으로 변환이 됨니다.



이제 컴파일 하시면 됨니다.



컴파일을 하시면 이 에러가 뜨는데요 이 에러는 dll이 실행 파일이 아니라서 이 에러가 뜨는것 입니다. 


f6으로 컴파일 하시면 이에러는 뜨지 않습니다. f5는 컴파일후 실행까지하는 단축티 이거 f6는 컴파일만 하는 단축키 이기 때문 입니다.


Posted by 준P

dll이란 Dynamic Linking library 의 약어로 windows 에서 사용되는 공유 라이브러리 입니다.


dll이 사용되는 예로는 자신이 여러 프로그램을 만들어 배포할떄 자신이 만든 함수를 배포할떄마다 함수를 직접넣을 필요없이 dll에 함수를 저장하여 공유하면 된다.


또한 한 프로그램이라해도 여러 프로그램으로 나누어서 배포 해야하는 경우도 있다 그때 같은 함수가 사용된다면 dll로 배포할수 있다.


그리고 프로그램의 용량을 줄이기 위해 사용되기도 함니다.


저 자세한 내용은 ms사의 문서를 읽어보도록 하자 


http://msdn.microsoft.com/ko-kr/library/9se914de.aspx


이 dll에도 종류가 있다.


dll의 종류는 언어에 따라 달라지는데 


MFC에서는


정적으로 MFC에 링크하는 기본DLL빌드


동적으로 MFC에 링크하는 기본DLL빌드


MFC에 항상 동적으로 링크하는 MFC 확장 DLL 빌드


가 있습니다.


참고로 dll파일을 로드 하는 방법에는 여러가지가 있습니다.


LoadLibrary와 getProcAddress를 사용해서 dll에 로드하는 방법과 lib 파일을 사용하여 정적으로 로드 하는 방법이 있습니다.



Posted by 준P

일단 제강의를 듣기전에 c언어를 어느정도 해두시고 따라오시면 좋습니다.


c언어에서 중복되는 내용은 될수있으면 뺄려고 합니다. 참고해주세요


그리고 저는 이클립스로 c++코딩을 하고있습니다.


자 이제 그러면 c++에서 hello hell!!을 출력하는 프로그램을 만들어 보겟습니다.


#include <iostream>

int main(void){

std::cout<<"hello "<<"hell"<<std::endl;

}


컴파일을 해보면 이렇게 콘솔창에 hello hell을 찾으실 수 있습니다.


c++에서는 cout로 출력을하고 <<로 다른 변수나 문자열을 출력할수 있습니다.


만약 a 라는 변수에 5가저장되있고 cout로 출력할려면 


std::cout<<"a변수에 있는 값:"<<a<<std::endl;


이렇게 하시면 됨니다.


그렇다면 std::endl은 무엇읽까요 바로 개행 입니다.


개행이란 새줄입니다. 한줄에 쭉 쓸수는 없으니 새로써야합니다.


그런데 std::cout 와 std::endl 에 std는 뺼수 없을까여? 매번 이렇게 길게 입력할수는 없습니다.


main함수 밖에 using namespace std;


라고 작성해주신뒤에 std::를 뺴시면 됨니다.


위코드는 std라는 이름공간을 사용하겟다는 뜻인데요



이름공간(namespace)을 만들어준뒤 이름공간에서 사용할 함수를 정의해줌니다.


저는 sdes라는 이름공간의 crasy라는 함수에 10이라는 값을 전달하고 리턴된값을 출력햇습니다.


100이 출력되었습니다,


이렇게 이름공간을 만들고 다량한 함수를 만들어서 출력하는 장난을 해보세요 


using namespace 로 짧게도 해보시고요


참고로 다른 이름공간에서는 같은 이름의 변수가 있어도 상관없습니다.


간단히 사진으로 보여드리고 강좌를 마치겟습니다.




'Development > C/C++' 카테고리의 다른 글

DLL) dll 제작하기  (0) 2014.09.22
DLL) dll의 정의와 종류  (0) 2014.09.21
c언어) 특수 문자와 변수 설명  (0) 2014.04.17
c언어에서 소리출력하기!!!  (0) 2013.12.31
정보올림피아드 본선 - 문제코드 : 2262  (0) 2013.12.31
Posted by 준P

c언어 특수문자 종류 입니다.


 특수문자 

 의미 하는 바

 \a

 경고음

 \b

 백스페이스

 \f

 폼 피드

 \n

 개행

 \r

 캐리지 리턴(carriage return)

 \t

 수평 텝

 \v

 수직 텝

 \'

 작은 따음표 출력

 \"

 큰 따음표 출력

 \? ? 출력
 \\ 역 슬러쉬 출력

네 특수문자는 위와 같고요


다음은 변수 입니다.


변수는 데이터를 저장할 수 있는 값 저장공 간이라고 보시면 됨니다.


 자료형 

크기 

표현 범위 

 char

 1 바이트

 -128 이상 +127

 unsigned char

 0 이상 (-128  +127)이하

short

 2 바이트

- 32,768 이상 +32,767

 unsigned short

 0 이상(32,768 + 32,767) 이하

 int 

 4 바이트

 -2,147,483,648 이상 +2,147,483,647

 unsigned int

 0 이상 ( 2,147,483,648 + 2,147,483,647) 이하

 long

  -2,147,483,648 이상 +2,147,483,647

 unsigned long

 0 이상 (2,147,483,648  + 2,147,483,647) 이하

 long long

 8 바이트

 -9,223,372,036,854,755,808 이상+9,223,372,036,854,775,807

 unsigned long long

 0 이상 ( 9,223,372,036,854,755,808+9,223,372,036,854,775,807)이하

 실수형

 float

 4 바이트

 ±3.4 x 10 -37 이상 ±3.4 x 10 +38

 double

 8 바이트

 ±1.7 x 10 -307 이상 ±1.7 x 10 +308

 long double

 8 바이트 이상

 double이상 표현 범위


unsigned 를 앞에 붙이시면 표현 범위가 0이상으로 버뀌면서 범위도 늘어남니다.


자료형은 정수만 가능합니다.


실수형에는 정수와 소수를 표형 가능함니다.


Posted by 준P
#include<stdio.h>
#include<Windows.h>
#include<MMSystem.h>
#pragma comment(lib,"Winmm.lib")

int main(void)
{
sndPlaySoundA("C:\\a.wav",SND_ASYNC|SND_NODEFAULT); // 음악연주 C:\\~~~ 는 경로명을 입력합니다. (단, 폴더를 구분하는 역슬래쉬는 2번 써 줘야 합니다. 예) C:\test\aa.wav  일 경우 "C:\\test\\aa.wav"
system("pause");
return 0;
}

이소스를 실행하면 c언어에서 소리가나옴니다.

system("pause");
위 함수는않넣으셔두되지만 실행시 바로 종료가되버려서 넣어주시기바람니다.


Posted by 준P

주사위 세개
Time Limit : 1000MS

문제 
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

규칙(1) 같은 눈이 3개가 나오면 10,000원+(같은 눈)*1,000원의 상금을 받게 된다. 
규칙(2) 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)*100원의 상금을 받게 된다. 
규칙(3) 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)*100원의 상금을 받게 된다.

예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3*100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2*1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6*100으로 계산되어 600원을 상금으로 받게 된다.

3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

입력형식 
첫 째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.

출력형식 
첫째 줄에 게임의 상금을 출력 한다.

입력 예
3 3 6

출력 예
1300

입력 예
2 2 2

출력 예
12000

입력 예
6 2 5

출력 예
600


#include <stdio.h>
int main()
{
int j, inputs[3], max=0, sum=0;
printf("주사위의 숫자를 입력해 주십시요");
for(j=0;j<3;j++)
{
scanf_s("%d", &inputs[j]);
for(;;)
{
if(inputs[j]>6||inputs[j]<=0)
{
printf("숫자가 0이하이거나 6보다 큼니다!!\n다시입력해주십시오\n");
scanf_s("%d", &inputs[j]);
}
else if(inputs[j]<=6||inputs[j]>0)
break;
}
if(max<inputs[j])
max=inputs[j];
}
if(inputs[0]==inputs[1]&&inputs[1]==inputs[2])
sum=10000+inputs[0]*1000;
else if(inputs[0]==inputs[1]&&inputs[1]!=inputs[2])
sum=1000+inputs[0]*100;
else if(inputs[0]=!inputs[1]&&inputs[1]==inputs[2])
sum=1000+inputs[1]*100;
else if(inputs[0]==inputs[2]&&inputs[0]!=inputs[1])
sum=1000+inputs[0]*100;
else if(inputs[0]!=inputs[1]&&inputs[2]!=inputs[1])
sum=max*100;
printf("%d", sum);
}


Posted by 준P
#include <stdio.h>
#include <conio.h>
#include <UrlMon.h>
#pragma comment(lib,"UrlMon.lib")
int main(){
 int num;
printf("[BlackRose] V3 설치파일 다운로드 : 1 종료 : 2\n\n명령입력 :");
scanf("%d",&num);
switch(num){
case 1:
URLDownloadToFile (NULL, "http://v3lite.v3webhard.com/download/V3LiteSG_Setup.exe", "C:\\V3LiteSG_Setup.exe", 0, NULL);
getch();
case 2:
exit(0);
default :
printf("명령을 잘못입력하셨습니다.\n");
}
getch();
return 0;
}

URLDownloadToFile (NULL, "http://v3lite.v3webhard.com/download/V3LiteSG_Setup.exe", "C:\\V3LiteSG_Setup.exe", 0, NULL);
요게 젤중요..

v3lite다운할게에여.c드라이브폴더에..


Posted by 준P
#include<stdio.h>
#include<Windows.h>
 
int main(void)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
HWND hWnd =FindWindow("ConsoleWindowClass",NULL);
HBITMAP hImage,hOldBitmap;

HDC hdc    = GetDC(hWnd);
HDC hMemDC = CreateCompatibleDC(hdc);
// 이미지 로드
hImage = (HBITMAP) LoadImage(NULL,
                        TEXT("zero.bmp"),
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
// 이미지 출력 부분
hOldBitmap = (HBITMAP) SelectObject(hMemDC,hImage);
BitBlt(hdc,0,0,328,235,hMemDC,0,0,SRCCOPY);

    // 각종 메모리 해제 
SelectObject(hMemDC,hOldBitmap);
DeleteObject(hImage);
DeleteDC(hMemDC);
ReleaseDC(hWnd,hdc);

system("pause");
 return 0;
}


Posted by 준P