2012-02-26 23 views
10

cho mỗi chữ cái trong bảng chữ cái tôi có một int-mảng được khai báo như thế này:C++ mảng của con trỏ đến mảng trên nền tảng bộ nhớ hạn chế (Arduino)

int const A[64] ={ 
    0,0,0,0,0,0,0,0, 
    0,0,0,0,0,0,0,0, 
    0,1,1,1,0,0,0,0, 
    0,1,0,1,0,0,0,0, 
    0,1,1,1,0,0,0,0, 
    0,1,0,1,0,0,0,0, 
    0,1,0,1,0,0,0,0, 
    0,0,0,0,0,0,0,0 
}; 

sau đó tôi tạo ra một mảng với các con trỏ tới này.

int const * text[] = { A, B, C }; 

này hoạt động tốt, cho đến khi mà mảng văn bản đạt đến một số lượng nhất định mục khác nhau.

ví dụ công trình này:

int const * text[] = { A, A, A, A, A, A, A, A }; // could even go on much longer 

nhưng điều này bị treo:

int const * text[] = { A, B, C, D }; // it seems the number of different entries matters 

tại sao vậy? tôi nghĩ rằng nếu nó là con trỏ, thì nó không quan trọng những gì nó trỏ đến nó sẽ luôn luôn có kích thước không đổi?

lưu ý rằng điều này được chạy trên nền tảng Arduino, có bộ nhớ rất hạn chế.

+0

Bạn có thể thêm giải thích chi tiết hơn về sự cố xảy ra không? –

+0

xin lỗi nhưng tôi không thể, nền tảng không in bất kỳ lỗi nào. chương trình chỉ chạy hoặc không chạy. – clamp

+0

Các mảng của bạn có được nhắc tới bất kỳ nơi nào khác ngoài việc khởi tạo 'văn bản' không? –

Trả lời

2

Tôi nghi ngờ việc tra cứu vào một mảng có các phần tử giống nhau đang được tối ưu hóa; Nếu int const *text[]; được khai báo trong một tệp tiêu đề và được biên dịch (được xác định) trong một tệp đối tượng riêng biệt, bạn có thể sẽ thấy cùng một vấn đề. Trình liên kết đang làm tốt nhất có thể, nhưng tất cả dữ liệu đó có khả năng chồng lấp với không gian đống/ngăn xếp.

Ít nhất với avr-libc (sử dụng avr-gcc, avr-binutils), có macro hoặc thuộc tính biến, có thể đặt loại dữ liệu không đổi này trong không gian chương trình chỉ đọc lớn hơn (ROM flash).

+0

vì vậy bạn có nghĩa là trình biên dịch/liên kết đang tối ưu hóa các chữ cái không sử dụng? – clamp

+1

@clamp - vâng, nếu biểu tượng đó không bao giờ được tham chiếu.Nếu trình biên dịch biết rằng một tra cứu sẽ trả về 'A', nó sẽ gấp hằng số đó tại thời gian biên dịch; nó không cần thực hiện tra cứu thực tế. –