2011-11-22 3 views
0

내장 된 AVR 클럭에서 프로그램의 모듈 시작 부분으로 호출되는 다음 함수가 있습니다. date_time 구조체를 반환하고 힙에서 할당하고있는 공간에 복사 할 clock 객체의 값을 가져 오려고합니다.malloc과 void 포인터를 사용하여 임시 구조를 복사하십시오.

void time_set_mode_start(Display *display, volatile Controls *controls, 
         volatile TimeKeeper *clock, void *data) { 

    DEBUG_LED_PORT |= _BV(DEBUG_LED); 
    data = malloc(sizeof(date_time)); 
} 

데이터 포인터로 시계 -에서 반환 된 값> 다음 getTime()을 데이터를 얻을 수있는 가장 좋은 방법은 무엇입니까?

+2

[충분한 정보가 없습니다] (http://tinyurl.com/so-hints). [샘플 코드] (http://sscce.org/)는 완전하고 간결해야합니다. 'TimeKeeper :: getTime'의 인터페이스 스펙은 무엇입니까? – outis

답변

4

한 가지 방법은 memcpy을 사용하는 것입니다. 특히 memcpy(data, clock->getTime(), sizeof(date_time))을 원할 것입니다.

*((date_time*)data) = *(clock->getTime()); 

이것은 date_time *data을 취급하고 가리키는하는 date_time 객체에 값을 할당합니다

또 다른 방법 — 아마 더 나은, 지금은 그것을 —는 일반 할당을 사용하는 것입니다 대해 생각.

(참고 : 위의 코드 조각의 모두, 내가 clock->getTime()date_time *을 반환 있으리라 믿고있어 올바른 것입니다.?) 그런데

, 나는 data = malloc(sizeof(date_time)); 완전히 원본을 대체 할 것이라는 점을 지적해야 void * data이 전달되었습니다. data이 가리키는 메모리 위치가 호출자에게 표시되지 않습니다. 포인터가 값으로 전달되기 때문입니다.

+0

이 경우 포인터를 반환하려면 getTime()을 수정해야합니다. 실제로는? 나는 임시 구조를 만들고 memcpy에 주소를 전달함으로써 비슷한 것을 시도했다. 내가 가진 모든 것은 가비지 데이터 였고 나는 segfault를 얻었지만이 임베디드 시스템에서 말할 수는 없다고 믿습니다. – secretformula

+0

@secretformula : 질문을 게시하면서 완전히 답변을 다시 쓰고있었습니다. 내가 원래 썼던 것은 꽤 쉬웠다. 미안. – ruakh

+0

고맙습니다. 작동 할 것 같습니다. 나는'date_time *'을 반환하는 별도의 메소드를 생성 할 것이다. 나는 거기에있는 것을 완전히 대체하려고합니다. 그것은 다른 모듈의 종료 메소드에 의해 해제 될 것입니다. 내가 할 수있을 때 4 분 안에 받아 들일 것이다 – secretformula

0

호출 코드가 값의 공간을 할당하고이를 data 매개 변수로 표시된 함수로 전달해야하거나 함수 프로토 타입이이 값을 다시 전달할 수 있도록 void **data이어야합니다. 코드는 새로 할당 된 값으로 data의 로컬 복사본을 덮어 씁니다. 그러면 값이 반환되고 메모리가 누수됩니다.

date_time TimeKeeper::getTime()의 프로토 타입을 가정 : 프로토 타입이 date_time *TimeKeeper::getTime()입니다

void time_set_mode_start(Display *display, volatile Controls *controls, 
         volatile TimeKeeper *clock, void **pdata) 
{ 
    DEBUG_LED_PORT |= _BV(DEBUG_LED); 
    *data = malloc(sizeof(date_time)); 
    *(date_time *)(*data) = clock->getTime(); 
} 

경우, 할당은 다음과 같습니다

*(date_time *)(*data) = *clock->getTime(); 

는 뭔가 다른 경우, 당신은 우리에게 얘기를해야합니다.

관련 문제