Ho creato una classe simile a una matrice, ma anziché contenere i dati nel programma stesso, esegue il flusso del byte da un file (per ridurre l'impatto della RAM). Ora ho tutto questo lavoro, ma il programmatore deve definire la classe usando la seguente:Generazione dei parametri del modello in fase di compilazione
#define CreateReadOnlyBlock(name, location, size, ...) \
template<> \
const unsigned int ReadOnlyBlock<location, size>::Data[] \
__asm__(".readonly__" #location "__" #name) \
= { __VA_ARGS__ }; \
ReadOnlyBlock<location, size> name;
Esempio:
//A read only array of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray, 0, 4, 0, 1, 2, 3);
Si noti che questo è per un processore embedded, e la direttiva asm passa attraverso uno strumento nell'assemblatore per creare il file di sola lettura.
Quindi, ecco la mia domanda: come posso eliminare le variabili "posizione" e "dimensione"? Detesto che il programmatore debba scriverle manualmente e preferirebbe molto un modo per generarle in fase di compilazione. Così, invece di programmatore dover digitare:
//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);
Potrebbero basta digitare:
CreateReadOnlyBlock(readOnlyArray1, 0, 1, 2, 3);
CreateReadOnlyBlock(readOnlyArray2, 4, 5, 6, 7);
E le costanti appropriate sarebbe generato. Fondamentalmente sto cercando un modo per generare e posizionare queste costanti in base alle definizioni precedenti in fase di compilazione. C++ 11 è un gioco leale, non ne ho molta familiarità (qualcosa con constexpr sembra plausibile?). Inoltre, C-Preprocessor va bene anche se non lo rende più brutto di quello che è già. È possibile?
EDIT per chiarezza:
Nella classe ReadOnlyBlock c'è questo metodo:
template<const int _location, const int _size> class ReadOnlyBlock
{
...
unsigned int operator[] (size_t index)
{
return LoadFromROM(index + _location);
}
}
Esiste un'interdipendenza intrinseca tra la variabile posizione e il file ROM che non riesco a pensare a come rompere. I do hanno il controllo completo sulla catena di strumenti, tuttavia, ma ho bisogno di un modo per passare allo strumento assemblatore come costruire il file e indicare al codice C++ dove i blocchi si trovano nel file.
Un altro EDIT:
Il file ed i suoi blocchi possono essere abbastanza grande, per quanto 1k parole, così un sacco di magia preprocessore potrebbe crollare, dato che. Inoltre, grazie a tutti per l'aiuto finora!
Il '# location' nella parte '__asm__' lo sta davvero uccidendo. Ne hai davvero bisogno o saresti felice solo con una soluzione del resto? –
La dimensione è semplice, ma la posizione richiede un contesto. L'istanziazione dei modelli è un linguaggio funzionale, e il risultato dell'istanza può variare solo in base a ciò che si passa. Se si concatenano tali blocchi o si crea la memoria in un modello grande, è possibile farlo. Ad esempio, create una 'tupla' di array di sola lettura, ognuno con una posizione e dimensioni, partendo da un determinato punto e imballati. – Yakk
Quindi forse avrei dovuto includerne il motivo. L'operatore [] sovraccarico nella classe ReadOnlyBlock chiama LoadFromROM (index + location); Lo strumento crea un file di sola lettura che ha ciascun blocco in ogni posizione specificata e che la classe sa caricare da quel punto. Non riesco a pensare a un modo per eliminare questa interdipendenza, ma ho il pieno controllo sullo strumento e sul codice di accesso, quindi cambiarlo non è fuori questione. –