[RISOLTO!] Estrarre caratteri a destra dal nome del file

Datman:
E' sbagliato qui:
barre[0]=0;
Io devo azzerare l'elemento di barre in corrispondenza della prima barra.

Scusa, ho sbagliato io,
già con le stringhe C sono una frana, in più non posso provare, vado a tentativi

riprova cosi :frowning:

char *percorso ="C:\\percorso_v1.0\\nomefile.ino";
char *barre = strrchr(percorso, '\\');
percorso[barre-percorso] = 0;
char ver[5];
strncpy(ver, percorso+(strlen(percorso)-4), 4);

//...

Scrive ancora .ino

char *percorso=__FILE__;
char *barre=strrchr(percorso, '\\');
percorso[barre-percorso]=0;
char ver[5];
strncpy(ver, percorso+(strlen(percorso)-4), 4);

lcd.setCursor(12,1); lcd.print(ver);

Datman:
Scrive ancora .ino

Mi sono ricordato che c'è TinkerCad!
Ho provato partendo da "C:\percorso_v1.0\nomefile.ino" e funziona correttamente in entrambi i casi (giustamente!), nel senso che ottengo "v1.0"

barre[0] = 0;
//percorso[barre-percorso] = 0;

quindi unica incognita è capire cosa restituisce il tuo FILE!
Riesci a stampare su lcd l'intero percorso, magari spezzato?

Federico

[BATTUTA_ON]
Ci hanno boicottato, ma ne verremo fuori :smiling_imp:
[BATTUTA_OFF]

strncpy(ver, percorso+(strlen(percorso)-4), 4);

Qui mi dice "somma al puntatore del primo carattere il numero caratteri della stringa, meno 4". Quindi punta a gli ultimi 4 caratteri e ne preleva 4. Gli ultimi caratteri sono ".ino".

Federico66 aveva fatto bene ma poi si è scordato quello che ha fatto:)

strncpy(ver, percorso+(strlen(percorso)-8, 4);

Punta a 8 caratteri dalla fine stringa e ne preleva 4.

Ci sto provando, ma non ci riesco...

lcd.clear(); lcd.setCursor(0,0);
char *percorso=__FILE__;
for(int n=0; n<16; n++) {lcd.print(percorso[n]);}
delay(5000);
lcd.clear(); lcd.setCursor(0,0);
char percorso[16]=__FILE__;
for(int n=0; n<16; n++) {lcd.print(percorso[n]);}
delay(5000);

No, Torn. Io devo leggere il nome della cartella, che sta prima di \ .
Se esce .ino, vuol dire che sta leggendo ben oltre \ .

Anche così non stampa:

lcd.clear(); lcd.setCursor(0,0);
lcd.print(__FILE__);
delay(5000);

Anzi, si arrabbia di brutto!
Internal compiler error: Segmentation fault

Arduino:1.8.8 (Windows 10), Scheda:"ATmega328p 8MHz con EESAVE no bootloader"
In function 'global constructors keyed to 65535_0_Generatore_con_GPS_e_DDS_v0.9_prova_0.1.ino.cpp.o':

lto1.exe: internal compiler error: Segmentation fault

Please submit a full bug report,
with preprocessed source if appropriate.
See http://gcc.gnu.org/bugs.html for instructions.

lto-wrapper.exe: fatal error: C:\Program Files\Arduino 1.8.8\hardware\tools\avr/bin/avr-gcc returned 1 exit status

compilation terminated.

c:/program files/arduino 1.8.8/hardware/tools/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/bin/ld.exe: error: lto-wrapper failed

collect2.exe: error: ld returned 1 exit status

exit status 1
Errore durante la compilazione per la scheda ATmega328p 8MHz con EESAVE no bootloader.
Trovata libreria non valida in C:\Program Files\Arduino 1.8.8\libraries\max7219-master: Nessun header file (.h) trovato in C:\Program Files\Arduino 1.8.8\libraries\max7219-master
Trovata libreria non valida in C:\Program Files\Arduino 1.8.8\libraries\max7219-master: Nessun header file (.h) trovato in C:\Program Files\Arduino 1.8.8\libraries\max7219-master

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Io la butto lì

char *percorso=__FILE__;
int barre=strrchr(percorso, '\\')
percorso[barre]=0;
percorso=&percorso[barre-4];

lcd.setCursor(12,1);
lcd.print(percorso);

ma stavolta non la commento

(manca un punto e virgola)
Non appare nulla! :frowning:

Così

char ver[5];
lcd.clear(); lcd.setCursor(0,0);
char *percorso=__FILE__;
int barre=strrchr(percorso, '\\');
percorso[barre]=0;
strncpy(ver, percorso+(strlen(percorso)-4), 4);

lcd.print(percorso);
while(1);

esce:

C:¥Users¥hp¥AppD
odified_sketch_5

Unica possibilità è che la prima ricerca restituisca null

Per che macchina stai compilando?

Per che macchina?...
IDE 1.8.8 su Windows 10
ATmega328P su millefori,
oscillatore 8MHz interno,
programmazione tramite USBASP

Datman:
Così

char ver[5];

lcd.clear(); lcd.setCursor(0,0);
char *percorso=FILE;
int barre=strrchr(percorso, '\');
percorso[barre]=0;
strncpy(ver, percorso+(strlen(percorso)-4), 4);

lcd.print(percorso);
while(1);



esce:


C:¥Users¥hp¥AppD
odified_sketch_5

E se provi a far stampare &percorso[3]?

Users¥hp¥AppData
fied_sketch_8346

Ovvio, il carattere 3 è la U

Quindi prova a stampare &percorso[barre-4]

Uh!!!
C'è una differenza enorme se salvo il file prima di caricarlo!
Ho fatto stampare 16 caratteri per volta con un for() e vedo che percorso[] contiene
C:¥Users¥hp¥AppData¥Local¥Temp¥Arduino_modified_sketch...
Se lo salvo, invece:
C:¥Documenti¥ELETTRONICA¥Arduino¥@15 Generatore con GPS e DDS¥Generatore_con_GPS_e_DDS_v0.9_prova_0.2¥c_setup.ino

Arcano risolvuto

No... Mi appare sempre .ino.

Datman:
C:¥Users¥hp¥AppD

Il codice del post #61 è corretto, il problema è che nel percorso non trova il separatore "" e quindi restituisce gli ultimi 4 caratteri ".ino".

Solo per avere conferma, prova a mandare in stampa il codice DEC del terzo carattere del percorso (che dovrebbe essere ""), dovresti visualizzare 92, se cosi non fosse, allora è confermato che, per non so quale motivo, la macro non restituisce correttamente percorso

lcd.print((int)percorso[2]);

Federico