'프로그래밍 관련자료'에 해당되는 글 5건
- 2017.06.13 :: cure.exe 소스공개( gcc버전으로 리뉴얼 ) 2
- 2014.05.13 :: DirectFB 시작
- 2013.07.24 :: JVM INTERNAL 2
- 2009.09.30 :: C++, C 함수 공용하기
- 2009.02.05 :: #define 이용 해서 Test(디버그모드일때)할때만 내용 출력하기
인터넷에 떠도는 Cure GCC버전( Windows 용 ) 소스입니다.
인터넷에 하도 떠돌며 사라지질 않길래, 이게 뭐라고........
그냥 소스 당시 로직 거의 그대로 새로 짜서 공개합니다.
원래 코드는 turbo C 로 작성하였었습니다만..... 시대도 변했고 gcc를 개인적으로 좋아하는지라 gcc버전으로 작성했습니다.
( gcc cure.c -o cure.exe )
적당한 재귀호출 이랑 API사용법 외에는 별 내용이 없습니다.
재미삼아 보세요.
atrrib -h -s *.* 과 같은 스크립팅으로도 가능하지만, 당시 전산실에서는 path설정이 풀려서 해당 커맨드가 잘 먹질 않아서 굳이 30분 코딩해서 바이너리로 만들었던 기억이 납니다.
코드에 대한 퀄리티 지적은 사절합니다.
코딩을 거의 하지 않거든요.
우분투에서 directFB 예제 빌드 및 실행방법
root 권한으로 apt-get install directfb* 로 DirectFB관련 라이브러리 및 소스 설치
//----------------------------------------------------
//소스 파일명 : a.c
//----------------------------------------------------
#include <stdio.h>
#include <unistd.h>
#include <directfb.h>
// entry point
static IDirectFB *g_pDirectFb = NULL;
// primary surface
static IDirectFBSurface *g_pPrimarySurface = NULL;
static int nScreenWidth = 0;
static int nScreenHeight = 0;
/*
* An error checking macro for a call to DirectFB.
* It is suitable for very simple apllications or tutorials.
* In more sophisticated applications this general error checking should not be used.
*/
#define DFBCHECK(x...) \
{ \
DFBResult err = x; \
\
if (err != DFB_OK) \
{ \
fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
DirectFBErrorFatal( #x, err ); \
} \
}
int main(int argc, char **argv)
{
// create surface description
DFBSurfaceDescription dsc;
DFBCHECK( DirectFBInit(&argc, &argv) );
// create super interface.
DFBCHECK( DirectFBCreate(&g_pDirectFb) );
DFBCHECK( g_pDirectFb->SetCooperativeLevel(g_pDirectFb, DFSCL_FULLSCREEN) );
// set flags
dsc.flags = DSDESC_CAPS;
dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
// create surface
DFBCHECK ( g_pDirectFb->CreateSurface(g_pDirectFb, &dsc, &g_pPrimarySurface) );
// get surface size
DFBCHECK ( g_pPrimarySurface->GetSize(g_pPrimarySurface, &nScreenWidth, &nScreenHeight) );
printf("Width: %d, Height: %d\n", nScreenWidth, nScreenHeight);
// clear surface
DFBCHECK ( g_pPrimarySurface->FillRectangle (g_pPrimarySurface, 0, 0, nScreenWidth, nScreenHeight) );
// set surface color
DFBCHECK ( g_pPrimarySurface->SetColor(g_pPrimarySurface, 0xff, 0x00, 0x00, 0xff) );
printf("Draw Rectangle\n");
// draw rectangle
DFBCHECK ( g_pPrimarySurface->FillRectangle (g_pPrimarySurface, 100, 100, 440, 280) );
printf("Update Surface\n");
// update surface
DFBCHECK ( g_pPrimarySurface->Flip(g_pPrimarySurface, NULL, 0) );
sleep(5);
// clean up
g_pPrimarySurface->Release( g_pPrimarySurface );
g_pDirectFb->Release( g_pDirectFb );
return 0;
}
-------------------------------
~/.directfbrc 내용 생성
-------------------------------
mode=640x480 system=x11
[ 빌드방법 ]
gcc a.c -I/usr/include/directfb -ldirectfb
이후 실행 확인.
끝.
문득 다가올 텀프로젝트에 대비하여
C++의 펑션을 C에서 가져다 쓸 방법에 대해 고민하게 되었다.
그 이유는 벡터와 스택과 같은 매우 유용한 클래스 라이브러리를 사용하기 위함이다.
여러가지 방법이 있을수있지만
웹서핑과 실험이후 얻은 결론은 다음과 같다.
a.cpp , main.c
두개의 파일이 있다고 가정하자
a.cpp에는 클래스를 구현한후, wrapper 더미 펑션을 생성한다.
이유는 씨에서 호출하기 위함이다.
클래스를 래핑하여 건드릴 수 있는 더미 함수를 생성할떄 extern "C"로 생성하여
맹글링 문제가 생기지 않게 해주어야 한다.
함수의 다형성 문제로 컴파일러가 펑션 이름을 알아서 바꾸게 되는데 이를 저지하게 해주는
전처리문정도로 생각하면될듯하다.
이렇게하여
g++ -c a.cpp -o a.o
gcc -c main.c -o main.o
이후 오브젝트 코드가 생성되면 g++을 통해 링크해주면 된다
g++ main.o a.o -o a.out
이런식으로 하면 a.out이 생성되고 c코드에서 C++을 불러오는 경이로운(?)모습을 볼 수 있다.
#ifdef _Test
출력할 내용(테스트 출력용)
#endif
- 디버그 모드일때만 출력할것을 위와 같이 한다음에
stdafx.h 헤더 파일이나 또는 위 *.cpp 파일에 포함되어지는 헤더파일에 아래와 같이 한다.
#define _Test
그리고 출력하지 않을 때는 #define _Test를 주석처리한다.
또는
#ifdef _DEBUG_MODE
#define _Test
#endif
이렇게 하면 디버그 모드일때만 _Test가 선언된다.