Skip to content

Commit

Permalink
10-function-pointers: revision after class
Browse files Browse the repository at this point in the history
  • Loading branch information
hengxin committed Dec 6, 2024
1 parent b7f4363 commit f7fc2ad
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 4 deletions.
2 changes: 0 additions & 2 deletions 10-function-pointers/bsearch-gnuc.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ int main(void) {
return 0;
}

// Visualization: https://pythontutor.com/render.html#code=//%0A//%20Created%20by%20hfwei%20on%202023/12/13.%0A//%20Question%3A%20What%20if%20char%20key_name%5B%5D%20%3D%20%22Zhang%20Chu%22%3F%0A//%0A%0A%23include%20%3Cstdio.h%3E%0A%23include%20%3Cstring.h%3E%0A%0A//%20See%20https%3A//codebrowser.dev/glibc/glibc/stdlib/stdlib.h.html%23__compar_fn_t%0A//%20The%20first%20is%20a%20pointer%20to%20the%20key%20for%20the%20search,%0A//%20and%20the%20second%20is%20a%20pointer%20to%20the%20array%20element%20to%20be%20compared%20with%20the%20key.%0Atypedef%20int%20%28*__compar_fn_t%29%28const%20void%20*,%20const%20void%20*%29%3B%0A%0A//%20See%20https%3A//codebrowser.dev/glibc/glibc/bits/stdlib-bsearch.h.html%2319%0Avoid%20*bsearch%28const%20void%20*__key,%20const%20void%20*__base,%20size_t%20__nmemb,%20size_t%20__size,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20__compar_fn_t%20__compar%29%3B%0A%0Aint%20CompareStrs%28const%20void%20*left,%20const%20void%20*right%29%3B%0Aint%20CompareStrsAddress%28const%20char%20*left,%20const%20char%20*right%29%3B%0A%0Aconst%20char%20*names%5B%5D%20%3D%20%7B%0A%20%20%20%20%22Cui%20Jian%22,%0A%20%20%20%20%22Dou%20Wei%22,%0A%20%20%20%20%22ErShou%20Rose%22,%0A%20%20%20%20%22Hu%20Mage%22,%0A%20%20%20%20%22Li%20Zhi%22,%0A%20%20%20%20%22Luo%20Dayou%22,%0A%20%20%20%20%22Wan%20Qing%22,%0A%20%20%20%20%22Yao%22,%0A%20%20%20%20%22Zhang%20Chu%22,%0A%20%20%20%20%22ZuoXiao%22,%0A%7D%3B%0A%0Aint%20main%28void%29%20%7B%0A%20%20char%20*key_name%20%3D%20%22Zhang%20Chu%22%3B%0A%0A%20%20//%20char%20**name_ptr%20%3D%20bsearch%28%26key_name,%20names,%0A%20%20//%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sizeof%20names%20/%20sizeof%20*names,%0A%20%20//%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sizeof%20*names,%0A%20%20//%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28__compar_fn_t%29%20strcmp%29%3B%20//%20CompareStrsAddress%0A%0A%20%20char%20**name_ptr%20%3D%20bsearch%28%26key_name,%20names,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sizeof%20names%20/%20sizeof%20*names,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sizeof%20*names,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CompareStrs%29%3B%0A%0A%20%20if%20%28*name_ptr%20!%3D%20NULL%29%20%7B%0A%20%20%20%20printf%28%22Found%20%25s.%5Cn%22,%20*name_ptr%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20printf%28%22Could%20not%20find%20%25s.%5Cn%22,%20key_name%29%3B%0A%20%20%7D%0A%0A%20%20return%200%3B%0A%7D%0A%0Aint%20CompareStrs%28const%20void%20*left,%20const%20void%20*right%29%20%7B%0A%20%20char%20*const%20*pp1%20%3D%20left%3B%0A%20%20char%20*const%20*pp2%20%3D%20right%3B%0A%20%20return%20strcmp%28*pp1,%20*pp2%29%3B%0A%7D%0A%0A//%20What%20is%20the%20advantage%20of%20this%20version%3F%20%28performance%3F%3F%3F%29%0A//%20What%20is%20the%20disadvantage%20of%20this%20version%3F%20%28not%20flexible%3F%3F%3F%29%0Aint%20CompareStrsAddress%28const%20char%20*left,%20const%20char%20*right%29%20%7B%0A%20%20return%20strcmp%28left,%20right%29%3B%0A%7D%0A%0Avoid%20*bsearch%28const%20void%20*__key,%20const%20void%20*__base,%20size_t%20__nmemb,%20size_t%20__size,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20__compar_fn_t%20__compar%29%20%7B%0A%20%20size_t%20__l,%20__u,%20__idx%3B%0A%20%20const%20void%20*__p%3B%0A%20%20int%20__comparison%3B%0A%20%20__l%20%3D%200%3B%0A%20%20__u%20%3D%20__nmemb%3B%0A%20%20while%20%28__l%20%3C%20__u%29%20%7B%0A%20%20%20%20__idx%20%3D%20%28__l%20%2B%20__u%29%20/%202%3B%0A%20%20%20%20__p%20%3D%20%28const%20void%20*%29%20%28%28%28const%20char%20*%29%20__base%29%20%2B%20%28__idx%20*%20__size%29%29%3B%0A%20%20%20%20__comparison%20%3D%20%28*__compar%29%28__key,%20__p%29%3B%0A%20%20%20%20if%20%28__comparison%20%3C%200%29%20%7B%0A%20%20%20%20%20%20__u%20%3D%20__idx%3B%0A%20%20%20%20%7D%20else%20if%20%28__comparison%20%3E%200%29%20%7B%0A%20%20%20%20%20%20__l%20%3D%20__idx%20%2B%201%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20%28void%20*%29%20__p%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20return%20NULL%3B%0A%7D&cppShowMemAddrs=true&cumulative=true&curInstr=14&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=c_gcc9.3.0&rawInputLstJSON=%5B%5D&textReferences=false
int CompareStrs(const void *left, const void *right) {
char *const *pp1 = left;
char *const *pp2 = right;
Expand All @@ -101,7 +100,6 @@ int CompareStrsCI(const void *left, const void *right) {

// What is the advantage of this version? (performance???)
// What is the disadvantage of this version? (not flexible???)
// Visualization: https://pythontutor.com/render.html#code=//%0A//%20Created%20by%20hfwei%20on%202023/12/13.%0A//%20Question%3A%20What%20if%20char%20key_name%5B%5D%20%3D%20%22Zhang%20Chu%22%3F%0A//%0A%0A%23include%20%3Cstdio.h%3E%0A%23include%20%3Cstring.h%3E%0A%0A//%20See%20https%3A//codebrowser.dev/glibc/glibc/stdlib/stdlib.h.html%23__compar_fn_t%0A//%20The%20first%20is%20a%20pointer%20to%20the%20key%20for%20the%20search,%0A//%20and%20the%20second%20is%20a%20pointer%20to%20the%20array%20element%20to%20be%20compared%20with%20the%20key.%0Atypedef%20int%20%28*__compar_fn_t%29%28const%20void%20*,%20const%20void%20*%29%3B%0A%0A//%20See%20https%3A//codebrowser.dev/glibc/glibc/bits/stdlib-bsearch.h.html%2319%0Avoid%20*bsearch%28const%20void%20*__key,%20const%20void%20*__base,%20size_t%20__nmemb,%20size_t%20__size,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20__compar_fn_t%20__compar%29%3B%0A%0Aint%20CompareStrs%28const%20void%20*left,%20const%20void%20*right%29%3B%0Aint%20CompareStrsAddress%28const%20char%20*left,%20const%20char%20*right%29%3B%0A%0Aconst%20char%20*names%5B%5D%20%3D%20%7B%0A%20%20%20%20%22Cui%20Jian%22,%0A%20%20%20%20%22Dou%20Wei%22,%0A%20%20%20%20%22ErShou%20Rose%22,%0A%20%20%20%20%22Hu%20Mage%22,%0A%20%20%20%20%22Li%20Zhi%22,%0A%20%20%20%20%22Luo%20Dayou%22,%0A%20%20%20%20%22Wan%20Qing%22,%0A%20%20%20%20%22Yao%22,%0A%20%20%20%20%22Zhang%20Chu%22,%0A%20%20%20%20%22ZuoXiao%22,%0A%7D%3B%0A%0Aint%20main%28void%29%20%7B%0A%20%20char%20*key_name%20%3D%20%22Zhang%20Chu%22%3B%0A%0A%20%20//%20char%20**name_ptr%20%3D%20bsearch%28%26key_name,%20names,%0A%20%20//%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sizeof%20names%20/%20sizeof%20*names,%0A%20%20//%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sizeof%20*names,%0A%20%20//%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28__compar_fn_t%29%20strcmp%29%3B%20//%20CompareStrsAddress%0A%0A%20%20char%20**name_ptr%20%3D%20bsearch%28%26key_name,%20names,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sizeof%20names%20/%20sizeof%20*names,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sizeof%20*names,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CompareStrsAddress%29%3B%0A%0A%20%20if%20%28*name_ptr%20!%3D%20NULL%29%20%7B%0A%20%20%20%20printf%28%22Found%20%25s.%5Cn%22,%20*name_ptr%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20printf%28%22Could%20not%20find%20%25s.%5Cn%22,%20key_name%29%3B%0A%20%20%7D%0A%0A%20%20return%200%3B%0A%7D%0A%0Aint%20CompareStrs%28const%20void%20*left,%20const%20void%20*right%29%20%7B%0A%20%20char%20*const%20*pp1%20%3D%20left%3B%0A%20%20char%20*const%20*pp2%20%3D%20right%3B%0A%20%20return%20strcmp%28*pp1,%20*pp2%29%3B%0A%7D%0A%0A//%20What%20is%20the%20advantage%20of%20this%20version%3F%20%28performance%3F%3F%3F%29%0A//%20What%20is%20the%20disadvantage%20of%20this%20version%3F%20%28not%20flexible%3F%3F%3F%29%0Aint%20CompareStrsAddress%28const%20char%20*left,%20const%20char%20*right%29%20%7B%0A%20%20return%20strcmp%28left,%20right%29%3B%0A%7D%0A%0Avoid%20*bsearch%28const%20void%20*__key,%20const%20void%20*__base,%20size_t%20__nmemb,%20size_t%20__size,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20__compar_fn_t%20__compar%29%20%7B%0A%20%20size_t%20__l,%20__u,%20__idx%3B%0A%20%20const%20void%20*__p%3B%0A%20%20int%20__comparison%3B%0A%20%20__l%20%3D%200%3B%0A%20%20__u%20%3D%20__nmemb%3B%0A%20%20while%20%28__l%20%3C%20__u%29%20%7B%0A%20%20%20%20__idx%20%3D%20%28__l%20%2B%20__u%29%20/%202%3B%0A%20%20%20%20__p%20%3D%20%28const%20void%20*%29%20%28%28%28const%20char%20*%29%20__base%29%20%2B%20%28__idx%20*%20__size%29%29%3B%0A%20%20%20%20__comparison%20%3D%20%28*__compar%29%28__key,%20__p%29%3B%0A%20%20%20%20if%20%28__comparison%20%3C%200%29%20%7B%0A%20%20%20%20%20%20__u%20%3D%20__idx%3B%0A%20%20%20%20%7D%20else%20if%20%28__comparison%20%3E%200%29%20%7B%0A%20%20%20%20%20%20__l%20%3D%20__idx%20%2B%201%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20%28void%20*%29%20__p%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20return%20NULL%3B%0A%7D&cppShowMemAddrs=true&cumulative=true&curInstr=30&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=c_gcc9.3.0&rawInputLstJSON=%5B%5D&textReferences=false
int CompareStrsAddress(const void *left, const void *right) {
const char *pp1 = left;
const char *pp2 = right;
Expand Down
2 changes: 1 addition & 1 deletion 10-function-pointers/integrate.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ int main() {
// gcc -pedantic (invalid application of sizeof to a function type)
// See "Function to pointer conversion" (https://en.cppreference.com/w/c/language/conversion)
// See also https://en.cppreference.com/w/c/language/sizeof
printf("sizeof sin: %zu\n", sizeof sin);
printf("sizeof sin: %zu\n", sizeof sin); // not allowed
printf("sizeof &sin: %zu\n", sizeof &sin);

integration = Integrate(low, high, sin);
Expand Down
17 changes: 17 additions & 0 deletions 10-function-pointers/sort.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ int CompareInts(const void *left, const void *right);
int CompareStrs(const void *left, const void *right);
int CompareStrsWrong(const void *left, const void *right);

int StrCmpStd(const char *s1, const char *s2);

void PrintInts(const int *integers, size_t len);
void PrintStrs(const char *str[], size_t len);

Expand Down Expand Up @@ -113,6 +115,21 @@ int CompareStrsWrong(const void *left, const void *right) {
return strcmp(pp1, pp2);
}

int StrCmpStd(const char *s1, const char *s2) {
for (; *s1 == *s2; s1++, s2++) {
if (*s1 == '\0') {
return 0;
}
}

// just for debug
const unsigned char s1_char = *((const unsigned char *) s1);
const unsigned char s2_char = *((const unsigned char *) s2);

return *((const unsigned char *) s1) -
*((const unsigned char *) s2);
}

void PrintInts(const int *integers, size_t len) {
printf("\n");
for (int i = 0; i < len; i++) {
Expand Down
Binary file modified pdf/10-function-pointers.pdf
Binary file not shown.
Binary file modified template/10-function-pointers/10-function-pointers-template.pdf
Binary file not shown.
2 changes: 1 addition & 1 deletion template/10-function-pointers/decl.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ int main() {

int (*musician_score_table)[10];

int *StrCpyStd(char *dest, const char *src);
char *StrCpyStd(char *dest, const char *src);

int (*comp)(const void *left, const void *right);

Expand Down
16 changes: 16 additions & 0 deletions template/10-function-pointers/sort.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
void PrintInts(const int integers[], size_t len);
void PrintStrs(const char *str[], size_t len);

int StrCmpStd(const char *s1, const char *s2);

int main() {
int integers[] = {-2, 99, 0, -743, 2, INT_MIN, 4};
int size_of_integers = sizeof integers / sizeof *integers;
Expand Down Expand Up @@ -35,6 +37,20 @@ int main() {
PrintStrs(names, size_of_names);
}

int StrCmpStd(const char *s1, const char *s2) {
for (; *s1 == *s2; s1++, s2++) {
if (*s1 == '\0') {
return 0;
}
}

const unsigned char s1_char = *((const unsigned char *) s1);
const unsigned char s2_char = *((const unsigned char *) s2);

return *((const unsigned char *) s1) -
*((const unsigned char *) s2);
}

void PrintInts(const int integers[], size_t len) {
printf("\n");
for (int i = 0; i < len; i++) {
Expand Down

0 comments on commit f7fc2ad

Please sign in to comment.