Go Down

Topic: Come usare tanti Switch Case (o If) [Problemi memoria?] (Read 2581 times) previous topic - next topic

cyberhs

Sospetto che il problema siano non il numero di if o case, ma le costanti stringa.

Quando scrivi Stringa1 = "ABC" la costante viene memorizzata.
Se poi scrivi Stringa2 = "ABC" la costante non viene memorizzata poiché già presente (è un'ottimizzazione base del compilatore)

Perciò, per risolvere il tuo problema, bisogna usare un trucco.

Ho notato che le costanti che usi sono composte più o meno dalle stesse lettere: "A", "U", "V", ecc.

Anzichè scrivere TestRx = "UAU" prova a scrivere TestRx = "U" + "A" + "U"

Ettore Massimo Albani

m_ri

@cyberhs: usare il + per concatenare stringhe va bene con la classe String,non col tipo char[]..
e se ha già problemi col char,figuriamoci con le string..

non puoi scegliere te che lettere assegnare in ogni case dello switch? in questo caso non ci  sarebbero problemi...

cyberhs

@m_ri

Ma dove hai letto che sono char[]?

Comunque se sono char[] tanto meglio: si dichiara globalmente char TestRx[x + 1] ove x è la massima dimensione prevista e poi negli if/case si assegna, al posto di TestRx = "UAU", TestRx[0] = 'U';   TestRx[1] = 'A';   TestRx[2] = 'U'; TestRx[3] = '/0';

m_ri

ho dato per scontato che usasse i char[]..cmq il tuo suggerimento continua a mangiarsi parecchia memoria..è quasi come dichiarare una matrice [139 o quel che è][4 o più]..altra strada è quella della compressione huffman..è facilmente implementabile sull'arduino,e penso che dimezzi la SRAM richiesta..

cmq ripeto la domanda: nei vari case,puoi assegnare la stringa che vuoi,basta che sia unica?oppure hai delle stringhe preconfezionate da inserire?
nel secondo caso,metti la lista..

cyberhs

#19
Sep 14, 2012, 02:44 pm Last Edit: Sep 14, 2012, 07:13 pm by cyberhs Reason: 1
@m_ri

Quote
il tuo suggerimento continua a mangiarsi parecchia memoria..è quasi come dichiarare una matrice [139 o quel che è][4 o più]


Forse non mi sono spiegato bene.

Il vettore char in questione occupa solo i byte strettamente necessari alla stringa che si vuole ottenere.
Ad esempio, supponendo che la stringa massima sia di 5 caratteri ("AUVBK"), dimensionerò globalmente char TestRx[6] e userò sempre il medesimo vettore per tutte le combinazioni:
TestRx = "UAU" ---> TestRx[0] = 'U';   TestRx[1] = 'A';   TestRx[2] = 'U'; TestRx[3] = '/0';
TestRx = "VA" ---> TestRx[0] = 'V';   TestRx[1] = 'A'; TestRx[2] = '/0';
TestRx = "VAU" ---> TestRx[0] = 'V';   TestRx[1] = 'A';   TestRx[2] = 'U'; TestRx[3] = '/0';

m_ri

#20
Sep 14, 2012, 03:02 pm Last Edit: Sep 14, 2012, 03:09 pm by m_ri Reason: 1
ho capito ciò che intendi..in parole spiccie,sposti le stringhe dalla SRAM alla Flash..però occupi lo spazio delle stringhe(splittata in caratteri),più quello degli opcode(istruzione)..quindi occupi tipo il doppio di spazio(un byte di istruzione,più un byte di carattere,per ogni possibile carattere)..

ecco come viene tradotto in assembly un banale switch con 2 case e il tuo assegnamento..
Code: [Select]
00121029  cmp         dword ptr [ebp-10h],2 
0012102D  je          main+2Fh (12103Fh) 
0012102F  jmp         main+3Fh (12104Fh) 
; case 1:
; stringa[0]='a';
00121031  mov         byte ptr [stringa],61h 
; stringa[1]='v';
00121035  mov         byte ptr [ebp-0Bh],76h 
; stringa[2]=0;
00121039  mov         byte ptr [ebp-0Ah],0 
; break;
0012103D  jmp         main+3Fh (12104Fh) 
; case 2:
; stringa[0]='v';
0012103F  mov         byte ptr [stringa],76h 
; stringa[1]='b';
00121043  mov         byte ptr [ebp-0Bh],62h 
; stringa[2]='a';
00121047  mov         byte ptr [ebp-0Ah],61h 
; stringa[3]=0;
0012104B  mov         byte ptr [ebp-9],0 
; break;

l'ho fatto su una macchina a 32 bit,quini ovviamente non guardare troppo il formato degli indirizzi e i vari dword..anzi,a occhio non saprei se l'arduino fa la mov con un'istruzione o ne necessita due(dato che ha un displacement)

leo72


m_ri

è già nei commenti dell'assembler..cosi si capisce meglio a cosa corrispondono le varie istruzioni..note: ho disabilitato le ottimizzazioni(altrimenti con più case avrei avuto jump table) e la protezione dei buffer(escludo che arduino metta dei cookie..)

Go Up