Salve a tutti, in mente ho un progettino (credo semplice) che mi riconosce delle parole (dei comandi) e in base a queste svolge determinate attività!
Stavo provando così:
Solo che qualcosa non va!
Se apro il serial monitor e dicito la parola "prova" ecco il risultato:
P p
Parola NON riconosciuta
r p
o r
v o
a v
Parola NON riconosciuta
Questo significa che parola[0] e parola[1] assumono tutto e due il valore "p", perchè?
E perchè compare DUE volte il messaggio "Parola NON riconosciuta" quando dovrebbe comparire solo una volta (ed alla fine di tutto)?
non puoi caricare in una stringa da 3 caratteri una parola da 6 ( "prova" piú un zero finale)
con char message[4]; definisci una stringa/array da 4 posizioni ( da 0 a 3) visto che scrivi anche nella posizione 4 sovvrascrivi qualcosa che si trova nella ram nella posizione dopo e questo produce azioni e errori strani e non prevedibili.
uwe ha ragione, se dici char parola[4] hai 4 posizioni, [0], [1], [2] e [3], invece [4] è errato.
ad occhio se l'indentazione è giusta, char leggi(char parola[4]){ ad occhio è una funzione innestata all'interno di un'altra funzione, void controllo(){...
direi che è un errore logico
infine al posto di if((message[0] == parola[0]) && (message[1] == parola[1]) && (message[2] == parola[2]) && (message[3] == parola[3]) && (message[4] == parola[4])){
usa un for, o un while fino al carattere '\0'
ultimo particolare, 'p' è diverso da 'P' (case sensitive), quindi o prima trasformi tutta la stringa in minuscolo/maiuscolo e la confronti o usi questa diversità a tuo vantaggio
jumpjack:
Ma scusate, se non sbaglio già dalla versione 0.21 sono implementate le stringhe, senza dover stare a impazzire coi singoli caratteri! O no?
Mi hai preceduto! Stavo proprio scrivendo che è molto più comodo confrontare stringhe...
Se poi si ha la necessità di lavorare con i singoli caratteri di una stringa, lo si può sempre fare!
Potreste farmi un esempio di come ricevo il testo e lo immagazino su una stringa?
lesto:
ad occhio se l'indentazione è giusta, char leggi(char parola[4]){ ad occhio è una funzione innestata all'interno di un'altra funzione, void controllo(){...
direi che è un errore logico
Cosa intendi per errore logico?
uwefed:
non puoi caricare in una stringa da 3 caratteri una parola da 6 ( "prova" piú un zero finale)
esistono 2 tipi di errori:
sintattici, che sono sgamati dal compilatore (errori di battitura etc...)
logici, che sono errori nella logica del programma, ad esempio dimenticarsi un'operazione etc... il programma "funziona", ma fa quello che vuole
non è uno zero finale ma '\0' che è il carattere di fine stringa
lesto:
logici, che sono errori nella logica del programma, ad esempio dimenticarsi un'operazione etc... il programma "funziona", ma fa quello che vuole
Si ma intendo perchè è un errore inserire un richiamo ad una funzione dentro un'altra funzione?
lesto:
logici, che sono errori nella logica del programma, ad esempio dimenticarsi un'operazione etc... il programma "funziona", ma fa quello che vuole
Si ma intendo perchè è un errore inserire un richiamo ad una funzione dentro un'altra funzione?
credo si sia sbagliato vedendo (come me) che dichiartavi leggi dentro a controllo XD
lo 0 finale è perchè nelle char 1 carattere indica la fine della stringa
per le stinghe la cosa è comoda:
String* nomestringa;
e poi la setti dove vuoi (almeno mi pareva si facesse così) e per il confronto
if (nomestringa == "questo") { se vero } else { se falso }
lesto:
logici, che sono errori nella logica del programma, ad esempio dimenticarsi un'operazione etc... il programma "funziona", ma fa quello che vuole
Si ma intendo perchè è un errore inserire un richiamo ad una funzione dentro un'altra funzione?
credo si sia sbagliato vedendo (come me) che dichiartavi leggi dentro a controllo XD
esatto, errore mio, ho riguardato bene il codice. Mi sembrava che avessi scritto tutta la funzione dentro all'altra funzione, ma credo che il compilatore si incazzi(in effetti non ha molto senso)
superlol:
lo 0 finale è perchè nelle char 1 carattere indica la fine della stringa
per le stinghe la cosa è comoda:
String* nomestringa;
e poi la setti dove vuoi (almeno mi pareva si facesse così) e per il confronto
if (nomestringa == "questo") { se vero } else { se falso }
uhh occhio, String* nomestringa; è un puntatore a stringa, che devi inizializzare prima di utilizzare facendo
nomestringa = &( String() );//ovvero nomestringa punta all'indirizzo del nuovo oggetto String()
però poi ogni volta che lo devi usare ti devi ricordae di lavorare sul valore;
(*nomestringa)="parola";//mette parola nell'oggetto stringa
oppure dichiari String nomestringa; e la usi tranquillo come se fosse una variabile qualsiasi
P.S.
Ultima domanda un po off-topi, così evito di aprire un nuovo topic:
Posso cancellare il serial monitor con un comando? (intendo come il vecchio "cls" su dos).