Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: 2 câu hỏi về hàm trong C

  1. #1
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Question 2 câu hỏi về hàm trong C

    Mình đang chập chững học lại C, mong các bạn giúp đỡ 2 câu hỏi

    1/ Khi viết (define) 1 hàm, làm sao mình có thể xác định được nên define hàm đó là hàm trả trị (các kiểu int ...) hay là hàm ko trả trị (void) ? Nói tóm tắt là khi nào thì sử dụng kiểu void cho hàm và khi nào thì sử dụng các kiểu bình thương (như int ...) cho hàm ?

    2/ Mình đọc trong 1 cuốn sách C có example sau :

    Code:
    #include <stdio.h>
    
    struct vietwow {
    int viet;
    int wow;
    };
    
    void ham(struct vietwow *test)   /* su dung struct point la`m parameter cua 1 ha`m la` o day */
    {
    test->viet = 10;
    test->wow = 20;
    }
    
    int main(void)
    {
    
    struct vietwow haha;
    
    ham(&haha);
    
    printf("gia tri viet : %d\n", haha.viet);
    printf("gia tri wow : %d\n", haha.wow);
    
    return 0;
    
    }
    Nó giải thích với vd trên, nếu ta pass thẳng struct vào function ham (tức là ham(haha) ) thay vì pass pointer của struct vào function ham (tức là ham(&haha) như vd), thì lúc này các thay đổi value của ta chỉ ảnh ưởng trong local copy mà ko được return lại hàm main. Nguyên văn như sau :

    "Another thing to notice here: if we passed the stuct instead of a pointer to the struct, what would happen in the function build_beejs_frog() when we changed the values? That's right: they'd only be changed in the local copy, and not back at out in main(). So, in short, pointers to structs are the way to go when it comes to passing structs to functions."

    Vậy mình có thắc mắc là nếu ta đổi kiểu của function ham thành kiểu trả trị (thay vì hiện tại là void - ko trả trị) thì ctrình có work ko ?

    Thân,

  2. #2
    Ngày gia nhập
    07 2007
    Nơi ở
    TP.HCM
    Bài viết
    199

    Hoàn toàn được. Bạn có thể viết lại như sau
    C++ Code:
    1. vietwow ham(struct vietwow test)  
    2. {
    3.     test.viet = 10;
    4.     test.wow = 20;
    5.     return test;
    6. }
    7.  
    8. int main(void)
    9. {
    10.  
    11.     struct vietwow haha;
    12.  
    13.     haha= ham(haha);
    14.  
    15.     printf("gia tri viet : %d\n", haha.viet);
    16.     printf("gia tri wow : %d\n", haha.wow);
    17.  
    18.     return 0;
    19.  
    20. }

  3. #3
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi vietwow Xem bài viết
    Mình đang chập chững học lại C, mong các bạn giúp đỡ 2 câu hỏi

    1/ Khi viết (define) 1 hàm, làm sao mình có thể xác định được nên define hàm đó là hàm trả trị (các kiểu int ...) hay là hàm ko trả trị (void) ? Nói tóm tắt là khi nào thì sử dụng kiểu void cho hàm và khi nào thì sử dụng các kiểu bình thương (như int ...) cho hàm ?
    Tuỳ vào bạn thôi, bạn thích làm cái nào thì làm. Cũng tuỳ vào tình huống cụ thể nữa, đôi khi dùng cái này được mà dùng cái kia ko được.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  4. #4
    Ngày gia nhập
    11 2007
    Bài viết
    83

    @MATH-INFO : Thanx bạn, các bạn ok rồi tuy nhiên nếu mình cố tình làm như vậy :

    Code:
    #include <stdio.h>
    
    struct vietwow {
    int viet;
    int wow;
    };
    
    int ham(struct vietwow *test)
    {
        test->viet = 10;
        test->wow = 20;
        return test;
    }
    
    int main(void)
    {
    
        struct vietwow haha;
    
        ham(&haha);
    
        printf("gia tri viet : %d\n", haha.viet);
        printf("gia tri wow : %d\n", haha.wow);
    
        return 0;
    
    }
    thì khi compile nó báo lỗi :

    [root@vietwow ~]# gcc -o c2 c2.c
    c2.c: In function âhamâ:
    c2.c:12: warning: return makes integer from pointer without a cast

    Có ai giải thích giúp mình tại sao ko ?

    Thanx all

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Code:
    int ham(struct vietwow *test)
    {
        test->viet = 10;
        test->wow = 20;
        return test;
    }
    test đâu phải là kiểu int, bạn return test thì bị báo lỗi là phải rồi.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Mặc định 2 câu hỏi về hàm trong C

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Code:
    int ham(struct vietwow *test)
    {
        test->viet = 10;
        test->wow = 20;
        return test;
    }
    test đâu phải là kiểu int, bạn return test thì bị báo lỗi là phải rồi.
    Ủa, vậy đối với code của MATH-INFO :

    Code:
    struct vietwow ham(struct vietwow test)
    {
        test.viet = 10;
        test.wow = 20;
        return test;
    }
    thì test ở đây cũng đâu phải kiểu int đâu bạn, vậy sao nó vẫn return được ?

  7. #7
    Ngày gia nhập
    09 2007
    Bài viết
    724

    bạn thử đoạn code này xem:
    PHP Code:

    #include <stdio.h>

    struct vietwow {
    int viet;
    int wow;
    };

    struct vietwow ham(struct vietwow *test)
    {
        
    test->viet 10;
        
    test->wow 20;
        return *
    test;
    }

    int main(void)
    {

        
    struct vietwow haha;

        
    ham(&haha);

        
    printf("gia tri viet : %d\n"haha.viet);
        
    printf("gia tri wow : %d\n"haha.wow);

        return 
    0;



    chúc bạn thành công

  8. #8
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    zkday2686 sửa vậy ổn rồi, mình muốn quay về vấn đề đầu tiên
    Nói tóm tắt là khi nào thì sử dụng kiểu void cho hàm và khi nào thì sử dụng các kiểu bình thương (như int ...) cho hàm ?
    - Chúng ta có thể trả về giá trị cho hàm là không kiểu (void), các kiểu định nghĩa sẵn (int, float,...), kiểu tự định nghĩa (struct...) và kiểu con trỏ.
    - Khi nào sử dụng cái gì thì theo mục đích bạn muốn sử dụng, nếu bạn muốn hàm đó trả về giá trị gì thì đặt kiểu trả về cho hàm đó. VD: Thường những hàm nhập xuất không trả về giá trị để void, các hàm tình giá trị thì trả về kiểu tương ứng.
    * Tóm lại, bạn cần hiểu rõ và tuỳ dùng, có thể dùng lình tinh mà không báo lỗi, tuy nhiên nên dùng đúng.

  9. #9
    Ngày gia nhập
    04 2008
    Bài viết
    336

    Trích dẫn Nguyên bản được gửi bởi vietwow Xem bài viết
    Ủa, vậy đối với code của MATH-INFO :

    Code:
    struct vietwow ham(struct vietwow test)
    {
        test.viet = 10;
        test.wow = 20;
        return test;
    }
    thì test ở đây cũng đâu phải kiểu int đâu bạn, vậy sao nó vẫn return được ?
    Bởi vì function ham có kiểu trả về là vietwow và test là kiểu vietwow nên hoàn toàn chấp nhận
    code ra gió bão

  10. #10
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi vietwow Xem bài viết
    Ủa, vậy đối với code của MATH-INFO :

    Code:
    struct vietwow ham(struct vietwow test)
    {
        test.viet = 10;
        test.wow = 20;
        return test;
    }
    thì test ở đây cũng đâu phải kiểu int đâu bạn, vậy sao nó vẫn return được ?
    Trong code của Math thì hàm trả về kiểu struct vietwow mà biến test cũng là kiểu struct vietwow nên trả về được. Còn của bạn thì hàm trả về kiểu int mà biến test lại kiểu struct vietwow thì làm sao trả về được.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn