2021. 6. 29. 19:32

라인 드로우를 구현할때, openGL, DX, winDC 등을 사용할 수 없는경우,

바닥부터 맨땅에 코딩을 해야하는 경우가 생기더라.

그때를 위한 참고용 코드.

 

Void DrawLine(int x1, int y1, int x2, int y2)
{
    int aX=0, aY=0;
    int cnt = 0;
    int dx = x2-x1;
    int dy = y2-y1;

    if(dx < 0) {addX = -1; dx = -dx;}
    else addX = 1;
    if(dy < 0) {addY = -1; dy = -dy;}
    else addY = 1;
    
    int x = x1;
    int y = y1;
    if(dx >= dy)
    {
        for(int i = 0 ; i < dx ; i++)
        {
            x += addX;
            cnt += dy;
            if(cnt >= dx)
            {
                y += addY; cnt -= dx;
            }
            drawPoint(x,y);
        }
    }
    else
    {
        for(int i = 0 ; i < dy ; i++)
        {
            y+= addY;
            cnt += dx;
            if(cnt >= dy)
            {
                x += addX; cnt -= dy;
            }
            darwPoint(x,y);
        }
    }
}

 

 

'Computer Programming > C,C++,MFC' 카테고리의 다른 글

[C/C++] C언어 입력함수 scanf  (0) 2017.02.15
[C/C++] Bit Field, 비트 변수 ':'  (0) 2017.02.13
[C/C++] fopen 함수의 옵션값 정리  (0) 2016.11.10
[C/C++] bsearch 함수  (0) 2016.06.22
[MFC]CString <-> Char* 변환  (0) 2013.11.08
Posted by 은돌군
2017. 2. 15. 10:14

C언어의 대표적 함수 scanf 의 함수는 다음과 같은 형태를 가지고 있다.


int scanf (const char * format, ...);


사용 예는 다음과 같다.


scanf("%d", &input);


위 글은 숫자형을 입력받을때 사용하는 방식이다.


Visual Studio 2008 기준 전체 코드를 간단히 짜보면  다음과 같다.


#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])

{

int input;

scanf("%d", &input);

printf("%d\n", input);

return 0;

}


숫자값을 입력받고, 숫자값을 출력하는 코드이다.
실행시켜보면 다음과 같이 표출되는것을 확인할 수 있다.






Posted by 은돌군
2017. 2. 13. 16:01

C 언어에서 Bit 단위로 변수를 지정하고 싶은 경우, Bit Field 라는 기능을 사용한다


기본적인 선언 방법은 다음과 같다.


struct bitField {

BYTE bit1:1;

BYTE bit2:1;

BYTE bit3:1;

BYTE bit4:1;

BYTE bit5:1;

BYTE bit6:1;

}


이와 같이 선언하면 1Byte 에 6개의 변수로 각각 1bit 까지의 데이터를 사용할 수 있다.

1bit 이므로, 0과 1만 입력이 가능하며, 2를 입력하게 되면 앞 비트를 침범하게 된다.


bitField.bit1 = 2; 


이와 같이 데이터값을 셋팅하면, 2의 binary 값은 10 이므로 bitField.bit1 는 0, bitFile.bit2 는 1이 셋팅되게 된다.


bit 단위로 데이터를 저장하거나,  bit 단위의 프로토콜 데이터를 사용하면 상당히 유용한 기능이다.

나는 bit 단위로 정보를 잘라서 전송해야 하는 CAN 프로토콜 사용시 유용하게 사용하였다.


비트필드의 선언 변수형은 C 언어의 모든 변수형이 사용이 가능하며, unsigned 형 변수로 사용하지 않는다면 상당한 주의가 필요하다. 



'Computer Programming > C,C++,MFC' 카테고리의 다른 글

[C]LineDraw - 브레젠험 알고리즘  (0) 2021.06.29
[C/C++] C언어 입력함수 scanf  (0) 2017.02.15
[C/C++] fopen 함수의 옵션값 정리  (0) 2016.11.10
[C/C++] bsearch 함수  (0) 2016.06.22
[MFC]CString <-> Char* 변환  (0) 2013.11.08
Posted by 은돌군
2016. 11. 10. 10:30

fopen 함수를 종종 쓸일이 생기는데, 매번쓰는 옵션값 외에는 헷갈리기에 정리해 보았다.


fopen 함수는 파일 입출력을 위한 함수로 다음과 같이 사용할 수 있다.


FILE *fp = NULL;

//우선 파일 포인터로 사용할 변수를 선언하고, 
//경로와 모드값으로 파일을 오픈한뒤 파일포인터에 넣는다.
//fopen 함수의 형태는 다음과 같다.

//FILE *fopen(const char *filename, const char *mode);

fp = fopen("test.txt", "wb");

그리고 위에 fopen Mode 값으로 사용할 수 있는 값들은 다음과 같다.


r : Open for reading only. (읽기 전용)


w : Create for writing. If a file by that name already exists, it will be overwritten.

    (쓰기용으로 파일생성, 동일이름이 있다면 덮어씀.)


a : Append; open for writing at end-of-file or create for writing if the file does not exist.

    (동일명 파일 존재시 끝에 이어씀, 동일명 파일 없으면 쓰기용 파일 생성)


r+ : Open an existing file for update (reading and writing).

    (현재 있는 파일에 read/write 모두 덮어씀.)


w+ : Create a new file for update (reading and writing). 

      If a file by that name already exists, it will be overwritten.

    (읽기/쓰기용으로 파일 생성. 같은 파일 존재시 덮어)


a+ : Open for append; open (or create if the file does not exist) for update at the end of the file.

    (파일이있으면 뒤에 추가, 업다면 새로 생성)


t : Text Mode (텍스트 모드)


b : Binary Mode (이진 파일 모드)



'Computer Programming > C,C++,MFC' 카테고리의 다른 글

[C/C++] C언어 입력함수 scanf  (0) 2017.02.15
[C/C++] Bit Field, 비트 변수 ':'  (0) 2017.02.13
[C/C++] bsearch 함수  (0) 2016.06.22
[MFC]CString <-> Char* 변환  (0) 2013.11.08
[C/C++]OpenSSL Library 사용을 위해  (0) 2013.10.15
Posted by 은돌군
2016. 6. 22. 11:15

c++의 bsearch 함수는 이진검색을 하는 함수이다.

이진검색을 하기 위해서 자료는 반드시 정렬되어 있어야 한다.


c++의 bseacrh는 다음과 같이 사용할 수 있다.

bsearch 할 데이터의 구조에 맞게끔 compare 함수는 작성해야 한다.

(다양한 데이터 구조에서 사용할 수 있다.


셈플 코드는 다음과 같다.


int compare( const void *cmp1, const void *cmp2)

{

   return strcmp( (char *)cmp1, (char *)cmp2);

}


#define  SIZE_TABLE     10

#define  SIZE_ITEM      20


int main( void)

{

   char  table[SIZE_TABLE][SIZE_ITEM]  = { "com", "size", "aaaa", "bbbb", "cccc", "dddd"};

   char *ptr;


   ptr   = (char *)bsearch( "size", table, SIZE_TABLE, SIZE_ITEM, compare);

   printf( "find chracter = %sn", ptr);

  

   return 0;

}



Posted by 은돌군
2013. 11. 8. 17:14
작업할때마다 까먹어서 추가!! 꼭 까먹을만하면 다시 사용하게 되는군요 ㅎ

CString char2CString(char* inp)

{

int len;

CString str;

BSTR buf;


len = MultiByteToWideChar(CP_ACP, 0, inp, (int)strlen(inp), NULL, NULL);

buf = SysAllocStringLen(NULL, len);

MultiByteToWideChar(CP_ACP, 0, inp, (int)strlen(inp), buf, len);

str.Format(_T("%s"), buf);


return str;

}



char* CString2char(CString& str)

{

long len = str.GetLength();

len = len*2;

char* szTemp = new char[len+1];

memset(szTemp, 0, len+1);

USES_CONVERSION;

strcpy(szTemp, T2A(str));


return szTemp;

}

Posted by 은돌군
2013. 10. 15. 10:49


openssl-0.9.8k.tar.gz


# 다운 받는 경로 

http://www.openssl.org/source/


# Windows 상에서 OpenSSL Library 사용을 위해 필요한 OpenSSL 파일 -> 수많은 OpenSSL 파일들이 존재..

Posted by 은돌군
2013. 10. 10. 16:37

하면됨..


DWORD CMapInstallerDlg::getFileLengthFromHttp(CString url)

{

DWORD filesize;

TCHAR szCause[255];

CString CauseOfError;

TRY 

{

CInternetSession session;

CHttpFile *remotefile = (CHttpFile*)session.OpenURL(url,1,INTERNET_FLAG_TRANSFER_BINARY);

TCHAR szContentLength[32];

DWORD dwInfoSize = 32;

DWORD dwFileSize = 0;

BOOL bGetFileSize = FALSE;

if(remotefile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, szContentLength, &dwInfoSize, NULL))

{

bGetFileSize = TRUE;

dwFileSize = (DWORD)_ttol(szContentLength)

filesize = dwFileSize;

}

else

{ // file nothing

filesize = -1;

}

remotefile->Close();

session.Close();

delete remotefile;

delete session;

}

CATCH_ALL(error)

{

AfxMessageBox("Error when find Data from Server");

error->GetErrorMessage(szCause,254,NULL);

CauseOfError.Format("%s",szCause);

AfxMessageBox(CauseOfError);

}

END_CATCH_ALL;

Posted by 은돌군
2013. 10. 10. 15:51

winninie.h include 후,

아래 코드 사용 하면됨 ㅎ


int getFileFromHttp(char* pszUrl, char* pszFile)

{

HINTERNET    hInet, hUrl;

DWORD        dwReadSize = 0;


// WinINet함수 초기화

if ((hInet = InternetOpen("MyWeb",            // user agent in the HTTP protocol

INTERNET_OPEN_TYPE_DIRECT,    // AccessType

NULL,                        // ProxyName

NULL,                        // ProxyBypass

0)) != NULL)                // Options

{

// 입력된 HTTP주소를 열기

if ((hUrl = InternetOpenUrl(hInet,        // 인터넷 세션의 핸들

pszUrl,                        // URL

NULL,                        // HTTP server에 보내는 해더

0,                            // 해더 사이즈

0,                            // Flag

0)) != NULL)                // Context

{

FILE    *fp;


// 다운로드할 파일 만들기

if ((fp = fopen(pszFile, "wb")) != NULL)

{

TCHAR    szBuff[READ_BUF_SIZE];

DWORD    dwSize;

DWORD    dwDebug = 10;


do {

InternetReadFile(hUrl, szBuff, READ_BUF_SIZE, &dwSize);

fwrite(szBuff, dwSize, 1, fp);


dwReadSize++;


if(dwReadSize % 100 == 0)

printf("[%d]\n", dwReadSize);

size_t szFullSize = 766400;

UPDATE("Downloading...", (int)dwReadSize, 766400, true);

} while ((dwSize != 0) || (--dwDebug != 0));


fclose( fp );

}

InternetCloseHandle(hUrl);

}

InternetCloseHandle(hInet);

}

return(dwReadSize);

}



Posted by 은돌군