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

    Nhờ giúp đỡ dùm về con trỏ

    Em có thử đoạn code như thế này:
    // Khai báo hàm
    void contro(unsigned int8 *p);
    // Khai báo mảng hằng
    CONST unsigned int8 a[5] = {2, 3, 4, 7, 9};
    CONST unsigned int8 b[5] = {1, 2, 4,8, 6};
    void main (void)
    { contro(a);
    while(1) {}
    }
    void contro(unsigned int8 *p)
    { data = p[3] + 1; }
    Sau đó xuất dữ liệu của biến data. Tại sao với đoạn code như vậy khi build thì lại báo lỗi là "Attempt to create a pointer to a constant" và hiển thị không đúng kết quả. Trong khi bỏ CONST thì kết quả lại đúng là 8. Có phải không thể sử dụng con trỏ với const ? Vậy có cách nào để tạo 1 hàm như contro chẳng hạn mà khi gọi hàm và đưa vào hàm contro giá trị mảng a, hoặc mảng b đều thực hiện những phép tính trong thân hàm ?? Mong mọi người chỉ dùm em nhé. Em xin cám ơn.

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Nếu để cho bạn lấy pointer trỏ vào thì tính "HẰNG" ko đc đảm bảo nữa.

    Vì vậy mảng hằng chỉ dùng làm bảng tra ở global hay local.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    Nếu để cho bạn lấy pointer trỏ vào thì tính "HẰNG" ko đc đảm bảo nữa.

    Vì vậy mảng hằng chỉ dùng làm bảng tra ở global hay local.
    Tại em dùng mảng 1024 giá trị. Nếu khai báo bình thường thì chương trình biên dịch báo dữ liệu quá lớn. Nên khai báo const thì nó cho phép nên em dùng cách như vậy thôi. Còn nếu kêu em tách ra thành những mảng nhỏ thì em ko biết tách làm sao luôn vì đó là dữ liệu của 1 bức hình 128x64.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Dùng cấp phát động ấy bạn.

    Mà bạn dùng Turbo/Borland ah?

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi .sunshine.
    Em có thử đoạn code như thế này:
    // Khai báo hàm
    void contro(unsigned int8 *p);
    // Khai báo mảng hằng
    CONST unsigned int8 a[5] = {2, 3, 4, 7, 9};
    CONST unsigned int8 b[5] = {1, 2, 4,8, 6};
    void main (void)
    { contro(a);
    while(1) {}
    }
    void contro(unsigned int8 *p)
    { data = p[3] + 1; }
    Sau đó xuất dữ liệu của biến data. Tại sao với đoạn code như vậy khi build thì lại báo lỗi là "Attempt to create a pointer to a constant" và hiển thị không đúng kết quả. Trong khi bỏ CONST thì kết quả lại đúng là 8. Có phải không thể sử dụng con trỏ với const ? Vậy có cách nào để tạo 1 hàm như contro chẳng hạn mà khi gọi hàm và đưa vào hàm contro giá trị mảng a, hoặc mảng b đều thực hiện những phép tính trong thân hàm ?? Mong mọi người chỉ dùm em nhé. Em xin cám ơn.
    Tớ nghĩ nó không đồng nhất ở chỗ khai báo a[] là hằng còn lúc truyền vào lại k phải (void contro(unsigned int8 *p))

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ^ Đó là nguyên nhân gần [IMG]images/smilies/biggrin.png[/IMG]
    Nếu hàm có đối số là hằng con trỏ và truyền vào con trỏ thì đc.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    Dùng cấp phát động ấy bạn.

    Mà bạn dùng Turbo/Borland ah?
    Mình dùng CCS b. Chương trình viết cho VDK đó b. Chứ mình hoàn toàn ko chuyên về C.

    - - - Nội dung đã được cập nhật ngày 12-05-2014 lúc 10:21 PM - - -

    Trích dẫn Gửi bởi prog10
    ^ Đó là nguyên nhân gần [IMG]images/smilies/biggrin.png[/IMG]
    Nếu hàm có đối số là hằng con trỏ và truyền vào con trỏ thì đc.
    Trích dẫn Gửi bởi HieuApp
    Tớ nghĩ nó không đồng nhất ở chỗ khai báo a[] là hằng còn lúc truyền vào lại k phải (void contro(unsigned int8 *p))
    Chưa hiểu lắm 2 anh, chỉ dùm em thêm đi.

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi tanth90
    chào bạn, theo ý mình, khi bạn đã khai báo:
    CONST unsigned int8 a[5] = {2, 3, 4, 7, 9}; // có hằng số constant nghĩa là mảng a này được khai báo là const, và các giá trị của mảng này sẽ không thay đổi (hoặc là không nên bị thay đổi).
    do vậy, khi bạn sử dụng con trỏ p trỏ đến phần tử thứ 3 của mảng này và thay đổi giá trị phần tử thứ 3 của nó, khi thực thi sẽ báo lỗi.

    Còn viêc sử dụng con trỏ với mảng CONST là được miễn bạn không được thay đổi giá trị của nó.
    Còn nếu bạn muốn viết hàm contro(a) và thao tác (thêm, sửa, xóa) với mảng a thì bạn không được khai báo mảng a là constant.
    Nếu bạn muốn biết cụ thể hơn thì search về passing parameter by reference.
    Đồng ý với bạn cái chỗ ..."Còn viêc sử dụng con trỏ với mảng CONST là được miễn bạn không được thay đổi giá trị của nó." Nhưng đoạn đầu mình lại nghĩ hơi khác chút.
    Thực ra chủ theard không "thay đổi" giá trị của phần tử mảng nào cả.
    cụ thể câu lệnh
    Mã nguồn PHP:
    data=p[3]+1; //tuong duong: data=*(p+3)+1;  
    chứ có ai thay đổi cái gì đâu. chỉ là cộng phần tử thứ 4 của mảng thêm 1 rồi gán cho data thôi mà.
    [IMG]images/smilies/thinking.gif[/IMG]

  9. #9
    ^ Cái này mình nói rồi muh [IMG]images/smilies/smile.png[/IMG] (post #2)

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    chào bạn, theo ý mình, khi bạn đã khai báo:
    CONST unsigned int8 a[5] = {2, 3, 4, 7, 9}; // có hằng số constant nghĩa là mảng a này được khai báo là const, và các giá trị của mảng này sẽ không thay đổi (hoặc là không nên bị thay đổi).
    do vậy, khi bạn sử dụng con trỏ p trỏ đến phần tử thứ 3 của mảng này và thay đổi giá trị phần tử thứ 3 của nó, khi thực thi sẽ báo lỗi.

    Còn viêc sử dụng con trỏ với mảng CONST là được miễn bạn không được thay đổi giá trị của nó.
    Còn nếu bạn muốn viết hàm contro(a) và thao tác (thêm, sửa, xóa) với mảng a thì bạn không được khai báo mảng a là constant.
    Nếu bạn muốn biết cụ thể hơn thì search về passing parameter by reference.

 

 

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
  •