Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 13
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    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 [IMG]images/smilies/biggrin.png[/IMG]

    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 :

    Mã:
    #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
    ", haha.viet);
    printf("gia tri wow : %d
    ", 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 tham gia
    Sep 2015
    Bài viết
    0
    Hoàn toàn được. Bạn có thể viết lại như sau

    Mã:
    vietwow ham(struct vietwow test)   {    test.viet = 10;    test.wow = 20;    return test;} int main(void){     struct vietwow haha;     haha= ham(haha);     printf("gia tri viet : %d
    ", haha.viet);    printf("gia tri wow : %d
    ", haha.wow);     return 0; }

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    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.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi vietwow
    À quên, mình còn 1 thắc mắc nhỏ cuối cùng nữa là : Tại sao khi ta pass struct pointer đến function ham thì ko cần return về ? (trông khi nếu pass thẳng struct đến function ham như các bạn chỉ trên thì phải return về)

    Thân,
    Ta viết hảm có trả về hay khong trả về không phải phụ thuộc vào thông số ta truyền vào kiểu gì, mà tuỳ vào nhu cầu của ta có muôn trả về hay khong. Ví dụ viết hàm tính tổng(int a, b) thì cần phải viết hàm trả về kiêu int, còn viết hàm sắp xếp mảng thì khong cần phải trả về (void sort(int a[]), vì hàm sort là thực hiện việc sắp xếp mảng a, không có nhu cầu trả về gì cả. Tóm lại là muốn nó trả về hay khong là do nhu cầu của mình mà thôi. Tại vì bên trên bạn muốn viết hàm trả về nên mình mới viết mẫu minh hoạ cho bạn hiểu, chứ thật ra cách viết của mình ở trên thực tế không ai làm vậy cả.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi meoconlongvang
    Mã:
    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 :

    Mã:
    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 ?

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    bạn thử đoạn code này xem:
    Mã nguồn PHP:
    #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
    ", haha.viet); printf("gia tri wow : %d
    ", haha.wow); return 0;}  
    chúc bạn thành công

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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.

  8. #8
    Trích dẫn Gửi bởi vietwow
    Ủa, vậy đối với code của MATH-INFO :

    Mã:
    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 [IMG]images/smilies/smile.png[/IMG]

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi vietwow
    Ủa, vậy đối với code của MATH-INFO :

    Mã:
    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.

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Ah, mình hiểu rồi, cám ơn tất cả các bạn đã giúp đỡ [IMG]images/smilies/smile.png[/IMG]

    Thanx again

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •