C 언어 자체로는 "키값 : 데이터" 형식으로 접근할 수 있는 데이터 형이 없고 상황에 따라 직접 정의 해서 활용한다.
키값 및 이에 1:1 대응하는 데이터를 가지는 구조이면 되므로 아래 예처럼 구현가능. 범용적인것 구현하려면 방대해지므로 특수 상황에만 활용가능한 형식으로 간이 구현예.
본 예에서는 키값 250,251,252,253 ... 이고 이에 대응하는 값이 메모리 주소값인 경우
typedef struct
{
uint8_t IndexPage; // key 에 해당.
uint32_t Addr; // IndexPage 에 1:1 대응하는 주소값.
}ST_DIC_IDXADDR;
ST_DIC_IDXADDR stDicIdxAddr[10]; //
/// key 에 대응하는 값 반환 받는 함수.
uint32_t get_dic_value(uint8_t key)
{
for(uint8_t idx=0; idx<10; idx++)
{
if(stDicIdxAddr[idx].IndexPage == key)
return stDicIdxAddr[idx].Addr;
}
}
// 키에 해당하는 값 기록하는 함수.
set_dic_value(uint8_t key, uint32_t addr)
{
// stDicIdxAddr 배열 인덱스 중 어디 기록할지 정했다 치고.
stDicIdxAddr[idx].IndexPage = key;
stDicIdxAddr[idx].Addr = addr;
}
위 코드에 보면 값을 받기 위해서 배열 인덱싱하는 처리등 부하 증가 시키는 요소가 필연 많아진다.
일반배열이라면 배열변수[인덱스] 로 인덱스에 해당하는 값이 즉시 반환되어 간편한 활용에 비교하면 컬렉션류들을 직접 구현하다보면 필연 감수해야 하는 부분이다.
한편, 본 예의 상황처럼 인덱스 값의 범위가 255 와 같은 값이 아닌 0,1,2,3,4 식의 값이었다면 단순 배열로 인덱스 : 값을 바로 받을 수 있기에 아래처럼 배열로 정의하고 내부적으로 인덱싱 규칙을 변경하여 활용하는 간단한 방법도 가능함.
uint32_t Addr[10];
uint32_t get_addr(uint8_t idx_page)
{
uint8_t my_idx = 255-idx_page; // 처리요점 idx_page 값이 255 -> 0, 254 -> 1, 253-> 2,...식으로 변환.
return Addr[my_idx];
}
void set_addr(uint8_t idx_page, uint32_t addr)
{
uint8_t my_idx = 255-idx_page; /// 처리요점 idx_page 값이 255 -> 0, 254 -> 1, 253-> 2,...식으로 변환.
Addr[my_idx]=addr;
}
첫 등록 : 2020년 1월 20일
최종 수정 :
단축 주소 : https://igotit.tistory.com/2448
'VisualStudio.C++.C# > 코딩팁,함수활용,단편' 카테고리의 다른 글
_tcstol, strtol, wcstol. 16 진수, 2 진수 표현 문자를 10진 정수형으로 변환. (0) | 2020.02.09 |
---|---|
C. ASCII 문자열 크기 구하기 (0) | 2020.02.09 |
C. malloc , free 메모리 동적 할당. 제거. (0) | 2019.12.28 |
_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h) (0) | 2019.12.08 |
C. static 함수 선언. (0) | 2019.10.21 |
댓글