lavorare con stringhe di caratteri ?

Domanda forse stupida, ma c'e' il modo di lavorare con stringhe di caratteri direttamente nello sketch ? (intendo caratteri ascii, l'intera tabella, non solo lettere o numeri)

Piu precisamente, prima "costruire" una stringa di caratteri aggiungendo in coda alla stringa specifici caratteri secondo il risultato della lettura di alcuni ingressi, poi con un comando confrontare tale stringa con altre memorizzate in precedenza, e svolgere determinate sequenze di operazioni secondo il risultato ?

Nel caso vi stiate chiedendo il perche' di una richiesta apparentemente assurda, mi e' venuta l'idea di costruire una serratura a combinazione con 8 pulsanti, ognuno dei quali puo dare 3 diversi risultati (quindi e' come se la tastiera avesse 24 tasti) piu due tasti di operazione, che possa essere programmata per eseguire differenti sequenze di operazioni secondo le differenti combinazioni memorizzabili in fase di setup, e per incrementarne la sicurezza vorrei fare in modo che le combinazioni memorizzate non fossero distinguibili dal resto del programma, neppure avendo accesso fisico all'elettronica, quindi userei caratteri ascii assegnati casualmente ai vari valori, anziche' numeri o valori sequenziali ... e' una cosa possibile con le risorse di, diciamo, un 1284 ?

Inoltre, in fase di setup, per essere certi di non perdere mai la programmazione delle varie combinazioni, cosa e' piu sicuro per memorizzarcele, la flash interna, l'eeprom interna, o un'eeprom esterna indipendente ? ... se fosse la flash interna, come si puo fare a garantire che nell'area in cui si memorizzano i dati, lo sketch poi non possa piu sovrascrivere in nessun modo (a parte durante un successivo setup, ovviamente) ?

Credo di non aver capito la domanda ...
... perché in un char (che sia solo un char, che sia una stringa, ovvero un array di char) tu puoi mettere un qualsiasi valore da 0x00 a 0xFF ... ::slight_smile:

Guglielmo

Volevo lavorare direttamente con i caratteri, creando una stringa (che puo avere lunghezze diverse secondo la password inserita) aggiungendo un carattere alla volta alla stringa, per poi effettuare i confronti quando viene promuto il pulsante "ok", invece di effettuare il confronto carattere per carattere ... anche perche' il carattere risultante da ogni tasto cambia in base al tempo per il quale e' rimasto premuto, ed ogni tasto puo dare 3 risultati diversi (in pratica e' come se avessi una tastiera a 24 tasti, ma con soli 8 tasti, piu difficile azzeccare la combinazione per tentativi)

Il char puo avere qualsiasi valore da 00 a FF, come dici, ma nel caso di una combinazione ad 8 o 10 pressioni consecutive ? ... non voglio effettuare un controllo tasto per tasto, perche' deve essere possibile usare qualsiasi numero di combinazioni, quindi anche parte di un'altra combinazione (ad esempio, se avessi 2 combinazioni, 1234 e 123456, ed effettuassi il controllo tasto per tasto, una volta inserito 1234 verrebbe eseguito il codice corrispondente anche se avessi voluto inserire invece 123456 ... non so come spiegarmi meglio ...

bho non capisco nemmeno io.....
hai 8 pulsanti ed ognuno può assumere 3 risultati diversi e quindi ti basta un byte per carattere.bha!

Etemenanki:
se avessi 2 combinazioni, 1234 e 123456, ed effettuassi il controllo tasto per tasto, una volta inserito 1234 verrebbe eseguito il codice corrispondente anche se avessi voluto inserire invece 123456 ...

1234 non è uguale a 123456 sia se lo consideri come numero che come stringa, al limite si può dire che 1234 è contenuto in 123456.
Nel tuo caso devi creare degli array di char con lunghezza pari a quella combinazione più lunga, li memorizzi in EEPROM, non viene cancellata quando carichi lo skech, e sono i campioni da confrontare quando introduci una combinazione da tastiera, ovviamente per il match completo.

astrobeed:
...
Nel tuo caso devi creare degli array di char con lunghezza pari a quella combinazione più lunga, li memorizzi in EEPROM, non viene cancellata quando carichi lo skech, e sono i campioni da confrontare quando introduci una combinazione da tastiera, ovviamente per il match completo.

Si, questo e' quello che volevo fare, ma adesso il mio problema e' capire come "costruire" la stringa da confrontare un carattere alla volta in base ai pulsanti che premo (ricordati che io non sono un programmatore :P) ... il reference non aiuta (spiega solo cos'e' un char, cosa che sapevo gia), ma a me serviva una cosa diversa ...

Pensavo di usare un vecchio esempio che avevo trovato tempo fa e che usava diretamente String, definendo prima di tutto String codice=""; e String addcar=""; (codice per la stringa da creare e addcar per il carattere da aggiungere di volta in volta), e poi fare

codice = codice + addcar;

ogni volta che le subroutine di lettura mi restituiscono un flag che dice che in addcar c'e' un carattere da aggiungere ... ma non so se potrebbe funzionare con arduino ... e poi non so se potrei effettuare il confronto con le stringhe memorizzate al termine ...

... mi sa che mi sto incasinando un po ...

... etem, con l'array di char è molto più semplice e ... meno dispendioso in termine di risorse (... se eviti di usare la classe String è meglio).

Lavorare con un array di char è banale ... indirizzi il singolo char tramite l'indice dell'array ... esempio :

char mioArray[20];
byte idx;
...
...
idx = 10;
mioArray[idx] = 0x55;

Per la manipolazione delle stringhe di char ... fai sempre riferimento alla AVR libc ed in particolare alla libreria "string" dove trovi TUTTO quello che ti serve per manipolare le stringhe di caratteri :wink:

Guglielmo

... è banale ...

... e' banale per un programmatore, ma io non lo sono ... ad esempio, per me e' banale disassemblare un'orologio antico, o un'arma, o una macchina fotografica meccanica, o una fotocopiatrice, o un qualche meccanismo complesso, per ripararli e poi rimetterli insieme, anche se a volte non li ho mai visti prima ... sono cose che posso prendere in mano e studiare, e la maggior parte delle volte arrivo a capirle senza particolari problemi, mi e' sempre successo cosi, quindi lo do per scontato ... con la programmazione del software invece, ho iniziato da poco, e ci litigo poche volte (e la maggior parte delle volte vince lui :stuck_out_tongue: :D)

Comunque intendo cercare di capire come farla, questa cosa, anche se e' un progetto che ho appena iniziato e che porto avanti nei ritagli di tempo, quindi grazie, cerchero' di studiarmi tutti quegli esempi, e se sopravvivo (:P) ve le rompero' di nuovo con altre domande :wink: :smiley:

Etemenanki:
. per me e' banale disassemblare un'orologio antico, o un'arma, o una macchina fotografica meccanica, o una fotocopiatrice, o un qualche meccanismo complesso, per ripararli e poi rimetterli insieme,

Ho questa da riparare, mi dai una mano ? :grin:

Etemenanki:
....
Comunque intendo cercare di capire come farla, questa cosa, anche se e' un progetto che ho appena iniziato e che porto avanti nei ritagli di tempo, quindi grazie, cerchero' di studiarmi tutti quegli esempi, e se sopravvivo (:P) ve le rompero' di nuovo con altre domande :wink: :smiley:

etem, ti sei già letto qualche cosa sull'argomento ? Esempio: QUESTO ? :wink:

Guglielmo

Non puoi fare la stessa cosa che si fa quando si concatenano char in una stringa derivanti da seriale o da SPI?

readString += (char)c;
opp readString += "1";
...
...
readString = "";

gpb01: l'avevo scaricato mesi fa e letto al volo, studiero' meglio anche quello :wink:

pablos: non lo so, perche' non uso la seriale, magari si ... io fin'ora sono riuscito solo a farmi le routines che restituiscono i caratteri secondo il tempo di pressione dei tasti, in questo modo:

Void readp1()
{
	if ((excl1 = 0) && (excl2 = 0) && (excl3 = 0) && (excl4 = 0) && (excl5 = 0) && (excl6 = 0) && (excl7 = 0) && (excl8 = 0))
	{
		p1 = digitalRead(pinP1)
		if ((p1 != p1a) && (p1a == 0))
		{
			safemillis = millis();
			excl1 = 1;
			p1a = p1;
			millis_p = millis();
			tone(pinbip, 1000, 70); 
		}
	}
	If (excl1 = 1)
	{
		if ((millis() - millis_p == 500) || (millis() - millis_p == 1000))
		{
			tone(pinbip, 1000, 70); 
		}	
		if ((p1 != p1a) && (p1a == 1))
		{
			if (millis() - millis_p <= 500)
			{
				addcar = "*"
			}
			else if ((millis() - millis_p > 500) && (millis() - millis_p <= 1000))
			{
				addcar = "#"
			}	
			else
			{
				addcar = "§"
			}
			safemillis = millis();
			p1a = p1;
			excl1 = 0;
			inst = 1;
		}
	}
}

(non dirmi che e' incasinato, perche' lo so ... :P) ... sono 8 subroutines (da readp1 a readp8) chiamate in sequenza dal loop, mutualmente esclusive (se un tasto e' premuto, tutte le altre sono ignorate finche' non viene rilasciato ed ha restituito il carattere, cosi anche se si premono due tasti insieme non si incasina), ognuna delle quali restituisce un diverso carattere (nella variabile addcar) a secondo se il pulsante e'rimasto premuto meno di mezzo secondo, fra mezzo ed un secondo, e piu di un secondo (safemillis e' per il ciclo di controllo esterno che resetta tutto se fra due qualsiasi operazioni passano piu di due secondi e mezzo, nel caso ti chiedessi perche' non e' controllata li dentro) ... probabilmente possono essere modificate per l'uso che intendi tu, o per quello che intende gpb01 ... devo studiarci su di piu (oltre tutto, per ora non posso neppure testare alcuna modifica in pratica, perche' fra tutti i casini e lavori vari a casa negli ultimi mesi, non trovo piu la uno che usavo per le prove, quindi finche' non la ritrovo o finche' non mi arrendo e ne ordino un'altra, sto facendo tutto "a mente" con il notepad++, e non e' semplice ...)

astrobeed:
Ho questa da riparare, mi dai una mano ? :grin:
...

Gia fatto ... basta tagliare il filo giallo ... :stuck_out_tongue: :smiley: :smiley: :smiley:

Etemenanki:
Gia fatto ... basta tagliare il filo giallo ... :stuck_out_tongue: :smiley: :smiley: :smiley:

Ho un problema, sono tutti rossi. :smiley:

mi sa che non avete capito come si fa un cablaggio serio :o

Il problema, con quel tipo di cablagi, e' quando qualcosa non funziona, e ti rendi conto che si tratta del PRIMO cavo che hai installato ... quello sotto a tutti gli altri ... :smiling_imp: :smiling_imp: :smiling_imp:

Etemenanki:
Domanda forse stupida, ma c'e' il modo di lavorare con stringhe di caratteri direttamente nello sketch ? (intendo caratteri ascii, l'intera tabella, non solo lettere o numeri)

Io indirei un nuovo concorso a premi: chi capisce le domande sul software di @Etem, vince una bambolina :grin:

nid69ita:
Io indirei un nuovo concorso a premi: chi capisce le domande sul software di @Etem, vince una bambolina :grin:

... Kattivo ... :cry: :cry: :cry: ... se vinci tu ti regalo lui

:stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:

Seriamente, mi serve un modo per "creare" una stringa aggiungendo carattere per carattere (con i caratteri forniti uno alla volta da una subroutine), e poi per confrontare la stringa finale con altre memorizzate in precedenza ... la stringa finale non ha una lunghezza predefinita (cioe', ne avra' una massima, ma potra' contenere anche un numero minore di caratteri) ...

L'uso della classe String mi e' ststo sconsigliato, quindi adesso sto cercando di capire come realizzarlo in altro modo ...

Etemenanki:
Seriamente, mi serve un modo per "creare" una stringa aggiungendo carattere per carattere (con i caratteri forniti uno alla volta da una subroutine),

Nulla di più semplice :slight_smile:
Basta che crei un array e un indice che tiene conto della posizione a cui sei arrivato, ogni volta che aggiungi un carattere incrementi l'indice di uno, inizialmente l'array deve contenere tutti 0x00.
Adesso devo uscire, appena posso ti scrivo qualche riga di codice.

astrobeed:
Adesso devo uscire, appena posso ti scrivo qualche riga di codice.

NO Astro ... così non imparerà mai ... :smiling_imp:

Ha sufficiente documentazione per riuscirci ... almeno ad impostare la cosa ... :grin:

Guglielmo

P.S. : Etem ... hai un MP ... con un libro ...