Buona sera, avrei una domanda da porvi, devo leggere una riga formattata una file per caricarla in una variabile, arrivando da C ho subito pensato ad una fscanf, ma sembra che non sia la strada giusta in quanto in fase di verifica mi restituisce il seguente errore:
SvegliaSketch:32: error: cannot convert 'SDLib::File' to 'FILE* {aka __file*}' for argument '1' to 'int fscanf(FILE*, const char*, ...)'
** fscanf(sveglie,"%d", &prova);**
** ^** cannot convert 'SDLib::File' to 'FILE* {aka __file*}' for argument '1' to 'int fscanf(FILE*, const char*, ...)'
Il codice che ho usato per la prova è il seguente
SD.begin(SDCS);
sveglie = SD.open("Sveglie.txt");
int prova = 0;
fscanf(sveglie,"%d", &prova);
Se come immagino il problema è l'uso della scanf, per ottenere lo stesso risultato quale funzione dovrei usare?
di solito non aiuto studenti
ma faccio accezione, oggi
cannot convert .... to file *
mi sa tanto che devi passare il puntatore al file, non il file stesso
anche l'apertura del file mi sembra un po' strana....
File *sveglie;
void setup() {
// put your setup code here, to run once:
CaricaSveglie();
}
void CaricaSveglie() {
SD.begin(SDCS);
sveglie = SD.open("Sveglie.txt");
int prova = 0;
fscanf(sveglie,"%d", &prova);
}
l'errore cambia in:
SvegliaSketch:27: error: cannot convert 'SDLib::File' to 'SDLib::File*' in assignment
** sveglie = SD.open("Sveglie.txt");**
** ^** SvegliaSketch:28: error: request for member 'available' in 'sveglie', which is of pointer type 'SDLib::File*' (maybe you meant to use '->' ?)
** while(sveglie.available())**
** ^** SvegliaSketch:32: error: cannot convert 'SDLib::File*' to 'FILE* {aka __file*}' for argument '1' to 'int fscanf(FILE*, const char*, ...)'
** fscanf(sveglie,"%d", &prova);**
** ^** cannot convert 'SDLib::File' to 'SDLib::File*' in assignment
accipicchia
io manco sapevo che in arduino (inteso come sistema) era presente la fscanf()
ma sembra che si riferisca ad un oggetto 'FILE' differente come "tipo" dall'oggetto 'File' della SD
ammetto che non ci capisco più niente
Ho pensato la stessa cosa perchè in C un file si dichiara tutto maiuscolo: "FILE *fp;"
Ma se provo a dichiarare un file così:
FILE *sveglie;
void setup() {
// put your setup code here, to run once:
CaricaSveglie();
}
void CaricaSveglie() {
SD.begin(SDCS);
sveglie = SD.open("Sveglie.txt");
int prova = 0;
fscanf(sveglie,"%d", &prova);
}
ottengo errori sulla libreria SD:
SvegliaSketch:27: error: cannot convert 'SDLib::File' to 'FILE* {aka __file*}' in assignment
** sveglie = SD.open("Sveglie.txt");**
** ^** SvegliaSketch:28: error: request for member 'available' in 'sveglie', which is of pointer type 'FILE* {aka __file*}' (maybe you meant to use '->' ?)
** while(sveglie.available())**
** ^** cannot convert 'SDLib::File' to 'FILE* {aka __file*}' in assignment
Alla luce di ciò presumo che io non debba usare la fscanf, ma non ho idea di cos'altro usare per ottenere un risultato simile
The_Fidax:
Se come immagino il problema è l'uso della scanf, per ottenere lo stesso risultato quale funzione dovrei usare?
Ho proprio idea che NON ci sia un equivalente ...
... devi studiarti le funzioni di AVR libc ed in particolare quanto è in <string.h> ... con un po' di lavoro riesci a costruirti un tuo "parser" :
Però, come avete notato, fscanf() vuole come primo argomento un FILE *, che in Arduino non si usa (si usa invece SD::File, come visto). Quindi, quel che devi fare è leggere una riga intera con i metodi della classe file e quindi usare sscanf() su di essa.
Grazie mille! Compilare compila! Adesso devo iniziare i test pratici.
Davvero ancora grazie!
Vi riporto il codice usato per completezza:
File sveglie;
void setup() {
// put your setup code here, to run once:
CaricaSveglie();
}
void loop() {
// put your main code here, to run repeatedly:
}
void CaricaSveglie() {
SD.begin(SDCS);
sveglie = SD.open("Sveglie.txt");
char str[20];
sveglie.read(str,10);
int prova = 0;
sscanf(str,"%d", &prova);
}