Sto pensando di costruire una lingua per microcontrollori PIC. Voglio poter usare matrici di dimensioni non fisse, come questa:
- Dichiara la variabile come
int[]
- Attendi input dalla connessione seriale
- Rendi la variabile
input
lunga
Penso che una funzione del genere sarebbe utile, ma non so come dovrei andare a implementarla in un compilatore che si compila all'assemblaggio. Voglio che gli array vengano memorizzati su indirizzi di registro consecutivi, ovviamente. Dato che sto lavorando con i PIC, questo deve essere molto efficiente in termini di memoria.
Quando qualcuno scrive int[]
, non penso che sia una buona idea riservare ancora spazio alla memoria per la variabile, vero? Quindi la matrice avrà una dimensione massima fissa. Ad esempio, quando l'array riceve l'indirizzo di memoria 5-100 e altre variabili ottengono 4 e 101, l'array ha i bordi fissi e non può crescere più di 96 registri. Inoltre, quando prenoterei la memoria dall'inizio, diciamo x byte, e alla fine ho solo bisogno di y byte, sto sprecando x - y byte. Non voglio quello.
Questo significa che l'unica opzione che vedo è inizializzare l'array e riservare spazio nel microcontrollore, al volo. Questo richiederà un po 'di memoria e tempo di esecuzione, ovviamente. Ho pensato a un sistema come questo:
- Inizializza un array
int[
x
] = {int, int}
che contiene puntatori all'inizio e alla fine degli array che non sono inizializzati dall'inizio -x
sarebbe la quantità massima di matrici (questa è una concessione, ma è migliore di una lunghezza massima per tutti gli array) - Salva una variabile c = 0 per indicare il numero di array utilizzati
- Memorizza i bordi della memoria inizializzata (riservata) in una variabile da qualche parte
-
Quando una matrice ottiene una lunghezza:
- Metti puntatori all'inizio (il bordo corrente) e fine (il bordo corrente + la lunghezza) nella matrice dal primo punto all'indice c
- Incremento c
Penso che funzionerebbe (no?), ma ci sono alcuni svantaggi, principalmente riguardanti la memoria: ho bisogno di memorizzare l'array, c e la memoria corrente configura come overhead.
Ci sarebbe un modo migliore per implementare matrici di dimensioni non fisse in una lingua per microcontrollori PIC? I miei requisiti sono:
- Carico di memoria insufficiente
- La lunghezza dell'array non deve essere modificata al volo
- Con il sistema che ho ideato, non è possibile memorizzare valori negli array che non sono ancora stati inizializzati. Se ci fosse un sistema in grado di memorizzare valori in una matrice di lunghezza indefinita, sarebbe un vantaggio
- I sistemi più veloci (in fase di esecuzione, la compilazione non ha importanza) sono preferibili