Tôi đã tạo một lớp trông giống như một mảng, nhưng thay vì giữ dữ liệu trong chính chương trình, nó truyền byte từ một tệp (để giảm tác động của RAM). Bây giờ tôi đã có tất cả làm việc này, nhưng các lập trình viên phải xác định các lớp sử dụng như sau:Tạo tham số mẫu tại thời gian biên dịch
#define CreateReadOnlyBlock(name, location, size, ...) \
template<> \
const unsigned int ReadOnlyBlock<location, size>::Data[] \
__asm__(".readonly__" #location "__" #name) \
= { __VA_ARGS__ }; \
ReadOnlyBlock<location, size> name;
Ví dụ:
//A read only array of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray, 0, 4, 0, 1, 2, 3);
Lưu ý rằng đây là một bộ xử lý nhúng, và chỉ thị asm đi qua một công cụ trong trình biên dịch để tạo tệp chỉ đọc.
Vì vậy, đây là câu hỏi của tôi: làm cách nào tôi có thể loại bỏ các biến "vị trí" và "kích thước"? Tôi ghét rằng các lập trình viên phải gõ những người theo cách thủ công, và rất thích một số cách để tạo ra những người tại thời gian biên dịch. Vì vậy, thay vì các lập trình viên cần phải gõ:
//A read only array at location 0 of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray1, 0, 4, 0, 1, 2, 3);
//A read only array at location 4 of {4, 5, 6, 7}
CreateReadOnlyBlock(readOnlyArray2, 4, 4, 4, 5, 6, 7);
Họ chỉ có thể gõ:
CreateReadOnlyBlock(readOnlyArray1, 0, 1, 2, 3);
CreateReadOnlyBlock(readOnlyArray2, 4, 5, 6, 7);
Và hằng phù hợp sẽ được tạo ra. Về cơ bản tôi đang tìm kiếm một số cách để tạo và đặt các hằng số này dựa trên các định nghĩa trước đó tại thời gian biên dịch. C++ 11 là trò chơi công bằng, tôi chỉ không quen thuộc với nó (một cái gì đó với constexpr có vẻ hợp lý?). Ngoài ra, C-Preprocessor là okay quá nếu nó không làm cho nó xấu hơn nó đã được. Điều này có thể không?
EDIT cho rõ ràng:
Trong lớp ReadOnlyBlock có phương pháp này:
template<const int _location, const int _size> class ReadOnlyBlock
{
...
unsigned int operator[] (size_t index)
{
return LoadFromROM(index + _location);
}
}
Có một phụ thuộc lẫn nhau nội tại giữa các biến vị trí và các tập tin ROM mà tôi không thể nghĩ ra làm thế nào để phá vỡ. Tuy nhiên, tôi do cũng có toàn quyền kiểm soát chuỗi công cụ nhưng tôi cần một cách để chuyển công cụ lắp ráp cách xây dựng tệp cũng như chỉ ra mã C++ nơi các khối nằm trong tệp.
Một EDIT:
Các tập tin và các khối của nó có thể khá lớn, càng nhiều càng tốt 1k từ, vì vậy rất nhiều tiền xử lý ma thuật có thể sụp đổ vì rằng. Ngoài ra, cảm ơn tất cả mọi người đã giúp đỡ cho đến nay!
Các '# location' trong phần '__asm__' thực sự đang giết chết nó. Bạn có thực sự cần điều đó hoặc bạn sẽ hài lòng với một giải pháp của phần còn lại chỉ? –
Kích thước rất dễ dàng, nhưng vị trí sẽ yêu cầu ngữ cảnh. Bản mẫu instantiation là một ngôn ngữ chức năng, và kết quả của instantiation chỉ có thể thay đổi dựa trên những gì bạn truyền vào. Nếu bạn chuỗi các khối như vậy, hoặc tạo bộ nhớ trong một mẫu lớn, nó có thể được thực hiện. Tức là, tạo một 'tuple' của mảng chỉ đọc, mỗi mảng có vị trí và kích thước, bắt đầu từ một số vị trí và được đóng gói. – Yakk
Vì vậy, có lẽ tôi nên đưa lý do cho điều đó. Toán tử [] quá tải trong lớp ReadOnlyBlock gọi LoadFromROM (index + location); Công cụ này tạo ra một tệp chỉ đọc có mỗi khối tại mỗi vị trí được chỉ định và lớp biết để tải từ vị trí đó. Tôi không thể nghĩ ra một cách để loại bỏ sự phụ thuộc lẫn nhau, nhưng tôi có toàn quyền kiểm soát công cụ cũng như mã truy cập, vì vậy việc thay đổi nó không nằm ngoài câu hỏi. –