본문 바로가기
VisualStudio.C++.C#/코딩팁,함수활용,단편

C. 해시테이블, 딕셔너리 유사기능 컬렉션 간이 구현 . 키값 : 대응값 자료형태.

by i.got.it 2020. 1. 20.

 

 

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

 


 

 

 

 

 

 

댓글



 

비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5