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
[48002] Re:클레스를 만들려구 하는데요... 오류가 나서 질문 드립니다.
장성호 [nasilso] 879 읽음    2007-02-07 08:46
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 함수 처럼
: 포인터로 리턴해주게 만들고 싶은데요... 제게 맞는 방법인지;; 제가 초보라서
: 더 좋은 방법이 있으면 조언 부탁 드립니다.

+ -

관련 글 리스트
48001 클레스를 만들려구 하는데요... 오류가 나서 질문 드립니다. doolrifeel 879 2007/02/07
48002     Re:클레스를 만들려구 하는데요... 오류가 나서 질문 드립니다. 장성호 879 2007/02/07
48020         Re:Re:정말 감사 합니다 (내용무) doolrifeel 814 2007/02/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.