구조체를 C의 구조체로 복사
동일한 구조체를 다른 구조체에 복사하고 나중에 첫 번째 구조체와 비교하여 사용하고 싶습니다. 문제는 내가 이렇게 할 때 내 컴파일러가 나에게 경고를 준다는 것입니다! 다른 방법으로해야합니까 아니면 잘못하고 있습니까?
헤더 파일에서 :
extern struct RTCclk
{
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t mday;
uint8_t month;
uint8_t year;
}
RTCclk;
C 파일에서 :
struct RTCclk RTCclk;
struct RTCclk RTCclkBuffert;
void FunctionDO(void)
{
... // Some Code
/* Copy first struct values into the second one */
memcpy(&RTCclk, &RTCclkBuffert, sizeof RTCclk);
}
간단한 구조의 경우 사용하는 memcpy
것처럼 사용 하거나 하나에서 다른 것으로 할당 할 수 있습니다 .
RTCclk = RTCclkBuffert;
컴파일러는 구조를 복사하는 코드를 생성합니다.
복사에 대한 중요한 참고 사항 : memcpy
. 즉, 예를 들어 포인터를 포함하는 구조가있는 경우 복사 될 실제 포인터 일뿐 그들이 가리키는 것이 아니므로 복사 후에는 동일한 메모리를 가리키는 두 개의 포인터를 갖게됩니다.
귀하의 코드가 정확합니다. 하나를 다른 하나에 직접 할당 할 수도 있습니다 ( Joachim Pileborg의 답변 참조 ).
나중에 두 구조체를 비교할 때는 memcmp
; 을 사용하는 대신 한 번에 한 멤버 씩 구조체를 비교해야합니다 . C에서 구조체를 어떻게 비교합니까?를 참조하십시오 .
c에서 구조를 복사하려면 다음과 같이 값을 할당하면됩니다.
struct RTCclk RTCclk1;
struct RTCclk RTCclkBuffert;
RTCclk1.second=3;
RTCclk1.minute=4;
RTCclk1.hour=5;
RTCclkBuffert=RTCclk1;
이제 RTCclkBuffert.hour 값은 5가됩니다.
RTCclkBuffert.minute 값은 4입니다.
RTCclkBuffert.second의 값은 3입니다.
귀하의 memcpy
코드가 정확합니다.
내 생각 엔 당신은 string.h의 포함이 부족합니다. 따라서 컴파일러는의 잘못된 프로토 타입을 가정 memcpy
하므로 경고가 발생합니다.
어쨌든 단순성을 위해 구조체를 할당해야합니다 (Joachim Pileborg가 지적했듯이).
또한 좋은 예 .....
struct point{int x,y;};
typedef struct point point_t;
typedef struct
{
struct point ne,se,sw,nw;
}rect_t;
rect_t temp;
int main()
{
//rotate
RotateRect(&temp);
return 0;
}
void RotateRect(rect_t *givenRect)
{
point_t temp_point;
/*Copy struct data from struct to struct within a struct*/
temp_point = givenRect->sw;
givenRect->sw = givenRect->se;
givenRect->se = givenRect->ne;
givenRect->ne = givenRect->nw;
givenRect->nw = temp_point;
}
memcpy는 처음 두 인수가 void * 일 것으로 예상합니다.
시험: memcpy( (void*)&RTCclk, (void*)&RTCclkBuffert, sizeof(RTCclk) );
PS는 필요하지 않지만 관례에 따라 sizeof 연산자의 대괄호가 지정됩니다. C에서 코드를 유지 관리 할 수 없게 만드는 많은 것을 피할 수 있으므로 다음 규칙을 따르는 것이 좋은 (고용 가능한) C 프로그래머의 표시입니다.
경고를 제거하려면 포인터를 (void *)로 캐스팅해야한다고 생각합니다.
memcpy((void *)&RTCclk, (void *)&RTCclkBuffert, sizeof RTCclk);
또한 대괄호없이 sizeof를 사용하면 변수와 함께 사용할 수 있지만 RTCclk가 배열로 정의 된 경우 sizeof of는 배열의 전체 크기를 반환합니다. sizeof with type을 사용하는 경우 대괄호와 함께 사용해야합니다.
sizeof(struct RTCclk)
참고 URL : https://stackoverflow.com/questions/9127246/copy-struct-to-struct-in-c
'developer tip' 카테고리의 다른 글
Vim의 자동 완성은 매우 느립니다. (0) | 2020.12.03 |
---|---|
두 목록의 효율적인 교차 (0) | 2020.12.03 |
C # 열거 형에 값 포함 (0) | 2020.12.03 |
WPF의 DataGridColumn에 대한 바인딩 가시성 (0) | 2020.12.03 |
Swift Dictionary에 nil 값을 추가하는 방법은 무엇입니까? (0) | 2020.12.03 |