-
13-12-2015, 02:09 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gặp vấn đề về truy xuất con trỏ trong struct và union
Chào các bạn,
Mình đang gặp vấn đề về con trỏ trong struct và union, nhờ các bạn giúp đỡ. Mình có khai báo và 2 hàm sau, mình post code chạy đúng trước:
Khai báo:
Mã:typedef union TextLCDDataPort_Union { unsigned char BYTE; struct { unsigned char B0 : 1; unsigned char B1 : 1; unsigned char B2 : 1; unsigned char B3 : 1; unsigned char B4 : 1; unsigned char B5 : 1; unsigned char B6 : 1; unsigned char B7 : 1; }BIT; }TextLCDDataPort_TypeDef; TextLCDDataPort_TypeDef DataTextLCD;
Mã:void TextLCD_PortTextLCDWrite() { TextLCD_D4 = DataTextLCD.BIT.B4; TextLCD_D5 = DataTextLCD.BIT.B5; TextLCD_D6 = DataTextLCD.BIT.B6; TextLCD_D7 = DataTextLCD.BIT.B7; }
Mã:void TextLCD_Cmd(char cmd_data) { unsigned char HighNibble, LowNibble; HighNibble = (cmd_data) & 0xF0; LowNibble = (cmd_data<<4) & 0xF0; DataTextLCD.BYTE = HighNibble; TextLCD_PortTextLCDWrite(); ... DataTextLCD.BYTE = LowNibble; TextLCD_PortTextLCDWrite(); ... }
Mã:typedef union TextLCDDataPort_Union { unsigned char *BYTE; struct { unsigned char B0 : 1; unsigned char B1 : 1; unsigned char B2 : 1; unsigned char B3 : 1; unsigned char B4 : 1; unsigned char B5 : 1; unsigned char B6 : 1; unsigned char B7 : 1; }*BIT; }TextLCDDataPort_TypeDef; TextLCDDataPort_TypeDef *DataTextLCD;
Mã:void TextLCD_PortTextLCDWrite() { TextLCD_D4 = DataTextLCD->BIT->B4; TextLCD_D5 = DataTextLCD->BIT->B5; TextLCD_D6 = DataTextLCD->BIT->B6; TextLCD_D7 = DataTextLCD->BIT->B7; }
Mã:void TextLCD_Cmd(char cmd_data) { unsigned char HighNibble, LowNibble; HighNibble = (cmd_data) & 0xF0; LowNibble = (cmd_data<<4) & 0xF0; *DataTextLCD->BYTE = HighNibble; TextLCD_PortTextLCDWrite(); ... *DataTextLCD->BYTE = LowNibble; TextLCD_PortTextLCDWrite(); ... }
View more random threads:
- Giải hệ phương trình bằng biến đổi về tam giác dưới. Giúp mình sửa lỗi?
- Game thử trí nhớ. Lỗi gì không biết nữa.
- [giúp]tìm n để thỏa s
- danh sách liên kết
- giúp mình với mọi người ơi..
- (Phần danh sách liên kết)Lỗi này là lỗi gì vậy???
- Tìm ký tự tạo nên dãy
- lỗi mã nguồn
- cách lưu trữ số lớn trong c
- Check code hộ mình với :(
-
17-12-2015, 11:03 AM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Bạn thử thêm dấu () trong: *DataTextLCD->BYTE = HighNibble; xem.
-
17-12-2015, 06:25 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
*(DataTextLCD->BYTE)
à ko phải, operator -> ưu tiên hơn * nên viết *DataTextLCD->BYTE vẫn đúng.
chỗ sai là BIT và BYTE là CON TRỎ, nên khai báo
TextLCDDataPort_TypeDef *DataTextLCD;
thì BIT và BYTE ko biết trỏ tới đâu => khi deref nó sẽ gây ra lỗi. Hơn nữa DataTextLCD cũng chưa được cấp phát bộ nhớ nên khi gọi ->BYTE là đã gây ra lỗi rồi.
phải malloc cho DataTextLCD, rồi malloc cho DataTextLCD->BIT và malloc cho DataTextLCD->BYTE
-
18-12-2015, 10:16 AM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Chưa hiểu ý malloc của bạn lắm! Như vậy khi mallloc của 3 thằng đó thì code chạy được?
Thêm nữa là mình có nghe một khái niệm con trỏ trỏ tới con trỏ. Ở trong trường hợp *DataTextLCD trỏ tới *BYTE thì không phải là con trỏ trỏ đến con trỏ sao?
-
18-12-2015, 06:03 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mã:typedef union TextLCDDataPort_Union { unsigned char *BYTE; struct { unsigned char B0 : 1; unsigned char B1 : 1; unsigned char B2 : 1; unsigned char B3 : 1; unsigned char B4 : 1; unsigned char B5 : 1; unsigned char B6 : 1; unsigned char B7 : 1; }BIT; }TextLCDDataPort_TypeDef; TextLCDDataPort_TypeDef DataTextLCD;
-
18-12-2015, 06:30 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Cảm ơn mấy bạn nhiều lắm! Mình học điện tử, có dùng C để lập trình, nên kiến thức chưa sâu, có gì mong các bạn giúp đỡ thêm!
Đúng là khi mình khai báo như thế này thì chạy được:
Mã:typedef union TextLCDDataPort_Union { unsigned char *BYTE; struct { unsigned char B0 : 1; unsigned char B1 : 1; unsigned char B2 : 1; unsigned char B3 : 1; unsigned char B4 : 1; unsigned char B5 : 1; unsigned char B6 : 1; unsigned char B7 : 1; }BIT; }TextLCDDataPort_TypeDef; TextLCDDataPort_TypeDef DataTextLCD;
Thêm nữa là mình có nghe một khái niệm con trỏ trỏ tới con trỏ. Ở trong trường hợp *DataTextLCD trỏ tới *BYTE thì không phải là con trỏ trỏ đến con trỏ sao?
- - - Nội dung đã được cập nhật ngày 18-12-2015 lúc 11:30 AM - - -
Gửi bởi greigaz
-
18-12-2015, 07:01 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi INTP
-
18-12-2015, 07:41 PM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
ồ ta ko để ý cái DataTextLCD là union, vậy thì chỉ cấp phát cho BYTE hoặc BIT thôi
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...