전처리기 enum 사용법 도움 요청합니다.

pstokyo의 이미지

우선 읽어 주셔서 감사드립니다.아래에 같이 정의 되어 있구요.
enum pxi6259_channel {
AI0 = 100,
AI1 = 1100,
AI2,
AI3,
AI4,
AI5,
AI6,
AI7= 2000,
AI8,
AI9,
AI10,
AI11,
AI12,
AI13,
AI14,
AI15,
AI16,
AI17,
AI18,
AI19,
AI20,
AI21,
AI22,
AI23,
AI24,
AI25,
AI26,
AI27,
AI28,
AI29,
AI30,
AI31
};

이 값들을 loop 문 돌려서 읽고 전부다 읽고 싶은데 잘 안되네요.(AI0~AI31까지요)

pxi6259_channel AI;

for (i = 0; i < 32; i ++)
{

printf("##Chanlel %d #\n", AI(i)); <-- 이렇게 하니깐 물론 안되더라구요.

}

어떻게 해야 값을 다 읽어 올수 있을까요? 조언 부탁드립니다.. 꾸벅

erla의 이미지

우선 enum에 대해 아는것이 별로없어서 구글링을햇습니다 하하.

http://bytes.com/topic/c/answers/449314-loop-over-enum-values

음. 여길보면 어떤 사람이 답변단것중에
enum밸류를 미니멈과 맥시멈 값을 미리 지정해놓은다음
for loop을 사용한다고 써있네요

enum E { MIN, A=MIN, B, C, D, MAX=D };
이렇게 지정을하고

for( E e=MIN; e <= MAX; e = E( e+1 ) ) {...}

룹을 이렇게 쓰면
enum값이 더해지거나 빠지는 변화가있어도
for loop이 바뀌지않는다고하네요.

printf("##Chanlel %d #\n", AI(i));

저렇게하면 AI(i) 대신에 그냥 e를 넣어도 될듯 ㅎㅎ

확실하진않습니다!
헤헤
제능력한의답이에요.

==============
게으르고 생각많은.
누추한 한량 erla.입니다.

==============
게으르고 생각많은.
누추한 한량 erla.입니다.

mithrandir의 이미지

따로 파서를 만들지 않는한, 불가능합니다.
lisp같은 메타프로그래밍을 지원하는 언어라면 몰라도, C에선 안됩니다.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

erla의 이미지

그럼 enum은 원래 프린팅이 안되는건가요?
enum 엘레먼트를 프린팅 하기위해서 파서가 필요하다는거겠죠?

==============
게으르고 생각많은.
누추한 한량 erla.입니다.

==============
게으르고 생각많은.
누추한 한량 erla.입니다.

mithrandir의 이미지

컴파일중에 enum이 처리 되는 시점은
define이 처리되는 시점과 대충 비슷하다고 보시면 됩니다.
(C 표준을 정확히 아시는분, 어떤 차이가 있는지 설명해주시면 고맙겠습니다.)
물론 enum을 이용해서 형을 정의할 수도 있지만, c의 enum은 자바나 Ada의 그것에 비해 별 의미가 없습니다.
상수를 읽기 좋게 정의하는 정도의 문법이지요.

때문에 enum 을 정의했다고 해도 그것들을 runtime에 iterate하는 것은 불가능합니다.

enum x {
A = 1,
B,
C
};

는 사용자 입장에서
#define A 1
#define B 2
#define C 3

과 별반 다르지 않습니다.

하지만 저렇게 정의해두고 그것들 전체의 목록을 뽑고 싶거나 하다면, C언어 안에서 해결하기는 힘들고 외부에서
해결해야 한다는 뜻입니다. 예를들면 소스에서 enum을 찾아서 목록을 뽑아주는 파서따위가 한 예가 되겠지요.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

erla의 이미지

전 이글쓰신분이 enum이야기하셔서
대충검색해보고
array같은거라고 정의해버림...하하
제가 한참틀렸군요.

감사합니다!

==============
게으르고 생각많은.
누추한 한량 erla.입니다.

==============
게으르고 생각많은.
누추한 한량 erla.입니다.

drinkme의 이미지

전처리기는 컴파일 이전에 실행되고요.
enum은 컴파일 단계에서 처리됩니다.

winner의 이미지

'C언어 펀더멘탈'을 보면 표준화위원회는 enum에 대한 정의에 대해서 몇가지 방안을 고려하다가
결국 #define을 활용한 기호정수를 활용하기 편한 형태를 제공하는 방식으로 결정했다고 합니다.
처리단계는 다른 면이 있지만 목적은 그렇습니다.

winner의 이미지

회사에서 주로 VC++ 작업을 하는데 Windows API의 #define 드립이 짜증이 났었습니다
Debugger에서 #define 상수는 기호를 찾을 수 없는 경우가 보통인 것 같습니다.
그에비해서 enum에 의한 상수기호는 알려줄 가능성이 높지요.
Compiler가 enum을 처리하기 때문에 이런 장점은 있습니다.

aruee의 이미지

한방에 돌려 치시려면 중간단계를 거쳐야 겠죠..
enum값 자체는 인식하기 위한 이름으로서의 의미만 주고 실제값을 물리적인 배열에다가 위치시키면 가능이야 하겠죠.
어차피 enum이면 그냥 인식하기 쉽도록 박아 넣는거니..

enum pxi6259_channel {
AI0 = 100,
AI1 = 1100,
AI2,
AI3,

이거를

unsigned int pxi6259_channel_real = {100,1100,1101,1102....};
enum pxi6259_channel {
AI0 = 0,
AI1,
AI2,
AI3,

#define SET_PXI6259(NAME, DATA) pxi6259_channel_real[(NAME)] = (DATA)
#define GET_PXI6259(NAME) (pxi6259_channel_real[(NAME)])

반복문으로 처음부터 끝까지 접근이 매우 중요한 요소라면 table두개로 간접 참조로 만들면 할 수는 있습니다.
아이템 추가나 제거시 조심스럽게 고쳐야하죠. (data가 분산되어 있으니까요..)

댓글 달기

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