스트링과 변수
글쓴이: mindon / 작성시간: 수, 2004/07/07 - 1:51오후
질문하나 드립니다.
가령
typedef struct {
char aaa;
int bbb;
user_struct ccc;
} test;
등의 구조체가 존재할때, command로 찾을 변수의 string (ex aaa or bbb)을 입력받아서 해당 구조체 안의 변수의 포인터를 얻어 오려면 어떤 방법이 있을까요? 꼭 포인터가 아니더라도 해당 변수 값을 출력하고 싶거든요.
프로그램이 시작될때 string과 해당 변수의 주소 테이블을 만드려고도 했는데, 테이블 크기가 너무 커지고 엄청난 단순 노가다라 효율적인 방법이 있나해서 도움을 요청합나다.
예제 처럼 단순한 구조체가 아니라 구조체 안에 많은 변수를 갖는 여러 구조체가 존재하고 가장 상위 구조체가 큰 index의 배열로 존재하는 경우 입니다.
고수님들의 많은 답변 부탁드립니다.
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 57.26 KB |
Forums:
[quote]해당 구조체 안의 변수의 포인터를 얻어 오려면 어떤 방법이
char *pointer = &test.aaa;
이는 별반 다른 방법은 없을 겁니다.
mindon님의 방법이 정석일 듯...
일단은 이런...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
리플렉션(Reflection) 기능을 사용하세요.
님이 원하시는 기능을 리플렉션(Reflection)이라고 합니다.
C/C++에서는 원래 지원하지 않는 기능입니다.
Java나 C# 등의 언어에서는 언어 자체에서 지원하지요.
C++에서는 template metaprogramming 기능을 사용해서 구현하는 방법이 있습니다만(첨부한 논문을 참고하세요.), Java나 C# 보다는 물론 불편합니다.
참고로 C++ 차기 표준(C++0x)에는 리플렉션이 들어갈 가능성이 있습니다.
웬만하면 Java나 C#으로 구현하는게 좋을 듯합니다.
preprocessor를 쓰면 될겁니다.
mindon님의 메시지인데, 굳이 비공개로 할 필요가 없어 인용합니다.
시스템 프로그래밍에 C가 아니면 안된다는 것은 편견입니다.
오히려 C++이 더 적합하다는 의견도 있습니다.
커널 자체가 C++로 만들어진 상용 OS도 있습니다.
(대표적으로 BeOS가 있죠. 윈도나 리눅스보다 훨씬 가볍고 빠릅니다.)
명예의 전당에도 이에 대한 토론이 있습니다. 참고하세요.
http://bbs.kldp.org/viewtopic.php?t=27257&postdays=0&postorder=asc&start=80
Preprocessor를 직접 구현해서 위의 작업을 대신 해주면 되겠네요.
다음 링크를 참고하세요.
http://bbs.kldp.org/viewtopic.php?t=28674&highlight=preprocessor
물론 시스템 프로그래밍을 C++로 해도 되겠지요. 하지만 저 혼자 하
물론 시스템 프로그래밍을 C++로 해도 되겠지요.
하지만 저 혼자 하는 작업이 아니라 회사 프로젝트다 보니 환경이 C 밖엔 안되네요..
그래서 제 질문의 요지는 시스템 프로그래밍을 어떤 언어로 해야 한다는 토론이 아니라 리플렉션을 지금 제가 처한 환경인 C에서 어떻게 효율적으로 구현할 수 있냐는 겁니다..
그래서 님의 의견을 물어본것 이구요..
아무튼 답변 감사합니다.
컴파일러 입장에서는 변수명이라는건 별 의미가 없습니다.단지 컴파일 단
컴파일러 입장에서는 변수명이라는건 별 의미가 없습니다.
단지 컴파일 단계에서 주소값으로 대체 됩니다. 물론 링크단계와 실행시간
단계에 정해지는것도 있지만 말입니다.
디버거가 실제 코드외에 디버깅 코드를 봐가면서 변수값을 보여줄수 있는 것인데 이걸 실행하는 프로그램 그 자체가 자신의 연산중인 변수를 실행시간에 입력받아 스스로 출력하게 하는걸 만든다는건 그리 쉽지 않을 거 같군요.
간단히 어떤 테크닉을 쓰면 된다 정도가 아닌듯 한데요.
따로 코드에 대해 컴파일 과정과 같은 처리가 필요 할듯 합니다.
이걸 잘만 만든다면 실행시간 자체 디버깅이 가능하겠구요. 획기적인 작업 같습니다.
만약 정형화된 작업으로 까지 만들 필요가 없다면 그냥 if 문과 strcmp 만으로도 충분할거 같네요.
screen + vim + ctags 좋아요~
충길님 답변 감사합니다..제가 이 작업을 하려는 건 님이 말씀하신
충길님 답변 감사합니다..
제가 이 작업을 하려는 건 님이 말씀하신것 처럼 실시간 임베리드 시스템에서 디버깅이 용이하게 하기 위함입니다.
무선 네트웍 시스템 호처리 블럭인데 실시간에 해당 단말의 원하는 정보를 볼 수 있으면 디버깅이 정말 편하거든요.
일단 제생각은 위의 작업에서 일단 task가 initialize 될때 변수명 스트링과 해당 변수의 주소 테이블을 초기화 시키고 이를 디버깅 할때 사용하는 거 였습니다.
이렇게 하면 작업량은 좀 되겠지만 이후 편리함에 비하면 감한 할 수 있는 작업이라 생각되구요..
그런데 욕심을 좀 더 부리다 보니, 가장 부담되는 작업은 해당 struct에 변수가 추가되거나 삭제 되었을때 입니다.
많은 사람이 사용하는 struct이기 때문에 누가 어느 시간에 고칠지 모르거든요..
이를 모든 사람에게 변수 업데이트 마다 수작업이 필요 없이 님이 말씀하신 "컴파일 비슷한 과정"으로 처리해 주는 것이 문제 였습니다..
그리고 위에서 작업해 줄 많은 작업을 좀 더 효율적으로 할 수 없을까 하구 도움을 요청했던 것이 구요..
게으름 피우지 말구 열심히 하는 수 밖엔 없겠네요.. ^^답변 감사합니다.
댓글 달기