Ciao a tutti!!
Sto diventando pazzo con una semplicissima funzione che mi dovrebbe creare il nome di un file di log da scrivere il una scheda SD.
Il problema è che se scrivo questa funzione in uno sketch pulito funziona correttamente mentre all'interno del codice generale del progetto mi restituisce simboli strani e blocca il ciclo del programma.
dove nomeFile viene dichiarata come String tra le variabili generali.
Ho provato anche a dichiarare la variabile e poi inizializzarla con String() ma idem.
Il comportamento è strano a volte inizia stampando log_ altre volte log_17 e altre direttamente simboli strani ma in tutti casi non arriva mai a termine e blocca tutto.
avete qualche idea?
Grazie mille!!
Ciao, due considerazioni usare oggetti String può creare problemi su arduino, sarebbe meglio utilizzare le stringhe stile C, ovvero array di char char stringa[20].
Seconda considerazione, richiami le funzioni day() month() year(), siamo sicuri che queste funzioni restituiscono una stringa e non un numero,secondo me quelle funzioni restituiscono un intero, dovrebbero essere convertite perché il risultano non sarebbe quello voluto.
Due suggerimenti e una domanda
Se nomeFile è una variabile globale, perché la restituisci?
Non usare gli oggetti stringa, evitarli come la peste, sempre e comunque
Vai a dare uno sguardo al mio topic "termoremoto non è....."
Ci trovi una funzione che fa quasi quello che cerchi, con array di char, ovvero semplici stringhe in C
Usa la come ispirazione
>lozio84: essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
Guglielmo
>torn24, Standardoil: ve l'ho già chiesto più di una volta ... prima di rispondere, verificare sempre se l'utente abbia effettuato la presentazione, cosa che, ovviamente, NON può essere possibile se il suo numero di post è 1. Grazie.
Non ho proprio visto o guardato che era il suo primo post, altrimenti gli avrei suggerito di presentarsi
Comunque il fatto di non rispondere se non si è presentato, non è una "regola" diffusa su tutti i forum, quindi non è che si abbia proprio l'abitudine.
torn24:
Mi sembra "insolito" che mi debba preoccupare io se si sia presentato o meno, più di quanto si sia preoccupato lui, nel senso che in altri forum è una questione tra moderazione e nuovo utente.
Vero ... ma dato che spesso e volentieri (... senza alcun riferimento al OP di questo thread), se qualche utente gli risponde, se ne fregano e continuano la discussione senza presentarsi, per evitare accese dicussioni ed una pioggia di BAN, ritengo che sia meglio che tutti collaborino a far rispettare il regolamento aspettando, prima di rispondere, che chi scrive abbia effettuato la dovuta presentazione.
Altrimenti, in futuro e mi dispiacerebbe, mi vedrò costretto a cancellare direttamente le risposte sino a quando i nuovi arrivati non si presentano ...
L'unica vera "menata" è che dal furbofono non vedo il numero dei messaggi postati, spesso vado in fiducia...
Quando sbaglio Gilberto Guglielmo mi mazzia
Tropismo, si chiama tropismo
Naturalmente non volevo essere offensivo
Alcuni nomi per me si confondono
Monica e Michela
Davide e Daniele
Guglielmo e Gilberto, e pochi altri
Temo sia un problema di overflow di puntatori a stringa
Mi spiace, è già successo, succederà ancora, ma è involontario
Eccomi mi sono appena presentato, chiedo scusa di non averlo fatto prima! Grazie a tutti per le risposte, penso che utilizzero come suggerito gli array char anche se, la cosa che mi manda fuori di testa, è che nello stesso sketch appena sopra... ho questa parte di codice che funziona perfettamente:
ti consiglio di usare SEMPRE array di char. In tal modo non hai problemi di sorta con la memoria di Arduino, ricordandoti solo che NON esiste alcuna netta protezione che impedisca di leggere (o peggio scrivere) fuori da un array, quindi per ogni array che crei e passi a funzione ti consiglio di passare anche una variabile pari alla sua lunghezza in elementi.
Sento già la voce di qualcuno che dice "Ma gli array di char (che si possono chiamare stringhe) sono terminati da '\0', e il C lo riconosce automaticamente come terminatore".
Ad egli rispondo che:
A)Non chiamiamoli stringhe (troppa confusione con String)
B)Che io sappia (correggetemi se sbaglio):
1)Il gioco di array terminati con '\0' vale solo per array di char globali a dimensione non dichiarata, ma calcolata dal compilatore, che mi sembra una categoria un po piccola.
2)Comunque che io sappia nulla ti vieta di forzare una scrittura nell'elemento terminatore, e così facendo tanti saluti (e sappiamo che gli errori "ho fatto una for che include un valore che non dovrebbe" sono i più facili da fare e i meno facili da beccare)
2)Comunque non mi convince quel stringa+=year() o month () o altri simili. Credo che quelle funzioni restituiscano dei numeri "diretti", quindi un byte con scritto in binario il numero, mentre quello che mi servirebbe per dare il nome corretto al fie sarebbero tanti bytes contenenti ciascuno il codice ASCII delle cifre (che è diverso dal loro valore binario).
Temo, quindi, che ti sia necessaria una funzione che ti trasformi i numeri in insiemi di cifre.
Silente ...
... ti consiglio di andarti a ristudiare SUI LIBRI, le strighe del 'C' (si chiamano così, che ti piaccia o meno) e la classe String() perché hai scritto un bel po' di sciocchezze.
Appurato che hai intenzione di usare le stringhe stile C "array di char"...
Le funzioni day(),year() , month (), restituiscono un intero che non può essere concatenato a una stringa,
Quindi bisogna convertire il numero intero in una striga, per fare questo puoi usare la funzione itoa();
Con le stringhe stile C, non si possono copiare o concatenare direttamente, ma dovrai fare uso di apposite funzioni.
Quindi ti serve leggere come si usano queste funzioni.
itoa(), per convertire un numero intero in un array di char
strcpy(), per copiare una stringa in un altra.
strcat(), per concatenare una stringa in una già esistente.
Forse può risultare difficile per uno alle prime armi, crearsi una funzione del genere, però ti do una linea
guida
Passiamo un array come parametro della funzione, le modifiche che farai all'array si vedranno anche
nella funzione chiamante, o in alternativa usare un array globale.
void CreaStringa(char StringaRisultante[],float tempamb, float umid, float tempbir,int litri){
int giorno=day();
int mese=month ();
int anno=yaer();
// Converto gli interi in array di char
char g[4];
char m[4];
char a[6];
itoa (giorno,g,10);
itoa (mese,m,10);
itoa (anno,a,10);
// Adesso negli array ci sono le stringhe che rappresentano giorno, mese, anno.
// Uso le funzioni strcpy e strcat per modificare StringaRisultante[] e ottenere la stringa voluta
}
Eccomi mi sono appena presentato, chiedo scusa di non averlo fatto prima!
Grazie a tutti per le risposte, penso che utilizzero come suggerito gli array char anche se, la cosa che mi manda fuori di testa, è che nello stesso sketch appena sopra... ho questa parte di codice che funziona perfettamente:
Dice che ha intenzione Non conosco il C++ , e per questo ho provato a concatenare un numero a un oggetto String, lo interpreta come codice ascii.
Il fatto che dice che il codice gli funziona mi lascia perplesso ...
torn24:
...Non conosco il C++ , e per questo ho provato a concatenare un numero a un oggetto String, lo interpreta come codice ascii.
L'oggetto String è piuttosto furbo (... e piuttosto pesante) ... quando concatena, ovviamente, converte in tipo String quello che concatena, quindi, alla fine, ti ritrovi tutto in una String
Per questo, specie chi inizia, è portato ad usarlo, perché è estremanente più facile che usare le stringhe classiche del 'C' in cui devi chiamare le funzioni di copia in una string (strcpy()) di conversione dei vari tipi in stringhe del 'C' e di concatenazione (strcat())
Guglielmo
P.S.: Ora passa Nid e ci segnala che è più sicuro usare strncpy(), strncat() e così via ... ha ragione, è indubbiamente più sicuro, sono io che nella fretta scelgo sempre la funzione più corta da scrivere