|
간략하게 설명드리면.. 함수에서 넘겨준 인자의 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인자만 받아 실행하면 잘 되는 것으로 보아 포인터 인자 선언에 문제가 있습니다. 하지만 여러 이미지 저장을 위해 이 포인터가 인자로 꼭 들어가야 합니다. 묘수가 없을까요? 꼭 좀 도와주세요. 아휴~
:
|