Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 2 của 2 Đầu tiênĐầu tiên 12
Kết quả 11 đến 14 của 14

Chủ đề: Lỗi return

  1. #11
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bạn có ma trận hai chiều mt[100][100], và bạn muốn trả về mt trong hàm laymt. Khi dùng câu lệnh
    Mã:
    return this->mt
    thì mt sẽ chuyển thành con trỏ tới ma trận một chiều kích thước 100 (int (*)[100]). Để sửa hàm của bạn, cách đơn giản nhất là dùng typedef:
    Mã:
    typedef int ARRAY[100];
    
    ARRAY *laymt()
    {
        return this->mt;
    }
    Thế còn nếu không dùng typedef thì sao? Bạn sẽ cần nắm kĩ hơn về cách khai báo trong C/C++ cũng như độ ưu tiên của các toán tử. Đây là cách khai báo hàm laymt không cần dùng typedef:
    Mã:
    int (*laymt())[100]
    {
        return this->mt;
    }
    Rõ ràng là khó đọc hơn so với cách dùng typedef.

  2. #12
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ^ Nói thật là mình chả thể hiểu sao viết int (*laymt())[100] thì ngon mà viết int*[100]... lại teo [IMG]images/smilies/smile.png[/IMG]

  3. #13
    Trích dẫn Gửi bởi cvht
    Bạn có ma trận hai chiều mt[100][100], và bạn muốn trả về mt trong hàm laymt. Khi dùng câu lệnh
    Mã:
    return this->mt
    thì mt sẽ chuyển thành con trỏ tới ma trận một chiều kích thước 100 (int (*)[100]). Để sửa hàm của bạn, cách đơn giản nhất là dùng typedef:
    Mã:
    typedef int ARRAY[100];
    
    ARRAY *laymt()
    {
        return this->mt;
    }
    Thế còn nếu không dùng typedef thì sao? Bạn sẽ cần nắm kĩ hơn về cách khai báo trong C/C++ cũng như độ ưu tiên của các toán tử. Đây là cách khai báo hàm laymt không cần dùng typedef:
    Mã:
    int (*laymt())[100]
    {
        return this->mt;
    }
    Rõ ràng là khó đọc hơn so với cách dùng typedef.
    ok chạy ngon rùi bạn

    - - - Nội dung đã được cập nhật ngày 01-06-2014 lúc 09:29 PM - - -

    Trích dẫn Gửi bởi prog10
    ^ Nói thật là mình chả thể hiểu sao viết int (*laymt())[100] thì ngon mà viết int*[100]... lại teo [IMG]images/smilies/smile.png[/IMG]
    haha hỏi bạn trên kia đi [IMG]images/smilies/smile.png[/IMG]))

  4. #14
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    @pysyren: Bạn không nên thỏa mãn ở mức chương trình dịch/chạy được mà không hiểu tại sao.

    Trích dẫn Gửi bởi prog10
    ^ Nói thật là mình chả thể hiểu sao viết int (*laymt())[100] thì ngon mà viết int*[100]... lại teo [IMG]images/smilies/smile.png[/IMG]
    Thực ra thì khai báo của C/C++ khá là chuối. Việc viết int *[100] laymt() theo mình nghĩ là đúng theo suy luận logic. Đúng ra thì sẽ là int (*)[100] laymt(), với việc hiểu là laymt trả về kiểu int (*)[100], tức là con trỏ tới mảng 100 int. Điều này gần với cách dùng typedef:

    Mã:
    // ARRAY là kiểu mảng 100 int
    typedef int ARRAY[100];
    
    // laymt là hàm trả về con trỏ kiểu ARRAY
    ARRAY *laymt();
    Hoặc cũng có thể viết

    Mã:
    // POINTER là kiểu con trỏ tới mảng 100 int
    typedef int (*POINTER)[100];
    
    POINTER laymt();
    Nhưng C/C++ không cho phép viết

    Mã:
    int (*)[100] laymt();
    Vấn đề chỉ là do cú pháp của C/C++. Mỗi khai báo của C/C++ sẽ có hai phần: declaration-specifiers declarator (chính xác hơn sẽ là init-declarator-list, như trong int i, j, k=0). Phần declaration-specifiers sẽ bao gồm kiểu và storage-class, ví dụ như static unsigned int. Phần declarator sẽ phải có đúng một identifier (tên biến hoặc tên hàm), và đây chính là phần mà nhiều khi làm cho khai báo của C/C++ khó đọc:

    Mã:
    int *a[10];    // a là mảng 10 con trỏ tới int
    int (*a)[10];    // a là con trỏ tới mảng 10 int
    int *f(void);    // f là hàm trả về con trỏ tới int
    int (*f)(void);  // f là con trỏ tới hàm trả về kiểu int
    int (*a[10])(void);    // a là mảng 10 con trỏ tới hàm trả về kiểu int
    Với khai báo

    Mã:
    int (*)[100] laymt();
    Thì declaration-specifiers là int, và phần còn lại là declarator. Nhưng phần declarator này lại không tuân theo cú pháp của C/C++. Trình biên dịch sẽ báo là thiếu identifier sau dấu *.

 

 
Trang 2 của 2 Đầu tiênĐầu tiên 12

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
  •