|
class name이 ButtonClick에서 보면 선언한것이랑 틀리네요?
일단 TBUFF로 바꿔서 해보면..
1. 문제원인
a.sprintf("%s",p[0]); ==> 이부분에서 에러가 나네요
원인은 sprint 에서 Format에 %s 로 string을 copy하도록 되어있는데 char *가 오지않고 1Byte값이 와서 그렇네요
만약 format 에 %s대신 %d나 다른것을 쓴다면 문제없을거예요 예 ) a.sprintf("%d",p[0]);
해결은 a.sprintf("%s",&p[0]); 또는 a.sprintf("%s",p); 이렇게 쓰면 됩니다.
2. 그리고 ButtonClick에서 new 를 한후 delete가 없네요
=> 메모리가 셀수 밖에 없겠죠
3. 그리고 또 만드신 TBUFF::c_str() 함수에서 char *반환이니까
그냥 return Buff; 또는 return &Buff[0]; 만으로 되겠네요
TBUFF *bp;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(bp==NULL)
{ bp=new TBUFF;
bp->InitBuff();
}
bp->AddString("11111");
bp->AddString("22222");
unsigned char *p=bp->c_str();
String a;
a.sprintf("%s",&p[0]);
//a.sprintf("%s",p[0]); ==> 에러가 남..
Memo1->Lines->Add(a);
a.sprintf("%d",p[0]);
Memo1->Lines->Add(a);
}
//---------------------------------------------------------------------------
unsigned char * __fastcall TBUFF::c_str(){
return Buff; //또는 return &Buff[0];
}
//---------------------------------------------------------------------------
doolrifeel 님이 쓰신 글 :
: 일단 소스를 보시고.....
:
: ========== 헤더 =============
: #define MAX_DATA_SIZE 4096
: class TBUFF{
: public:
: unsigned int size;
: unsigned char Buff[MAX_DATA_SIZE];
: void __fastcall InitBuff();
: unsigned int __fastcall Size();
: unsigned char * __fastcall c_str();
: void __fastcall AddString(unsigned char *add);
:
: };
:
: ============== 소스 ================
: void __fastcall TBUFF::InitBuff(){ // 초기화
: this->size = 0;
: memset(&this->Buff,0,MAX_DATA_SIZE);
: }
:
: unsigned char * __fastcall TBUFF::c_str(){
: unsigned char *p=this->Buff;
: return p;
:
: }
:
: unsigned int __fastcall TBUFF::Size(){ // 크기 리턴
: return this->size;
: }
:
: void __fastcall TBUFF::AddString(unsigned char *add){
: memcpy(&this->Buff[this->size],add,strlen(add));
: this->Buff[this->size+strlen(add)]=0x00; // 추가한뒤 끝에 0x00 을 붙힘
: this->size =this->size+strlen(add)+1; // 크기 계산
: }
:
: =========== 사용 ============
: void __fastcall Board::Button5Click(TObject *Sender){
: TSocketBuff *bp=new TSocketBuff;
: bp->InitBuff();
: bp->AddString("11111");
: bp->AddString("22222");
: unsigned char *p=bp->c_str();
: String a;
: a.sprintf("%s",p[0]);
: Memo1->Lines->Add(a);
: }
:
: 폼에 메모장이랑 버튼 올려 놓고 시험한건데요..
: 엑세스 바이레션 인가;; 하는 오류가 납니다.
: 그리고 제가 알고 싶은거는 String 의 c_str 함수 처럼
: 포인터로 리턴해주게 만들고 싶은데요... 제게 맞는 방법인지;; 제가 초보라서
: 더 좋은 방법이 있으면 조언 부탁 드립니다.
|