Pages: 1 [2]   Go Down
Author Topic: Calcolare lunghezza stringa... ottimizzazione?  (Read 1360 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 5
Posts: 873
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

secondo me quella di lesto e' fiqua ma te la cavi prima con la soluzione di tuxduino
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scrivo al volo dall'iphone...
Lesto ma quel codice funziona anche per le float?
Ad occhio mi sembra possa funzionare solo per le int.
Ma Io ho prevalentemente float!

quanti numeri vuoi dopo la virgola?  se per esempio 3, basta moltiplicare il tuo float per 1000 e poi esegui lo stesso identico codice, aggiungendo 1 per la virgola.

@lesto
pero' se metti totlaLen=1
salti quell' if (a==0) totlaLen+=1; //nel caso sia già 0, bisogna dimensionare per contenere lo 0

ahaha tie' beccati questa semplificazione (e cosi' mi vendico)  smiley-mr-green

hai ragione!

totlaLen =0 è corretto
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
God Member
*****
Karma: 0
Posts: 600
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eccoci qua per l'aggiornamento smiley
Diamo prima i giusti meriti.
L'idea di tuxino era ottima!
A fronte di un aumento di soli 40byte nella dimensione dello sketch... si guadagnavano quasi 100byte di ram!
Difficile fare di meglio smiley
Eppure... lesto parrebbe avercela fatta smiley-razz
Rimaneggiando un po' il suo codice, la FREERAM aumenta di ben 140(!!) e le dimensioni dello sketch diminuiscono di ben 2k!!

Il codice, che sto testando ora è questo:

 
Code:
/*----- Pachube -----*/
    // PACHUBE OTTIMIZZATO LESTO
    ContentLenghtPachubeVAR = 0;
    ContentLenghtFloat(mydata.toutES);
    ContentLenghtFloat(mydata.houtES);
    ContentLenghtFloat(mydata.tinES);
    ContentLenghtFloat(mydata.hinES);
    ContentLenghtFloat(mydata.T1ES);               
    ContentLenghtFloat(mydata.T2ES);
    ContentLenghtUnsLong(mydata.mediaHzES);

    Serial.print(F("ContentLenghtPachubeVAR: "));
    Serial.println(ContentLenghtPachubeVAR);

e poi queste due funzioni fuori dal loop:

Code:
/*--------- Calcolo ContentLenght Float ---------*/
void ContentLenghtFloat (float contenitoreFloat) {
  ContentLenghtPachubeVAR+=1;     // aggiungo il punto decimale
  int operatoreVoidPachube = contenitoreFloat * 10; // trasformo la float in un numero intero. 23.4 diventa 234 considerando un solo decimale
  if ( contenitoreFloat == 0 ){   // se la temperatura è 0
    ContentLenghtPachubeVAR+=2;   // bisogna dimensionare il content lenght per contenere 0.0
  }
  if (contenitoreFloat < 0) {     // se la temperatura è negativa
    ContentLenghtPachubeVAR+=1;   // aggiungo il segno meno al calcolo del ContentLenght
    while ( operatoreVoidPachube < 0 ) {  // fin tanto che è < di 0
      operatoreVoidPachube /= 10; // divido per dieci
      ContentLenghtPachubeVAR+=1; // ed incremento il content lenght ad ogni divisione
    }
  }
  else {                          // altrimenti la temperatura è positiva
    while ( operatoreVoidPachube > 0 ) {  // fin tanto che è > di 0
      operatoreVoidPachube /= 10;         // divido per dieci
      ContentLenghtPachubeVAR+=1; // ed incremento il content lenght ad ogni divisione
    }
  }
  Serial.println(contenitoreFloat,1);
  Serial.println (operatoreVoidPachube);
}

/*--------- Calcolo ContentLenght UnsignedLong ---------*/
void ContentLenghtUnsLong (unsigned long contenitoreLong) {
  Serial.println(contenitoreLong);
  if ( contenitoreLong == 0 ){ 
    ContentLenghtPachubeVAR+=1;   // se il valore è 0 bisogna dimensionare per contenere 0
  }
  while ( contenitoreLong > 0 ) {
    contenitoreLong /= 10;
    ContentLenghtPachubeVAR+=1;
  }
  Serial.println(contenitoreLong);

}

Le sto testando ora e sembra funzionino. Gestiscono i valori negativi ecc.
L'unico mio dubbio.
Se una float con un decimale è zero e faccio un print ottengo
0.0 ?
Oppure semplicemente 0?

Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
Eppure... lesto parrebbe avercela fatta smiley-razz
Rimaneggiando un po' il suo codice, la FREERAM aumenta di ben 140(!!) e le dimensioni dello sketch diminuiscono di ben 2k!!


Quote
Se una float con un decimale è zero e faccio un print ottengo
0.0 ?
Oppure semplicemente 0?
sono abbastanza sicuro che sia 0

piccola otimizzazione:
Code:
if (contenitoreFloat < 0) {     // se la temperatura è negativa
    ContentLenghtPachubeVAR+=1;   // aggiungo il segno meno al calcolo del ContentLenght
    while ( operatoreVoidPachube < 0 ) {  // fin tanto che è < di 0
      operatoreVoidPachube /= 10; // divido per dieci
      ContentLenghtPachubeVAR+=1; // ed incremento il content lenght ad ogni divisione
    }
  }
  else {                          // altrimenti la temperatura è positiva
    while ( operatoreVoidPachube > 0 ) {  // fin tanto che è > di 0
      operatoreVoidPachube /= 10;         // divido per dieci
      ContentLenghtPachubeVAR+=1; // ed incremento il content lenght ad ogni divisione
    }
  }

diventa:
Code:
if (contenitoreFloat < 0) {     // se la temperatura è negativa
    ContentLenghtPachubeVAR+=1;   // aggiungo il segno meno al calcolo del ContentLenght
    contenitoreFloat*=-1; //lo trasformo in numero positivo
    }
    while ( operatoreVoidPachube > 0 ) {  // fin tanto che è < di 0
      operatoreVoidPachube /= 10; // divido per dieci
      ContentLenghtPachubeVAR+=1; // ed incremento il content lenght ad ogni divisione
    }
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
God Member
*****
Karma: 0
Posts: 600
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Se una float con un decimale è zero e faccio un print ottengo
0.0 ?
Oppure semplicemente 0?
sono abbastanza sicuro che sia 0
E' che, ovviamente, non ho modo di riprodurre la condizione con i sensori...
c'è qualche posto dove poter aver la certezza di come viene rappresentata una float = 0 con un decimale ?
Tendenzialmente quando il decimale è zero, questo viene cmq stampato.
24.0 °C, 33.0% di umidità ecc

Quote
Code:
piccola otimizzazione:
    contenitoreFloat*=-1; //lo trasformo in numero positivo
 

E questa roba cos'è?
Io stavo cercando ora come fare il modulo di un valore...
Logged

Offline Offline
God Member
*****
Karma: 5
Posts: 873
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma imparare un minimo di C, no ?

contenitoreFloat*=-1;

equivale a

contenitoreFloat= contenitoreFloat * (-1);
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
contenitoreFloat*=-1;

significa

Code:
contenitoreFloat=contenitoreFloat*(-1);

se moltiplichi un numero per -1... inverti il suo segno :-)

esiste il metodo abs() per avere il modulo, ma sicuramente occupa più byte di una soluzione "ad-hoc"

ps. preceduto da legacy

@legacy: la signorina ha iniziato da un paio di mesi, e partendo da 0, legge vari sensori, utilizza vari attuatori e butta tutto su internet, tra l'altro creandosi PCB home-made.. direi che un errorino se lo può permettere smiley
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
God Member
*****
Karma: 5
Posts: 873
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@lesto
io non me la bevo.
« Last Edit: March 01, 2012, 06:08:36 pm by legacy » Logged

Offline Offline
God Member
*****
Karma: 5
Posts: 873
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

p.s.
il codice di oggi pome l'ho rimosso perche' c'era un problema e non volevo farvi deragliare. Poi me la vedo io, al limite se interessa ve lo riposto corretto.
Logged

Offline Offline
God Member
*****
Karma: 0
Posts: 600
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
contenitoreFloat=contenitoreFloat*(-1);
se moltiplichi un numero per -1... inverti il suo segno :-)

Chissa perché quando scrivo codice mi dimentico della matematica...
Faccio ancora fatica ad usare le due cose contemporaneamente!
BTW l'ottimizzazione fa risparmiare 14 byte di sketch... ma nn credo la userò smiley
Modificando il contenitoreFloat, quando vado a fare il serial print vedo solo valori positivi (ovviamente).
Mentre mantenendo il codice precedente ho un debug seriale dei valori corretti smiley
Ed i debug servono sempre!

Ora mi rimane da capire se la float 0 è 0.0 o 0 (LOL) ma in ogni caso...
La palma di cervellone d'oro va a lesto!
Logged

Pages: 1 [2]   Go Up
Jump to: