구조체 초기화 관련~
며칠전에 한번 글 올린적이 있는데요...
비트필드 구조체를 한꺼번에 초기화 하기 위해(선언시 말고 사용중에..) memset이나 bzero 함수를 사용하지 않고
포인터를 연결하는 방법을 사용해서 해결은 했습니다.
궁금한 점이 있는데...
////////////////////////////////////////////////////////////////
typedef unsigned char UCHAR;
struct BitField
{
UCHAR bit0: 1;
UCHAR bit1: 1;
UCHAR bit2: 1;
UCHAR bit3: 1;
UCHAR bit4: 1;
UCHAR bit5: 1;
UCHAR bit6: 1;
UCHAR bit7: 1;
};
struct BitField tsData={1,1,0,0,0,0,0,0};
void main(void)
{
UCHAR* ptr=NULL;
// 1번 방법)이렇게 하면 목적했던 바와 같이 비트 필드가 모두 0으로 초기화 됩니다.
ptr=(UCHAR*)&tsData;
*ptr &= 0x00;
// 2번 방법)구지 포인터를 사용하지 않고 struct의 주소에다 똑같이 0x00으로 &연산하면
// 왜 에러가 발생하는지 궁금합니다.
&tsData &=0x00;
}
아직 C언어에 미숙해서 질문 드리오니 도움주시면 감사하겠습니다.
& 연산자가 붙은
& 연산자가 붙은 표현은 대입 연산자의 왼쪽에 올 수가 없습니다.
& 연산자는 "메모리 속의 객체"에 대한 주소를 표현합니다. 어떤 데이터를 담는 공간이 아닌 주소값 자체에 무엇인가를 대입할 수는 없겠지요
예를 들어,
int t = 1;
int i;
int *ip
t + 1 = i;
가 말이 안되 듯이,
&t = &t & 0x00
도 말이 안됩니다.
t + 1 와 &t 각각 "t 에 1을 더한 것", "t에 대한 메모리 주소" 를 표현할 뿐이지 어떤 것을 저장할 공간, 즉 객체를 가르키지 않습니다.
혹은,
t 는 lvalue 지만 t+1 이나 &t 는 아니기 때문입니다. 이 문장의 해석이 위의 설명 정도 될 것입니다.
윗분이
윗분이 말씀하신대로이고...
추가적으로 구조체에는 & 연산을 할 수 없습니다.
따라서 사용하신 방법대로 char형으로 cast해서
사용하시는 방법밖에 없을 것 같습니다.
------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!
------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!
두 가지 문제가 섞여
두 가지 문제가 섞여 있는데요,
첫째,
ptr 에 대응되는게 &tsData 이니, *ptr 에 대응되는 건 &tsData 가 아니라 *(&tsData) 이죠. 결국 이건 tsData인데, 이게 struct이므로 여기에 직접 비트연산을 할수가 없어서, 할 수 없이 tsData의 포인터 -> 그 포인터가 unsigned char 의 포인터라고 뻥을 치고 (캐스트) -> 그 포인터 앞에 *를 붙여서 unsigned char 변수인양 비트 연산을 하는 과정을 거치는 셈이고요.
따라서 굳이 ptr변수를 따로 쓰지 않고 싶다면 아래처럼 하시면 되겠네요.
둘째,
tsData가 애초에 비트연산이 가능한 타입이라 하더라도, &tsData 는 "tsData 변수의 주소"이니까, 이건 rvalue 즉 어떤 값이지 변수가 아닙니다. tsData의 메모리에서 주소가 예를 들어 100이라면
좌변에는 변수, lvalue가 와야죠. :-)
좋은 하루 되세요!
아니 댓글이 하나도
아니 댓글이 하나도 없을 때 쓰기 시작했는데...
올리고 나니 그 새 다른 분들이 답을 주셔서 뒷북이 되어 버렸군요 OTL
좋은 하루 되세요!
종합적으로 잘
종합적으로 잘 분석해주셨는걸요 ^^
수고하셨습니다. ^^
------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!
------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!
명쾌한 답변 감사드립니다...
아직 갈길이 먼 C언어 유저입니다.....
답변해 주신 분들께 감사의 말씀 드리며 오늘도 행복한 하루 되세요....^^;
One must, In fact, Love your pursuit
My home is below...Well, just go own your gait!
One must, In fact, Love your pursuit
My home is below...Well, just go own your gait!
한가지더~~
비트 필드마다 여러 고유의 이름이 있어서 #define 문으로 설정을 해 주었는데,
#define FAER tsData.bit0
#define FCER tsData.bit1
....
#define FGER tsData.bit7
이렇게 할경우 FAER의 이름으로 읽기는 가능하지만, 쓰기 (0 or 1)에 문제가 있더군요...
뭐 좋은 방법 없을까요? 구지 #define문으로 정의하지 않고도, FAER 이라는 이름으로 접근하여 변경할 수 있으면 됩니다...^^;
One must, In fact, Love your pursuit
My home is below...Well, just go own your gait!
댓글 달기