|
vEditInterval->Text는 프로퍼티로서 여기서 데이타를 취하려하면
새로 배정된 메모리에 있는 사본에 대한 값을 줍니다.
그러므로
char *Data = vEditInterval->Text.c_str();
Data에는 사본 데이타 번지가 받아 집니다.
int length = StrLen(vEditInterval->Text.c_str());
다시 프로퍼티를 제어하므로, 이때 Data가 가르키는 이전 사본은 폐기됩니다.
그러므로 Data[x] 를 제어하려고 하면 엉뚱한 데이타가 걸리는 것입니다.
물론 새로 메모리 할당/해제가 없는 경우는 사본을 폐기해도 그 내용까지 메모리에서
지우진 않기 때문에 마치 진짜처럼 읽을 가능성도 있지만, 이는 버그 프로그램 만드는 좋은 방법일 뿐입니다.
스트링 클래스와 프로퍼티 특성상 그렇게 처리할 수 밖에 없으니
프로퍼티에서 직접 String 번지를 받는 방법은 절대 사용하면 안됩니다.
위처럼 사용하기도 전에 폐기 됩니다.
민간돼지 님이 쓰신 글 :
: 아래와 같이 실행하면 Data값이 제대로 나오는데요
: //////////////////////////////////////////////////////////////////
: AnsiString TESTData;
: TESTData = vEditInterval->Text;
: char *Data = TESTData.c_str();
:
: int length = StrLen(vEditInterval->Text.c_str());
:
: for(int i= 0; i<length; i++)
: { -
: if(!('0'<=Data[i]&&Data[i]<='9'))
: {
: MessageDlg("숫자만 입력하세요", mtWarning, TMsgDlgButtons() << mbOK, 0);
: return;
: }
: }
: //////////////////////////////////////////////////////////////////
: 아래와 같이 실행하면 Data값이 이상하게 나오는데 차이를 모르겠습니다.
: /////////////////////////////////////////////////////////////////
:
: char *Data = vEditInterval->Text.c_str();
:
: int length = StrLen(vEditInterval->Text.c_str());
:
: for(int i= 0; i<length; i++)
: { -
: if(!('0'<=Data[i]&&Data[i]<='9'))
: {
: MessageDlg("숫자만 입력하세요", mtWarning, TMsgDlgButtons() << mbOK, 0);
: return;
: }
: }
: /////////////////////////////////////////////////////////////////////////////////////////////////////
: AnsiString TESTData; //
: TESTData = vEditInterval->Text; // char *Data = vEditInterval->Text.c_str();
: char *Data = TESTData.c_str(); //
: ////////////////////////////////////////////////////////////////////////////////////////////////////
: 초보적인 질문이지만 비교 부탁드리겠습니다. 너무 궁금해서요
|