이중포인터배열과 포인터배열 사용하는 방법

shint의 이미지

이중포인터배열과 포인터배열 사용하는 방법 ★★★★★

#include <iostream>
#include <math.h>
#include <stdio.h>
 
 
#if 0
 
이 예제소스는 2중 포인터 배열을 사용하는 방법입니다.
 
비트맵 이미지의 RGB 는 4바이트를 기준으로 사용합니다.
여기서는 3바이트를 기준으로 처리하였으니. 주의하시기 바랍니다. 
 
#endif
 
 
 
#define IDOK 1
 
 
class COnBilinearDlg
{
public:
    COnBilinearDlg()
    {
        printf("COnBilinearDlg()\n");
        fnInit();
    }
 
    ~COnBilinearDlg()
    {
        printf("~COnBilinearDlg()\n");
    }
 
    void fnInit()
    {
        printf("fnInit()\n");
        m_BilinearRate = 0.1;
    }
 
    int DoModal()
    {
        printf("DoModal()\n");
        return 1;
    }
 
    double m_BilinearRate;
 
 
};
 
unsigned char** Image2DMem(int h, int w)
{
    int pointer_size = 4;
    unsigned char ** p = NULL;
    p = (unsigned char**) new unsigned char [h* pointer_size];
 
    int i=0;
    for(i=0; i<h; i++)
    {
        p[i] = (unsigned char*) new unsigned char [w];
    }
    return p;
}
 
class CImageProcessing
{
public:
    CImageProcessing()
    {
        printf("CImageProcessing()\n");
        fnInit();
    }
 
    ~CImageProcessing()
    {
        printf("~CImageProcessing()\n");
    }
 
    void fnInit()
    {
        printf("fnInit()\n");
        m_height    = 5;
        m_width     = 10;
        m_Re_height = 0;
        m_Re_width  = 0;
        m_Re_size   = 0;
 
        m_tempImage     = NULL;
        m_OutputImage   = NULL;
        m_InputImage    = new unsigned char [m_height*m_width];
 
        //-------------------------
        printf("이중 포인터 생성과 초기화\n");
        //-------------------------
        int i=0;
        int j=0;
        int cnt=0;
 
        printf("동적 메모리생성에 필요한. 포인터 주소에 크기 4BYTE를 사용한다.\n");
        printf("가로 세로 중에 값이 적은쪽으로 생성하면 포인터로 인한. 용량을 줄일 수 있다.\n");
        int pointer_size = 4;
        m_tempImage = (unsigned char**) new unsigned char [m_height* pointer_size];
        for(i=0; i<m_height; i++)
        {
            m_tempImage[i] = (unsigned char*) new unsigned char [m_width];
        }
 
        //-------------------------
        printf("2중 포인터에 값 입력\n");
        //-------------------------
        cnt=0;
        for(i=0; i<m_height; i++)
        {
            for(j=0; j<m_width; j++)
            {
                m_tempImage[i][j] = cnt;
                printf("%d %d %2d\t", i, j, m_tempImage[i][j]);
                cnt++;
            }
            printf("\n");
        }
        printf("----------------------\n");
 
        //-------------------------
        printf("배열에 값 입력\n");
        //-------------------------
        cnt=0;
        for(i=0; i<m_height; i++)
        {
            for(j=0; j<m_width; j++)
            {
                m_InputImage[i*m_width+j] = cnt;
                printf("%d %d %2d\t", i, j, m_InputImage[i*m_width+j]);
                cnt++;
            }
            printf("\n");
        }
        printf("----------------------\n");
 
        //-------------------------
        printf("2중 포인터에 배열값을 입력\n");
        //-------------------------
        cnt=0;
        for(i=0; i<m_height; i++)
        {
            for(j=0; j<m_width; j++)
            {
                m_tempImage[i][j] = m_InputImage[i*m_width+j];
                printf("%d %d %2d\t", i, j, m_tempImage[i][j]);
                cnt++;
            }
            printf("\n");
        }
        printf("----------------------\n");
 
 
        //-------------------------
        printf("테스트 포인터 소멸\n");
        //-------------------------
        delete m_InputImage;
 
        for(i=0; i<m_height; i++)
        {
            delete m_tempImage[i];
        }
        delete m_tempImage;
 
 
    }
 
    void OnBilinear();
 
    int m_height;
    int m_width;
    int m_Re_height;
    int m_Re_width;
    int m_Re_size;
    unsigned char ** m_tempImage;
    unsigned char * m_OutputImage;
    unsigned char * m_InputImage;
};
 
 
 
#if 1
//http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=960481&ref=960481&page=1
void CImageProcessing::OnBilinear()
{
    printf("OnBilinear()\n");
    printf("변수 선언\n");
    int i, j, point, i_H, i_W;
    unsigned char newValue;
    double r_H, r_W, s_H, s_W;
    double C1, C2, C3, C4;
 
    COnBilinearDlg dlg;                         //다이얼로그 생성
    if(dlg.DoModal() == IDOK)                   //띄워진 다이얼로그에서 OK 버튼 클릭한 경우
    {
        printf("초기값 설정\n");
        m_Re_height     = (int)(m_height * dlg.m_BilinearRate);
        m_Re_width      = (int)(m_width * dlg.m_BilinearRate);
        m_Re_size       = m_Re_height * m_Re_width;
        m_InputImage    = new unsigned char [m_height*m_width];
        m_tempImage     = (unsigned char**)Image2DMem(m_height, m_width);
        m_OutputImage   = new unsigned char[m_Re_size];
 
        printf("RGB 값을 입력한다.\n");
        for(i=0; i<m_height; i++)
        {
            for(j=0; j<m_width; j++)
            {
                m_tempImage[i][j] = m_InputImage[i*m_width+j];
                printf("%d %d %2d\t", i, j, m_tempImage[i][j]);
            }
            printf("\n");
        }
        printf("\n");
 
        printf("RGB 값을 입력한다.\n");
        for(i=0; i<m_width; i++)
        {
            for(j=0; j<m_height; j++)
            {
                r_H = (double)i/ (double)dlg.m_BilinearRate;    //현재의 비율을 구한다. 
                r_W = (double)j/(double)dlg.m_BilinearRate;     //현재의 비율을 구한다. 
                i_H = (int)floor(r_H);                          //소수점 이하값을 버린다. 
                i_W = (int)floor(r_W);                          //소수점 이하값을 버린다.
                s_H = r_H - (double)i_H;                        //비율에서의 오차를 제거 한다. 
                s_W = r_W - (double)i_W;                        //비율에서의 오차를 제거 한다. 
 
                //비율에 크기 범위를 지정한다. 
                if(i_H<0 || i_H>=(m_height-1) || i_W<0 || i_W>=(m_width-1) )
                {
                    point = i*m_Re_width+j;                     //배열의 좌표를 구한다. 
                    m_OutputImage[point] = 255;                 //출력값을 255 어두운값으로 변경한다. 
                }
                else
                {
                    C1 = (double)m_tempImage[i_H][i_W];         //이미지위치에서 색상값을 얻는다. 
                    C2 = (double)m_tempImage[i_H][i_W+1];
                    C3 = (double)m_tempImage[i_H+1][i_W+1];
                    C4 = (double)m_tempImage[i_H+1][i_W];
                    newValue = (unsigned char)(C1 * (1-s_H)*(1-s_W) + C2*s_W*(1-s_H) + C3*s_W*s_H+C4*(1-s_W)*s_H);
                    point = i*m_Re_width+j;
                    m_OutputImage[point] = newValue;            //보간된 색상값을 입력한다. 
                }
            }
        }
 
        printf("RGB 값을 출력한다.\n");
        for(i=0; i<m_height; i++)
        {
            for(j=0; j<m_width; j++)
            {
                printf("%d %d %2d\t", i, j, m_OutputImage[i*m_width+j]);
            }
            printf("\n");
        }
        printf("\n");
 
        //-------------------------
        printf("포인터 소멸\n");
        //-------------------------
        delete m_InputImage;
 
        for(i=0; i<m_height; i++)
        {
            delete m_tempImage[i];
        }
        delete m_tempImage;
 
        delete m_OutputImage;
    }
}
#endif
 
 
 
int main(int argc, char** argv) 
{
    CImageProcessing cp;
    cp.OnBilinear();
    printf("\n");
 
    double d;
 
    double ld;
    ld = 10.12345678901234567890;
    printf("%.12f\n", ld);
 
    d = floor(10.3);
    printf("floor(10.3)   %lf\n", d);
 
    d = floor(10.5);
    printf("floor(10.5)   %lf\n", d);
 
    d = floor(10.8);
    printf("floor(10.8)   %lf\n", d);
    printf("\n");
 
    d = floor(11.3);
    printf("floor(11.3)   %lf\n", d);
 
    d = floor(11.5);
    printf("floor(11.5)   %lf\n", d);
 
    d = floor(11.8);
    printf("floor(11.8)   %lf\n", d);
 
	return 0;
}
 
 
#if 0
floor(10.3)   10.000000
floor(10.5)   10.000000
floor(10.8)   10.000000
 
floor(11.3)   11.000000
floor(11.5)   11.000000
floor(11.8)   11.000000
#endif
Forums: 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.