전처리기 enum 사용법 도움 요청합니다.
우선 읽어 주셔서 감사드립니다.아래에 같이 정의 되어 있구요.
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)); <-- 이렇게 하니깐 물론 안되더라구요.
}
어떻게 해야 값을 다 읽어 올수 있을까요? 조언 부탁드립니다.. 꾸벅
제가 자세히는모르겠지만...
우선 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.입니다.
따로 파서를 만들지
따로 파서를 만들지 않는한, 불가능합니다.
lisp같은 메타프로그래밍을 지원하는 언어라면 몰라도, C에선 안됩니다.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
음
그럼 enum은 원래 프린팅이 안되는건가요?
enum 엘레먼트를 프린팅 하기위해서 파서가 필요하다는거겠죠?
==============
게으르고 생각많은.
누추한 한량 erla.입니다.
==============
게으르고 생각많은.
누추한 한량 erla.입니다.
컴파일중에 enum이
컴파일중에 enum이 처리 되는 시점은
define이 처리되는 시점과 대충 비슷하다고 보시면 됩니다.
(C 표준을 정확히 아시는분, 어떤 차이가 있는지 설명해주시면 고맙겠습니다.)
물론 enum을 이용해서 형을 정의할 수도 있지만, c의 enum은 자바나 Ada의 그것에 비해 별 의미가 없습니다.
상수를 읽기 좋게 정의하는 정도의 문법이지요.
때문에 enum 을 정의했다고 해도 그것들을 runtime에 iterate하는 것은 불가능합니다.
는 사용자 입장에서
과 별반 다르지 않습니다.
하지만 저렇게 정의해두고 그것들 전체의 목록을 뽑고 싶거나 하다면, C언어 안에서 해결하기는 힘들고 외부에서
해결해야 한다는 뜻입니다. 예를들면 소스에서 enum을 찾아서 목록을 뽑아주는 파서따위가 한 예가 되겠지요.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
오....그렇구나..
전 이글쓰신분이 enum이야기하셔서
대충검색해보고
array같은거라고 정의해버림...하하
제가 한참틀렸군요.
감사합니다!
==============
게으르고 생각많은.
누추한 한량 erla.입니다.
==============
게으르고 생각많은.
누추한 한량 erla.입니다.
다르지 싶은데요요
전처리기는 컴파일 이전에 실행되고요.
enum은 컴파일 단계에서 처리됩니다.
그렇긴 한데...
'C언어 펀더멘탈'을 보면 표준화위원회는 enum에 대한 정의에 대해서 몇가지 방안을 고려하다가
결국 #define을 활용한 기호정수를 활용하기 편한 형태를 제공하는 방식으로 결정했다고 합니다.
처리단계는 다른 면이 있지만 목적은 그렇습니다.
좀 다른 이야기지만...
회사에서 주로 VC++ 작업을 하는데 Windows API의 #define 드립이 짜증이 났었습니다
Debugger에서 #define 상수는 기호를 찾을 수 없는 경우가 보통인 것 같습니다.
그에비해서 enum에 의한 상수기호는 알려줄 가능성이 높지요.
Compiler가 enum을 처리하기 때문에 이런 장점은 있습니다.
한방에 돌려
한방에 돌려 치시려면 중간단계를 거쳐야 겠죠..
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가 분산되어 있으니까요..)
댓글 달기