ν°μ€ν 리 λ·°
λ ν νΌμ μ νκ²½ κ°μ¬λμ 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`λ‘ λ€μ μ£Όμλ₯Ό μ°Ύμ μ μλ€.
'πββοΈ νλ‘κ·Έλλ° μΈμ΄ > 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 |