C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[18727] Re:다시한 번.. 포인터 함수 인자 쓰는 법좀 가르쳐 주세요 이번 경우는 좀 복잡해서리..
유영인 [Chris] [cuperido] 875 읽음    2002-05-22 10:31
간략하게 설명드리면.. 함수에서 넘겨준 인자의 InputArray가 포인터 주소가 되어야 다른 함수안에서 직접 억세스가 가능할텐데요, 그것이 아닌 하나의 값과 동일한 형식으로 넘어갔기 때문에, 다른 함수에서 처리가 끝나면 값이 사라지는 것입니다.


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int **InputData;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}

//---------------------------------------------------------------------------

int MAX(int Value)
{

Value = 4;

return(1);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

int   Value  = 5;

MAX(Value);
ShowMessage(Value);

}
//---------------------------------------------------------------------------


위의 소스에서 Value 가 5인 상태로 넘어가서, MAX에서 4로 바꿨음에도 불구하고 ShowMessage 에서는 5라고 찍힙니다. 당연한 결과겠죠? MAX안의 Value와, Button1Click의 Value는 완전 다른 값이니깐요. 이렇게 변수를 이용하실때는 눈에 쉽게 보이지만, 포인터를 이용했을 경우에는 눈에 쉽게 보이지 않는 경우가 많습니다.

지금 값이 초기화 되지 않는 것도 똑같은 원리입니다. **InputArray 를 이용하시는 것이 목적이시라면, 아래와 같이 직접 return 을 이용해서 처리하시는것이 가장 쉬운 방법 같습니다.


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int **InputData;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}

//---------------------------------------------------------------------------

int **InitInputArray(int Size)
{

int               itCount, itX, itY;


InputData = new int*[Size];

for(itCount = 0; itCount < Size; itCount++)
   InputData[itCount] = new int[Size];

for(itY = 0; itY < Size; itY ++) {
   for(itX = 0; itX < Size; itX ++)
     InputData[itY][itX] = 0;
}


return InputData;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

InputData = InitInputArray(5);
ShowMessage(InputData[0][0]);

}
//---------------------------------------------------------------------------


빌더매니아 님이 쓰신 글 :
: 지난 번 정성껏 답변 해 주셔서 많이 감사합니다.
: 하지만 제가 의도 했던 것이 아니어서 T.T
: 코드의 의도는 다양한 pixel*pixel의 이미지 저장을 위한 배열을 포기화하고 저장하는 것입니다.
: 코드는 다음과 같습니다.
:
: //2차원 배열을 가르키는 포인터의 포인터 선언
: int **InputData;
:
: //함수 실행부분
: InitInputArray(InputData, PixelSize);
:
: //함수 구현부분
: void InitInputArray(int **InputData, int Size)
: {
:   InputData = (int**)new int*[Size];
:   for (int a=0; a<Size; a++)
:      InputData[a] = (int*)new int[Size];
:   
:   for (int i=0; i<Size; i++)
:       {
:          for (int j=0; j<Size; j++)
:               InputData[i][j]=0;
:       }
: }
:
: InputData를 함수인자에서 빼서 전역변수로 하고 Size인자만 받아 실행하면 잘 되는 것으로 보아 포인터 인자 선언에 문제가 있습니다. 하지만 여러 이미지 저장을 위해 이 포인터가 인자로 꼭 들어가야 합니다. 묘수가 없을까요? 꼭 좀 도와주세요. 아휴~
:

+ -

관련 글 리스트
18725 다시한 번.. 포인터 함수 인자 쓰는 법좀 가르쳐 주세요 이번 경우는 좀 복잡해서리.. 빌더매니아 1017 2002/05/22
18727     Re:다시한 번.. 포인터 함수 인자 쓰는 법좀 가르쳐 주세요 이번 경우는 좀 복잡해서리.. 유영인 [Chris] 875 2002/05/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.