Pages: 1 [2]   Go Down
Author Topic: Come usare tanti Switch Case (o If) [Problemi memoria?]  (Read 1732 times)
0 Members and 1 Guest are viewing this topic.
Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 932
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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...
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 932
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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';
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 932
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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';
« Last Edit: September 14, 2012, 12:13:07 pm by cyberhs » Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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)
« Last Edit: September 14, 2012, 08:09:56 am by m_ri » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@m_ri:
puoi postare il sorgente che hai usato?
Logged


Offline Offline
God Member
*****
Karma: 8
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

è 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..)
Logged

Pages: 1 [2]   Go Up
Jump to: