30/09/2018, 22:00

Hỏi đáp về con trỏ hàm trong C

Chào mọi người, mình đang tìm hiểu về con trỏ thì đọc và gặp vấn đề về con trỏ hàm, đọc thấy hay nhưng mà chưa nắm rõ vấn đề lắm ai có thể giúp mình giải thích rõ đoạn này không?
Hàm:

char** album_names(char *artist, int year)
{
...
}
Main:
char** (*names_fn)(char*,int);
names_fn = album_names;
char** results = names_fn("Sacha Distel", 1972);
Sơn viết 00:04 ngày 01/10/2018

Bạn chưa hiểu chỗ nào.
để tạo 1 con trỏ hàm thì bạn thực hiện theo cú pháp sau:
[kiểu trả vê của hàm][(*tên con trỏ)][danh sách tham số của hàm]
Cú pháp khai báo loằng ngoằng như vậy vì không có 1 kiểu hàm chung. Khi taojh 1 hàm, bạn có thể tùy biến kiểu trả về, danh sách tham số, nên chúng sẽ định nghĩa nên kiểu của hàm. Nếu ta có con trỏ hàm trỏ đến 1 hàm rồi thì có thể gọi hàm đó thông qua con trỏ

ở trong hàm main:
dòng 1: tạo 1 con trỏ hàm với các hàm có kiểu trả về là char**, danh sách tham số là char và int
dòng 2: khởi tạo biến con trỏ vừa rồi, cho nó trỏ đến hàm album_names
dòng 3: gọi hàm thông qua con trỏ hàm

Đinh Thiện Khải viết 00:15 ngày 01/10/2018

Cảm ơn bạn nts311, mình đã hiểu về cách tạo vào cách sử dụng. Nhưng mà cho mình hỏi thêm là con trỏ hàm nên dùng cho những trường hợp nào? Vì mình thấy dùng con trỏ hàm để gọi hàm đó ra thì không khác gì gọi hàm đơn thuần?

kiencon viết 00:07 ngày 01/10/2018

Con trỏ hàm được dùng để tùy biến, giúp cho code được viết có thể sử dụng được nhiều lần một cách hiệu quả nhất, có thể đưa vào thư viện riêng của bạn.

Đinh Thiện Khải viết 00:11 ngày 01/10/2018

m được dùng để tùy biế

Bạn có thể cho mình 1 ví dụ con con đc không. Cảm ơn bạn

kiencon viết 00:16 ngày 01/10/2018

Ví dụ mình có 3 hàm, min, max, socantim, với 1 dãy số, hàm min so sánh 2 số đưa ra số min, tương tự cho max, trong hàm socantim dùng vòng for chạy lặp qua các số, ở đây dùng con trỏ hàm cho hàm min và max, nếu muốn tìm min bạn gán min và ngược lại cho max. Như vậy bạn chỉ cần 3 hàm là đủ, ngoài ra socantim có thể mở rộng ra coa thể tìm số nguyên tố nhỏ nhất, lớn nhất, số chính phương, hoàn hảo gọi chung là hàm điều kiện. Bạn chỉ cần dùng con trỏ hàm điều kiện gán trong hàm socantim là tìm đc số cần tìm, không cần phải viết từng hàm 1. Tùy biến ở đây là mình chỉ cần viết 1 vòng for mà tùy điều kiện cần tìm cho ra kết quả mình mong muốn.

Đinh Thiện Khải viết 00:09 ngày 01/10/2018

bạn gán min và n

Mình đã hiểu ý bạn, tuy nhiên trong hàm socantim bạn vẫn phải khởi tạo con trỏ hàm (nếu là min thì tạo min, hoặc ngược lại tạo max) Vậy thì sau đó, tùy vào mình chọn min hay max mà mình gán. Nhưng thế thì khi muốn thay đổi thì mình vẫn phải quay về hàm socantim để thay đổi. Mình thấy thêm 1 cái là find() function dùng *match. Mình đưa hàm min hoặc max vào thẳng argument của hàm socantim. Nếu như bạn nói thì dùng cái này hay hơn phải h0k?

Sơn viết 00:16 ngày 01/10/2018

Vd bạn có 1 hàm lọc tập hợp các chuỗi. Nó sẽ duyệt qua mọi phàn tử, kiểm tra xem 1 chuỗi có thỏa nãm 1 điều kiện nào không. Giả sử bây giờ bạn muốn kiểm tra nhiều điều khiện riêng rẽ thì bạn sẽ phải sao chép lại rất nhiều code, mà mỗi đoạn code thì chỉ thay đổi có 1 dòng. Như thế sẽ bị lặp code, nên bạn sẽ sử dụng con trỏ hàm để tránh lawepj code: Viết hàm kiểm tra điều kiện, sau đó sử dụng con trỏ hàm làm tham số truyền vào hàm làm công việc duyệt qua tùng phần tử. Sau đó bạn gọi hàm kiểm tra đk thjoong qua con trỏ hàm.

char [][20]={
      "John come from USA"
      "Son come from Viet Nam"
       "abcxyz come from Japan"
};

int check_vn(char *s)
{
     return strstr(s,"Viet Nam");
}

int check_usa(char *s)
{
     return strstr(s,"usa");
}

Hàm duyệt qua từng phần tử

void country_filter(int(*check_fp)(char *))
{
     for(int i=0;i<n;i++)
     {
           if(check_fp(array_of_string[i]))
                printf("%s",array_of_string[i])
     }
}

int main()
{
     //lọc ra những người ở Mĩ
     country_filter(check_usa);
       //lọc ra những người ở Việt Nam
     country_filter(check_vn);
     return 0;
}

Mà con trỏ hàm cũng có thể dùng với struct nữa

typedef struct
{
     int weight;
     int height;
     char *hair_color;

     void(*meow)();
}cat;

void keu()
{
     printf("Meow Meow Meow");
}

int main()
{
     cat my_cat={8,2,"black",keu};
     mycat.meow();//in ra meow meow meow, fell like oop
     return 0;
}

Đinh Thiện Khải viết 00:03 ngày 01/10/2018

Chuẩn rồi nts311 Mình nắm rõ các vấn đề rồi bạn Cảm ơn bạn đã support nhiệt tình

Bài liên quan
0