ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•
λ ‰ν† ν”Όμ•„ μ •ν˜œκ²½ κ°•μ‚¬λ‹˜μ˜ Secure & Generic C κ°•μ˜λ₯Ό λ“£κ³ , μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. 
ν•΄λ‹Ή λ‚΄μš©μ˜ μ €μž‘κΆŒμ€ μ •ν˜œκ²½ κ°•μ‚¬λ‹˜μ—κ²Œ μžˆμŠ΅λ‹ˆλ‹€.

C의 Generic

 λ°μ΄ν„° νƒ€μž…μ— 상관없이 ν•˜λ‚˜μ˜ ν•¨μˆ˜λ‘œ λ™μΌν•œ λ™μž‘μ„ μˆ˜ν–‰ν•˜λ„λ‘ ν•˜λŠ” 방식이닀. 예λ₯Ό λ“€μ–΄ 정렬을 ν•˜κ³ μž ν•  λ•Œ, 데이터 νƒ€μž… (int, double ...)에 따라 λ³„λ„λ‘œ ν•¨μˆ˜λ₯Ό κ΅¬μ„±ν•œλ‹€λ©΄ μœ μ§€λ³΄μˆ˜ μΈ‘λ©΄μ—μ„œ μƒλ‹Ήνžˆ λΉ„νš¨μœ¨μ μΌ 것이닀. λ”°λΌμ„œ c++의 STLκ³Ό μœ μ‚¬ν•œ κΈ°λŠ₯을 Cλ‘œλ„ λ§Œλ“€ 수 μžˆλ‹€.

 

 μ–΄λ–»κ²Œ ν•˜λ©΄ genericν•˜κ²Œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆμ„κΉŒ? μ΄λŠ” μ•žμ„œ 닀룬 λ‹€μ–‘ν•œ ν¬μΈν„°μ—μ„œ `ν•¨μˆ˜ 포인터`, `void 포인터`와 같은 μ‘μš© 포인터λ₯Ό ν™œμš©ν•˜λ©΄ 데이터 νƒ€μž…μ— 상관없이 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ“€μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

Generic for-each

#include <stdio.h>
void forEach(void *s, void *e, void(*showFunc)(void *), int dataSize));
void showInt(void *vp);
void showDouble(void *vp);

int main()
{
    int x[5] = {10, 9, 8, 7, 6};
    double y[5] = {10.1, 9.2, 8.3, 7.4, 6.5};
    
    forEach(x, x + 5, showInt, sizeof(int));
    forEach(y, y + 5, showDouble, sizeof(double));
}

void forEach(void *s, void *e, void (*showFunc)(void *), int dataSize))
{
    while (s != e) {
    	showFunc(s);
        // s의 λ‹€μŒ μ£Όμ†Œλ₯Ό dataSizeλ₯Ό 톡해 찾음.
        // μ£Όμ†Œ λ³€ν™˜μ€ sizeof(λ°μ΄ν„°νƒ€μž…)이 곱해진닀.
        // 이미 dataSize만큼 λ”ν•˜κ³  μžˆμœΌλ―€λ‘œ 이λ₯Ό 막기 μœ„ν•΄ (char *)둜 ν˜•λ³€ν™˜ν•œλ‹€.
        s = (char *)start + dataSize;
    }
}

void showInt(void *vp)
{
    // void ν¬μΈν„°λŠ” ν˜•λ³€ν™˜μ„ 톡해, μ–΄λ–€ 포인터 인지 λͺ…μ‹œ ν›„ μ°Έμ‘°ν•˜μ—¬μ•Ό 함.
    printf("%d\n", *(int *)vp);
}

void showDouble(void *vp)
{
    printf("lf\n", *(double *)vp);
}

 `ν•¨μˆ˜ 포인터`와 `void 포인터`λ₯Ό μ΄ν•΄ν–ˆλ‹€λ©΄, μœ„μ™€ 같이 for-eachλ₯Ό 데이터 νƒ€μž…μ— 상관없이 ν˜ΈμΆœλ˜λ„λ‘ κ΅¬ν˜„ν•  수 μžˆλ‹€. s의 λ‹€μŒ μ£Όμ†Œλ₯Ό μ°ΎκΈ° μœ„ν•΄ `s = (char *)start + dataSize`λ₯Ό μˆ˜ν–‰ν•˜λŠ”λ° μ΄λŠ” μ£Όμ†Œ μ—°μ‚° μ‹œ, `sizeof(λ°μ΄ν„°νƒ€μž…)`이 κ³±ν•΄μ§€λ―€λ‘œ `(char *)`을 μ΄μš©ν•΄ λ³€ν™˜ν•˜λŠ” 것이닀.

 

Generic find

#include <stdio.h>
int compareInt(void *vp1, void *vp2);
int compareDouble(void *vp1, void *vp2);
void *find(void *s, void *e, void *value, int(*compareFunc)(void *, void *), int size));

int main()
{
    int x[5] = {10, 9, 8, 7, 6};
    double y[5] = {10.1, 9.2, 8.3, 7.4, 6.3};
    
    int iNumber = 8;
    double dNumber = 8.3;
    
    ip = (int *)find(x, x + 5, &iNumber, compareInt, sizeof(int));
    dp = (double *)find(y, y + 5, &dNumber, comapreDouble, sizeof(double));
}

void *find(void *s, void *e, void *value, int(*compareFunc)(void *, void *), int size))
{
    while (s != e && !compareFunc(s, e))
    {
        s = (char *)s + size;
    }
    
    return s;
}

int compareInt(void *vp1, void *vp2)
{
    return *(int *)vp1 == *(int *)vp2;
}

int compareDouble(void *vp1, void *vp2)
{
    return *(double *)vp1 == *(double *)vp2;
}

 find ν•¨μˆ˜λ„ 데이터 νƒ€μž…μ— 상관 없이 generic ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€. μœ„μ˜ for-each와 λ§ˆμ°¬κ°€μ§€λ‘œ `s = (char *)s + size`둜 λ‹€μŒ μ£Όμ†Œλ₯Ό 찾을 수 μžˆλ‹€.

 

728x90
λ°˜μ‘ν˜•

'πŸ™‹β€β™‚οΈ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ > C' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

C: fork()  (0) 2020.11.25
C: 동적 ν• λ‹Ήκ³Ό ν™œμš©  (0) 2020.11.20
C: λ‹€μ–‘ν•œ 포인터  (0) 2020.11.17
C: μ •μˆ˜μ˜ λ²”μœ„  (0) 2020.11.16
C: ν‘œν˜„μ‹  (0) 2020.11.14
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€