2013-03-22 3 views
2

Qt Creator를 사용하여 응용 프로그램을 개발하고 있습니다.C++ : 구조체 배열 복사 및 구조체 배열 반환

나는 좋은 C++ 프로그래머가 아니다, 그래서 구조의 배열을 복사하고 구조를 반환하는 동안이 문제에 직면하고있다

등 개념적인 오류가있을 수 있습니다.

유사한 제목과 관련하여 충분한 해결책이 있지만 문제를 해결할 수 없습니다. 위의 코드는 내가 구조의 배열에 대해 수행 한 구현을 보여줍니다

ABC.h

typedef struct command_packet_struct 
{ 
    QString ItemDataName; 
    DATA_TYPE ItemDataType; 
    int ItemDataLength; 
} COMMAND_PACKET_STRUCT; 

class ABC 
{ 
private: 

    COMMAND_PACKET_STRUCT* getHeaderTitle(int index); 
    COMMAND_PACKET_STRUCT *_packetStruct ; 
}; 

ABC.cpp

COMMAND_PACKET_STRUCT _OA_Packet [] = { 
    {"ERROR\nMAIN CODE" ,  DATA_TYPE_NUM,   5 }, 
    {"ERROR\nSUB CODE" ,  DATA_TYPE_NUM,   4 }, 
    {"SCALE VERSION" ,  DATA_TYPE_ASCII,  8 }, 
    {"E-PRE VERSION" ,  DATA_TYPE_ASCII,  8 } 
}; 

COMMAND_PACKET_STRUCT* PCU_SIM_ORDER_TASK::getHeaderTitle(int index) 
{ 
    int maxSize; 

    if (_packetStruct != NULL) 
    { 
     _packetStruct = 0; 
    } 

    _packetStruct = new COMMAND_PACKET_STRUCT(*_OA_Packet); 
    maxSize = ((sizeof(_OA_Packet)/sizeof(COMMAND_PACKET_STRUCT)) - 1); 
    memcpy(_packetStruct, _OA_Packet, maxSize) ; 

    qDebug() << sizeof(COMMAND_PACKET_STRUCT);  // return 12 
    qDebug() << sizeof(_packetStruct);    // return 4 
    qDebug() << sizeof(_OA_Packet);     // return 48 

    return _packetStruct; 
} 

:

여기 내 코드입니다.

나는

  _OA_Packet 

  _packetStruct 

에 구조의 배열을 복사해야하지만 난 _packetStruct의 크기를 얻을 때, 그것은 4을 제공하면서 의 크기 _OA_Packet

시도는 구조의 내용을 표시 할 때

는 따라서, "분할 오류 오류"

모든 아이디어, 제안에 반환 ??

+2

는'_packetStruct'는 포인터입니다. 'sizeof'는 포인터가 가리키는 메모리의 크기가 아닌 포인터의 크기를 제공합니다. 포인터는 'new'를 사용하여 할당 한 충분한 메모리 위치를 가리 킵니다. 또한 클래스에'memcpy'를 사용해서는 안됩니다. 클래스 대신 복사 할당 연산자'='를 오버로드해야합니다. –

+0

@ Alok, 답장을 보내 주셔서 감사합니다. 처음에는 할당 연산자를 사용해 보았지만 오류는 동일했습니다. 그래서 나는이 개념으로 옮겼다.힌트/예를 들어 주시겠습니까? 내 경우에 뭔가 잘못했을 수도 있니? – skg

+1

몇 가지 사항을 고려해야합니다 (문제와 직접적인 관련이 없음). 1) 대문자는 일반적으로 매크로에 사용되므로 형식에 사용하지 않으려 고합니다 (코드를 읽는 다른 사람들에게 혼란 스러울 수 있음). 2)'typedef struct ... '는 C에서는 유용하지만 C++에서는 불필요합니다. 'struct COMMAND_PACKET_STRUCT {...};'도 똑같이 작동합니다. 3)'memcpy'를 안전하고 쉽게'std :: copy'로 바꾸십시오. 4) 메모리 누수를 피하기 위해 스마트 포인터를 조사하십시오. – Grizzly

답변

1
  1. 귀하의 구조체 COMMAND_PACKET_STRUCT은 C++에서 다음과 같이 정의되어야한다

    struct COMMAND_PACKET_STRUCT 
    { 
    QString ItemDataName; 
    DATA_TYPE ItemDataType; 
    int ItemDataLength; 
    }; 
    
  2. 공간을 할당하는 기본 생성자를 사용합니다.

    maxSize = ((sizeof(_OA_Packet)/sizeof(COMMAND_PACKET_STRUCT))); 
    _packetStruct = new COMMAND_PACKET_STRUCT[maxSize]; 
    
  3. 내용을 복사하십시오.

    std::copy(_OA_Packet,_OA_Packet+maxSize,_packetStruct); 
    
  4. _packetStruct가 포인터 인 경우 포인터가 가리키는 데이터 크기를 확인하고 싶을 것입니다.

    qDebug() << sizeof(*_packetStruct);    // return 4 -->will be 12 
    
+0

답장을 보내 주셔서 감사합니다. "_OA_Packet"에 저장된 구조의 전체 배열을 복사해야합니다. 그래서 "sizeof (_packetStruct)"-> 48 (sizeof (_OA_Packet))을 반환해야합니다. 위 코드는 [index]에 구조를 복사합니다. pls 내가 잘못하면 실례합니다. 하지만 "_OA_Packet"에 저장된 구조체 배열을 "_packetStruct"에 복사 한 다음이 배열 구조체를 함수에서 반환해야합니다. – skg

+0

안녕하세요, skg, _OA_Packet의 모든 내용을 _packetStruct에 복사하도록 코드를 업데이트했습니다. 당신은 또한 [] packetStruct 삭제 메모를해야합니다, 그렇지 않으면 메모리 누수 – JiuDong

+0

편집 주셔서 감사합니다. 질문이 하나 있습니다. sizeof (* _ packetStruct) -> 12. "_packetStruct"에서 "_OA_Packet"의 크기를 가져 오는 방법. (즉, _packetStruct는 48 (_OA_Packet의 크기)를 제공해야합니다). Sizeof _OA_Packet이 필요합니다. 구조체의 반환 배열을 매개 변수로 전달하는 함수에서 구조체의 배열에서 값을 검색해야하기 때문입니다. 그렇게하기 위해서, 나는 구조의 배열의 실제 크기를 알아야합니다. 동일한 제안을 보내주십시오. 나는 너의 제안에 정말로 감사한다. – skg