Pages: [1] 2   Go Down
Author Topic: raggruppare/associare sempre lo stesso codice, ad una lettera  (Read 839 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

volevo chiedere a qualcuno, se posso fare in modo di scrivere una sola volta 10 righe di codice
come queste
if (k0 >= 10 && k1s <= 20) k0=k0-10;
if (k0 >= 20 && k1s <= 30) k0=k0-20;
if (k0 >= 30 && k1s <= 40) k0=k0-30;
if (k0 >= 40 && k1s <= 50) k0=k0-40;
if (k0 >= 50 && k1s <= 60) k0=k0-50;
if (k0 >= 60 && k1s <= 70) k0=k0-60;
if (k0 >= 70 && k1s <= 80) k0=k0-70;
if (k0 >= 80 && k1s <= 90) k0=k0-80;
if (k0 >= 90 && k1s <= 99) k0=k0-90;

e poi richiamare questo codice magari inserendo una sola lettera o lettera piu numero al posto di tutta la "pappardella" per poter risparmiare memoria  e ne avrei bisogno un po di piu a disposizione
« Last Edit: June 30, 2012, 11:42:49 am by GINGARDU » Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

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

Mi par di capire che vuoi k0 compreso fra 0 e 9.
k0 %= 10

Così hai il modulo 10 di k0.
Logged


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

Mi par di capire che vuoi k0 compreso fra 0 e 9.
k0 %= 10

Così hai il modulo 10 di k0.
di preciso volevo imparare   se un "sezione di codice" ripetuta nel codice decine o centinaia di volte
si puo fare diversamente che ripetere il tutto, non è che è un Problema "ripetere" e solo che se l'arduino ha la memoria che ha  smiley-mad   e il progammino che sto tentando di fare l'esaurisce
e mi pare sopratutto per l'enorme quantita di codice ripetuto,

« Last Edit: June 30, 2012, 11:44:19 am by GINGARDU » Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se di preciso vuoi imparare quello che dici sopra devi creare una funzione che racchiude quel codice, in modo da riutilizzarlo semplicemente richiamando la funzione nel tuo codice.
Dai una lettura a wikipedia per capire di cosa stiamo parlando, ma ci sono miliardi di risorse sulla programmazone in rete, puoi provare a cercare quella a te più congeniale
http://it.wikipedia.org/wiki/Funzione_(informatica)
N.
Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

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

Vista appunto la limitata quantità di Ram (più che di Flash), si cerca di ottimizzare sempre, non di fare esperimenti  smiley-wink smiley-wink
Cmq se proprio vuoi ottimizzare il tuo codice, io proverei con un ciclo for per vedere cosa puoi ottenere. Tipo così:

Code:
for (byte temp=10; temp<99; temp +=10) {
  if ((k0 >= temp) && (k0 <= (temp + 9))) {
    k0-=(temp*1);
  }
}

Però rispetto al precedente consuma un sacco di più, anche in termini di calcolo perché se ad esempio k0 è compreso fra 90 e 99, devi farti 9 cicli for e 9 if a vuoto.
Logged


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

Vista appunto la limitata quantità di Ram (più che di Flash), si cerca di ottimizzare sempre, non di fare esperimenti  smiley-wink smiley-wink
Cmq se proprio vuoi ottimizzare il tuo codice, io proverei con un ciclo for per vedere cosa puoi ottenere. Tipo così:

Code:
for (byte temp=10; temp<99; temp +=10) {
  if ((k0 >= temp) && (k0 <= (temp + 9))) {
    k0-=(temp*1);
  }
}

Però rispetto al precedente consuma un sacco di più, anche in termini di calcolo perché se ad esempio k0 è compreso fra 90 e 99, devi farti 9 cicli for e 9 if a vuoto.
grazie lo stesso anche se non ho la minima idea di quello che fa il tuo codice e non so se hai intuito su che che cosa mi sto "allenando"  sto cercando di fare una specie di "voltmetro"  (analogRead) con i display a 7 segmenti in multiplex

solo l'arduino uno e i display collegati direttamente il tutto sembra funzionare ma se aggiungo la 5-6 cifra
supero i 32 k   uff.....
adesso sto rifacendo il tutto (levandoalcune  ripetizioni di codice) sono a 4 quasi cifre e circa 8 k di memoria

mi interessa completarlo perche questo sara il primo progetto che realizzero completo

ma almeno dovrebbe pilotare 6 cifre  e lasciare un po di memoria per altro
e si potrebbe usare per tante cosette, tipo timer,  visualizzatore di temperatura e umidita, calibri digitali ecc..

comunque la mia domanda è ancora valida,

c'è un sistema per associare una parte del programma a qualche "cosa" in modo da non ripetere sempre tutto la parte in caso di bosogno?
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Pavia
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vista appunto la limitata quantità di Ram (più che di Flash), si cerca di ottimizzare sempre, non di fare esperimenti  smiley-wink smiley-wink
Cmq se proprio vuoi ottimizzare il tuo codice, io proverei con un ciclo for per vedere cosa puoi ottenere. Tipo così:

Code:
for (byte temp=10; temp<99; temp +=10) {
  if ((k0 >= temp) && (k0 <= (temp + 9))) {
    k0-=(temp*1);
  }
}

Però rispetto al precedente consuma un sacco di più, anche in termini di calcolo perché se ad esempio k0 è compreso fra 90 e 99, devi farti 9 cicli for e 9 if a vuoto.
grazie lo stesso anche se non ho la minima idea di quello che fa il tuo codice e non so se hai intuito su che che cosa mi sto "allenando"  sto cercando di fare una specie di "voltmetro"  (analogRead) con i display a 7 segmenti in multiplex

solo l'arduino uno e i display collegati direttamente il tutto sembra funzionare ma se aggiungo la 5-6 cifra
supero i 32 k   uff.....
adesso sto rifacendo il tutto (levandoalcune  ripetizioni di codice) sono a 4 quasi cifre e circa 8 k di memoria

mi interessa completarlo perche questo sara il primo progetto che realizzero completo

ma almeno dovrebbe pilotare 6 cifre  e lasciare un po di memoria per altro
e si potrebbe usare per tante cosette, tipo timer,  visualizzatore di temperatura e umidita, calibri digitali ecc..

comunque la mia domanda è ancora valida,

c'è un sistema per associare una parte del programma a qualche "cosa" in modo da non ripetere sempre tutto la parte in caso di bosogno?

Io proverei a vedere come funzionano le "funzioni" (come ti suggerivano gli altri). Se ho capito bene fanno proprio al caso tuo e vedrai che non sono difficili per nulla smiley
Logged

"Sono convinto che l'informatica abbia molto in comune con la fisica...Dentro i confini del computer, sei tu il creatore. Controlli – almeno

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

@Gingiardu:
come fai a superare 32K di firmware con il pilotaggio di un display? Mi sembra eccessivo. Hai altre cose insieme? Che lib carichi?

PS:
il mio codice fa esattamente quello che fanno i tuoi 10 if uno dietro l'altro. Se vuoi ti sviluppo i primi 2 passaggi:
for (byte temp=10; temp<99; temp +=10) {
  if ((k0 >= temp) && (k0 <= (temp + 9))) {
    k0-=(temp*1);
  }
}

temp parte da 10
confronto: k0>=10 && k0<=19? Sì: k0 = k0-(10*1)
no: temp = temp+10
confronto: k0>=20 && k0<=29? Sì: k0 = k0-(10*2)
ecc...
Logged


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

@Gingiardu:
come fai a superare 32K di firmware con il pilotaggio di un display? Mi sembra eccessivo. Hai altre cose insieme? Che lib carichi?

PS:
il mio codice fa esattamente quello che fanno i tuoi 10 if uno dietro l'altro. Se vuoi ti sviluppo i primi 2 passaggi:
for (byte temp=10; temp<99; temp +=10) {
  if ((k0 >= temp) && (k0 <= (temp + 9))) {
    k0-=(temp*1);
  }
}

temp parte da 10
confronto: k0>=10 && k0<=19? Sì: k0 = k0-(10*1)
no: temp = temp+10
confronto: k0>=20 && k0<=29? Sì: k0 = k0-(10*2)
ecc...

purtroppo non adopero nessun altra cosa,
 con il nuovo codice sono a 9 k di memoria 3 cifre
provero il ciclo for per tutti gli if che alla fine dovrebbero essere il doppio di quelli postati

tutto il programma non deve superare i 12-15 millisecondi per "girare"  se no  i display iniziano a "vibrare"
Code:
if (k0 >= 1000 && k0 <= 2000) k0=k0-1000;
if (k0 >= 2000 && k0 <= 3000) k0=k0-2000;
if (k0 >= 3000 && k0 <= 4000) k0=k0-3000;
if (k0 >= 4000 && k0 <= 5000) k0=k0-4000;
if (k0 >= 5000 && k0 <= 6000) k0=k0-5000;
if (k0 >= 6000 && k0 <= 7000) k0=k0-6000;
if (k0 >= 7000 && k0 <= 8000) k0=k0-7000;
if (k0 >= 8000 && k0 <= 9000) k0=k0-8000;
if (k0 >= 9000 && k0 <= 9999) k0=k0-9000;



if (k0 >= 100 && k0 <= 200) k0=k0-100;
if (k0 >= 200 && k0 <= 300) k0=k0-200;
if (k0 >= 300 && k0 <= 400) k0=k0-300;
if (k0 >= 400 && k0 <= 500) k0=k0-400;
if (k0 >= 500 && k0 <= 600) k0=k0-500;
if (k0 >= 600 && k0 <= 700) k0=k0-600;
if (k0 >= 700 && k0 <= 800) k0=k0-700;
if (k0 >= 800 && k0 <= 900) k0=k0-800;
if (k0 >= 900 && k0 <= 999) k0=k0-900;



if (k0 >= 10 && k0 <= 20) k0=k0-10;
if (k0 >= 20 && k0 <= 30) k0=k0-20;
if (k0 >= 30 && k0 <= 40) k0=k0-30;
if (k0 >= 40 && k0 <= 50) k0=k0-40;
if (k0 >= 50 && k0 <= 60) k0=k0-50;
if (k0 >= 60 && k0 <= 70) k0=k0-60;
if (k0 >= 70 && k0 <= 80) k0=k0-70;
if (k0 >= 80 && k0 <= 90) k0=k0-80;
if (k0 >= 90 && k0 <= 99) k0=k0-90;

if (k1s >= 1000 && k1s <= 2000) k1s=k1s-1000;
if (k1s >= 2000 && k1s <= 3000) k1s=k1s-2000;
if (k1s >= 3000 && k1s <= 4000) k1s=k1s-3000;
if (k1s >= 4000 && k1s <= 5000) k1s=k1s-4000;
if (k1s >= 5000 && k1s <= 6000) k1s=k1s-5000;
if (k1s >= 6000 && k1s <= 7000) k1s=k1s-6000;
if (k1s >= 7000 && k1s <= 8000) k1s=k1s-7000;
if (k1s >= 8000 && k1s <= 9000) k1s=k1s-8000;
if (k1s >= 9000 && k1s <= 9999) k1s=k1s-9000;

if (k1s >= 100 && k1s <= 200) k1s=k1s-100;
if (k1s >= 200 && k1s <= 300) k1s=k1s-200;
if (k1s >= 300 && k1s <= 400) k1s=k1s-300;
if (k1s >= 400 && k1s <= 500) k1s=k1s-400;
if (k1s >= 500 && k1s <= 600) k1s=k1s-500;
if (k1s >= 600 && k1s <= 700) k1s=k1s-600;
if (k1s >= 700 && k1s <= 800) k1s=k1s-700;
if (k1s >= 800 && k1s <= 900) k1s=k1s-800;
if (k1s >= 900 && k1s <= 999) k1s=k1s-900;

if (k1s3 >= 1000 && k1s <= 2000) k1s3=k1s3-1000;
if (k1s3 >= 2000 && k1s <= 3000) k1s3=k1s3-2000;
if (k1s3 >= 3000 && k1s <= 4000) k1s3=k1s3-3000;
if (k1s3 >= 4000 && k1s <= 5000) k1s3=k1s3-4000;
if (k1s3 >= 5000 && k1s <= 6000) k1s3=k1s3-5000;
if (k1s3 >= 6000 && k1s <= 7000) k1s3=k1s3-6000;
if (k1s3 >= 7000 && k1s <= 8000) k1s3=k1s3-7000;
if (k1s3 >= 8000 && k1s <= 9000) k1s3=k1s3-8000;
if (k1s3 >= 9000 && k1s <= 9999) k1s3=k1s3-9000;



if (k1s3 >= 100 && k1s3 <= 200) k1s3=k1s3-100;
if (k1s3 >= 200 && k1s3 <= 300) k1s3=k1s3-200;
if (k1s3 >= 300 && k1s3 <= 400) k1s3=k1s3-300;
if (k1s3 >= 400 && k1s3 <= 500) k1s3=k1s3-400;
if (k1s3 >= 500 && k1s3 <= 600) k1s3=k1s3-500;
if (k1s3 >= 600 && k1s3 <= 700) k1s3=k1s3-600;
if (k1s3 >= 700 && k1s3 <= 800) k1s3=k1s3-700;
if (k1s3 >= 800 && k1s3 <= 900) k1s3=k1s3-800;
if (k1s3 >= 900 && k1s3 <= 999) k1s3=k1s3-900;
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma giusto per capire a te serve che k non sia maggiore di 10?

in tal caso basta un
Code:
while(k >= 10) k/10;
controlla che k non sia superiore uguale a 10, nel caso lo sia inizia un ciclio dividendo k per 10 continuamente finchè non rientra nella condizione del while ovvero k >= 10

non puoi spiegare meglio il tuo progetto per bene? magari esiste un altro modo più "bello" per fare le cose
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

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

Sbagli approccio, non puoi infarcire il programma di tutti quegli if.
Che poi alla fine sono tutti ridondanti e riducibili con diverse opzioni. Certe volte non conta cosa si vuol fare ma come lo si fa. Sul come farlo hai già diverse risposte: dalle funzioni ai metodi che ti ho mostrato.

Poi io non so esattamente cosa vuoi fare, anzi non l'ho proprio capito  smiley-sweat quindi non giudico bene.
Hai una lettura  che vuoi scomporre nelle singole cifre?

Se ti può far comodo, questo è un pezzettino di poche righe del firmware della mia stazioncina meteo che spedisce via I2C un numero di 4 cifre nel formato NNNNN ad un Tiny84 che poi lo visualizza.
Ma tu puoi estrarre l'algoritmo e riproporlo per il tuo display:

Code:
void inviaNumeroGrande(int numero) {
    int temp, num;
    int misura;

    if (numero>9999) {
        misura=9999;
    } else if (numero>999) {
        misura=999;
    } else if (numero>99) {
        misura=99;
    } else {
        misura=9;
    }
    num=numero;
    Wire.beginTransmission(LCD);
    Wire.send(0x02);
    do {
        if (num>misura) {
            temp=int(num/(misura+1));
            Wire.send(char(temp+4void inviaNumeroGrande(int numero) {
    int temp, num;
    int misura;

    if (numero>9999) {
        misura=9999;
    } else if (numero>999) {
        misura=999;
    } else if (numero>99) {
        misura=99;
    } else {
        misura=9;
    }
    num=numero;
    Wire.beginTransmission(LCD);
    Wire.send(0x02);
    do {
        if (num>mivoid inviaNumeroGrande(int numero) {
    int temp, num;
    int misura;

    if (numero>9999) {
        misura=9999;
    } else if (numero>999) {
        misura=999;
    } else if (numero>99) {
        misura=99;
    } else {
        misura=9;
    }
    num=numero;
    Wire.beginTransmission(LCD);
    Wire.send(0x02);
    do {
        if (num>misura) {
            temp=int(num/(misura+1));
            Wire.send(char(temp+48));
            num-=(temp*(misura+1));
        } else {
            Wire.send("0");
        }
        misura/=10;
    } while (misura>0);
    Wire.send(char(num+48));sura) {
            temp=int(num/(misura+1));
            Wire.send(char(temp+48));
            num-=(temp*(misura+1));
        } else {
            Wire.send("0");
        }
        misura/=10;
    } while (misura>0);
    Wire.send(char(num+48));8));
            num-=(temp*(misura+1));
        } else {
            Wire.send("0");
        }
        misura/=10;
    } while (misura>0);
    Wire.send(char(num+48));
(.....)
}
Dovrebbe accettare numeri da 0 a 9999, se non ricordo male.
Spedisce 1 cifra alla volta partendo da quella più a SX.
Logged


Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao GINGARDU, sono daccordo con superlol
Quote
non puoi spiegare meglio il tuo progetto per bene? magari esiste un altro modo più "bello" per fare le cose
perché a volte capita di prendere una strada tortuosa fin dall'inizio e poi ci si incasina.
Credo che questo abbia a che fare con l'altro topic in cui chiedevi sull'analogRead.
Capendo bene cosa vorresti fare è molto più semplice aiutarti  smiley
Logged

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

Ciao GINGARDU, sono daccordo con superlol
Quote
non puoi spiegare meglio il tuo progetto per bene? magari esiste un altro modo più "bello" per fare le cose
perché a volte capita di prendere una strada tortuosa fin dall'inizio e poi ci si incasina.
Credo che questo abbia a che fare con l'altro topic in cui chiedevi sull'analogRead.
Capendo bene cosa vorresti fare è molto più semplice aiutarti  smiley
quello che voglio fare principalmente è imparare,  e per quanto riguarda questo progetto voglio far pilotare,
ad arduino uno,
   6 display 7 segmenti,  direttamente senza altri integrati di mezzo, che ovviamente devono visualizzare  un  valore che viene letto in un ingresso analogico  o digitale


l'ingresso analogico puo essere qualsiasi cosa  potenziometro, sensore temperatura, ecc, 
di sicuro poi il codice verra leggermente modificato   in base a quello che devi visualizzare
o se servono solo 3 cifre es per visualizzare un valore standard basta adoperare le prime tre a destra
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

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

@Gingiardu:


PS:
il mio codice fa esattamente quello che fanno i tuoi 10 if uno dietro l'altro. Se vuoi ti sviluppo i primi 2 passaggi:
for (byte temp=10; temp<99; temp +=10) {
  if ((k0 >= temp) && (k0 <= (temp + 9))) {
    k0-=(temp*1);
  }
}

temp parte da 10
confronto: k0>=10 && k0<=19? Sì: k0 = k0-(10*1)
no: temp = temp+10
confronto: k0>=20 && k0<=29? Sì: k0 = k0-(10*2)
ecc...

OK PERFETTO ho inserito il tuo codice con copia e incolla e sembra funzionare perfettamente (display stabili e luminosi)  poi alla fine ne faccio 2 versioni una con i FOR e l'altra "normale"  se funzionano tutti e 2 teniamo quella che occupa meno spazio
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Gingiardu:


PS:
il mio codice fa esattamente quello che fanno i tuoi 10 if uno dietro l'altro. Se vuoi ti sviluppo i primi 2 passaggi:
for (byte temp=10; temp<99; temp +=10) {
  if ((k0 >= temp) && (k0 <= (temp + 9))) {
    k0-=(temp*1);
  }
}
temp parte da 10
confronto: k0>=10 && k0<=19? Sì: k0 = k0-(10*1)
no: temp = temp+10
confronto: k0>=20 && k0<=29? Sì: k0 = k0-(10*2)
ecc...

OK PERFETTO ho inserito il tuo codice con copia e incolla e sembra funzionare perfettamente (display stabili e luminosi)  poi alla fine ne faccio 2 versioni una con i FOR e l'altra "normale"  se funzionano tutti e 2 teniamo quella che occupa meno spazio
secondo me è ancora meglio creare una funzione che ti divida in un array i vari numeri che poi mandi al display, magari usi il leOS per scrivere sui dispaly ad intervalli regolari così sei sicuro che non "sflashino" tanto non credo sia una funzione lunga..
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Pages: [1] 2   Go Up
Jump to: