구조체 초기화 관련~

gnoygnas의 이미지

며칠전에 한번 글 올린적이 있는데요...
비트필드 구조체를 한꺼번에 초기화 하기 위해(선언시 말고 사용중에..) 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언어에 미숙해서 질문 드리오니 도움주시면 감사하겠습니다.

wish의 이미지

& 연산자가 붙은 표현은 대입 연산자의 왼쪽에 올 수가 없습니다.

& 연산자는 "메모리 속의 객체"에 대한 주소를 표현합니다. 어떤 데이터를 담는 공간이 아닌 주소값 자체에 무엇인가를 대입할 수는 없겠지요

예를 들어,

int t = 1;
int i;
int *ip

t + 1 = i;
가 말이 안되 듯이,

&t = &t & 0x00
도 말이 안됩니다.

t + 1 와 &t 각각 "t 에 1을 더한 것", "t에 대한 메모리 주소" 를 표현할 뿐이지 어떤 것을 저장할 공간, 즉 객체를 가르키지 않습니다.

혹은,
t 는 lvalue 지만 t+1 이나 &t 는 아니기 때문입니다. 이 문장의 해석이 위의 설명 정도 될 것입니다.

cronex의 이미지

윗분이 말씀하신대로이고...
추가적으로 구조체에는 & 연산을 할 수 없습니다.
따라서 사용하신 방법대로 char형으로 cast해서
사용하시는 방법밖에 없을 것 같습니다.

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

raymundo의 이미지

두 가지 문제가 섞여 있는데요,

첫째,

ptr 에 대응되는게 &tsData 이니, *ptr 에 대응되는 건 &tsData 가 아니라 *(&tsData) 이죠. 결국 이건 tsData인데, 이게 struct이므로 여기에 직접 비트연산을 할수가 없어서, 할 수 없이 tsData의 포인터 -> 그 포인터가 unsigned char 의 포인터라고 뻥을 치고 (캐스트) -> 그 포인터 앞에 *를 붙여서 unsigned char 변수인양 비트 연산을 하는 과정을 거치는 셈이고요.

따라서 굳이 ptr변수를 따로 쓰지 않고 싶다면 아래처럼 하시면 되겠네요.

    *((UCHAR*)&tsData) &= 0x00;

둘째,

tsData가 애초에 비트연산이 가능한 타입이라 하더라도, &tsData 는 "tsData 변수의 주소"이니까, 이건 rvalue 즉 어떤 값이지 변수가 아닙니다. tsData의 메모리에서 주소가 예를 들어 100이라면

&tsData &= 0x00             // 이건 아래처럼 풀어쓸 수 있고
&tsData = &tsData & 0x00    // 이건 결국 아래처럼 계산되니
100 = 100 & 0x100           // 말이 안 되는 식

좌변에는 변수, lvalue가 와야죠. :-)

좋은 하루 되세요!

raymundo의 이미지

아니 댓글이 하나도 없을 때 쓰기 시작했는데...

올리고 나니 그 새 다른 분들이 답을 주셔서 뒷북이 되어 버렸군요 OTL

좋은 하루 되세요!

cronex의 이미지

종합적으로 잘 분석해주셨는걸요 ^^
수고하셨습니다. ^^

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

gnoygnas의 이미지

아직 갈길이 먼 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!

gnoygnas의 이미지

비트 필드마다 여러 고유의 이름이 있어서 #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!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.