[완료]enum ~ 열거형 변수 질문입니다.

anaud2의 이미지

지금 맡고 있는 프로젝트에서
구조체가 선언이 되어 있구 그 구조체에 값을 할당해서 전송만 하면되는 아주 간단한 업무 입니다.
그런데 LINUX UNIX 다 끝내고 WINDOW 로 포팅을 하는데 구조체에 변수 할당에서 에러가 떨어집니다.
==============================================================================
typedef enum otp_pwe_t {
PWE_PAP = 1,
PWE_CHAP = 3,
PWE_MSCHAP = 5,
PWE_MSCHAP2 = 7,
} otp_pwe_t;

typedef struct otp_request_t {
int version; /* 2 */
char username[32 + 1];
char challenge[17 + 1]; /* USER challenge */
char service_type; // enum service type
struct {
otp_pwe_t pwe;

} pwe;
} otp_request_t;

===================================================
구조체의 형태 입니다.
저 구조체에 값을 할당하는 부분입니다.
============================================
otp_request_t request;

request.version = 2;
strcpy(request.username, ID);
request.service_type = '9';
request.pwe.pwe = 1;
strcpy(request.pwe.u.pap.passcode, PC);

=======선배가만듬 전 분석================
========================================
그런데 문제는
request.pwe.pwe = 1; 이부분입니다.
리눅스와 유닉스에선 멀쩡했었는데 에러가 떨어지네요
cannot convert from 'const int' to 'enum otp_pwe_t'
제 짧은 영어로봐서 열거형 변수에 int값을 넣어서 에러다 인거 같은데
제가 아는 열거형도
enum a{aa=1}
enum a b
printf("%d",b.aa)
화면| 1 |
이렇게 aa는 1이다 이런식의 변수처럼 되는걸로 아는데
구조체안의 구조체안에 열거형 변수에 값을 넣어준다? 이건 좀 이해가 안되네요
분석이라 물어볼수도 없어서 여기에 글을 남김니다. 부탁드려요 왜저렇게 쓰는지 윈도우에서는 어케해야되는지좀
갈쳐주세요~

klara의 이미지

enum도 하나의 새로운 자료형을 정의하는 것이나 다름없습니다.
다만 int와 그 값이 호환가능한 것이죠.
그렇기 때문에, enum으로 선언된 변수에 (비록 실제 값은 같일지라도) 다른 형인 int를 직접 대입할 순 없습니다.
C++같은 경우는 바로 에러 나는데, C에서는 어떤지 모르겠네요.
이경우에는 가장 적합한 방법은 swith나 if-else를 이용해서 int값에 해당하는 enum 변수를 찾아서 대입하는 방법입니다.
하지만 이건 꽤 번거로울수 있기 떄문에 그냥 바로 int에서 enum형으로(이경우는 otp_pwe_t로) 캐스팅 해서 대입할 수 있습니다.
다만 이경우는 enum에 선언되지 않은 값이 입력될 가능성이 있기 때문에, 논리적으로 생각해서 이 int값은 형변환을 그대로 해도 유효한 값이라는 것을 보장할 수 있거나, 혹은 입력 받는 쪽에서 예상치 못한 값이 들어왔을때 예외처리를 해주는 등 신경써주어야 할 부분이 생길수 있습니다.
가급적이면 int인 1대신에, 실제로 의미를 가지고 있는 otp_pwe_t의 PWE_PAP를 대입하는게, 의미상으로도 훨씬 적합할 것입니다.
그리고 함수에서 값을 주고 받을 때도, int로 주고 받지 말고, otp_pwe_t로 값을 주고 받아야겠지요.
그렇지 않으면, 결국 enum선언을 했을때 얻을 수 있는 것을 버리고, #define으로 정의한 상수와 다를바가 없어집니다.
지금까지 사용하신 컴파일러에선 아마 자동으로 형변환을 해주었던걸, 새로 사용하신 컴파일러에선 형변환 해주지 않고 에러를 출력하도록 만들어져있는 듯합니다.

kaeri17의 이미지

캐스팅 시키면 됩니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.