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

Ciao a tutti

Prendendo spunto da una discussione nel forum, ho cercato di estrarre e scrivere sul display gli ultimi 4 caratteri del nome del file .ino, che contengono la versione. Dove ho sbagliato?

Grazie

char *s =__FILE__;
char *progname = strrchr(s, '\\');
if(progname!=NULL)
  {
  for(int n=strlen(progname+1); n=(strlen(progname+1))-4; n--)
    {
    strncpy(progname+1, char carattere, 1);
    char ver+=carattere;
    }
  }
lcd.print(ver);

(Siamo in setup())
Così viene compilato, ma non appare nulla:

char ver;
char carattere;
char *s =__FILE__;
char *progname = strrchr(s, '\\');
if(progname!=NULL)
  {
  for(int n=strlen(progname+1); n=(strlen(progname+1))-4; n--)
    {
    strncpy(progname, carattere, 1);
    ver+=carattere;
    }
  }
lcd.print(ver);

delay(1000);

Ooops... I caratteri vanno messi al contrario, ma non appaiono ugualmente:

lcd.begin(16, 2);
lcd.setCursor(0,0); lcd.print(F(" Frequency Std. "));
lcd.setCursor(0,1); lcd.print(F("      GG    "));
char ver;
char carattere;
char *s =__FILE__;
char *progname = strrchr(s, '\\');
if(progname!=NULL)
  {
  for(int n=(strlen(progname+1))-4; n<=strlen(progname+1); n++)
    {
    strncpy(progname, carattere, 1);
    ver+=carattere;
    }
  }
lcd.setCursor(12,1); lcd.print(ver);

delay(1000); 
lcd.clear();

Era proprio sbagliato! Così, però, ottengo solo "/":

char ver="     ";
char carattere=' ';
char *s =__FILE__;
char *progName = strrchr(s, '\\');

for(int n=strlen(progName)-8; n<=strlen(progName)-4; n++)
  {
  carattere=progName[n];
  ver+=carattere;
  }
ver+='\0';
lcd.setCursor(12,1); lcd.print(ver);
while(1);

Sto provando con strncat(ver, carattere, 1);
al posto di ver+=carattere;
ma senza successo.

Puoi mettere il link della discussione sul forum a cui ti riferisci?

Marco

Di un ipotetico filename fatto così

Nomefilealberto.ino
Tu vorresti che uscisse solo

erto

Senza l'inizio e senza estensione

Ho capito giusto?

Credo che sbagli uso dei puntatori a char.

  1. Un puntatore è solo una variabile che contiene un indirizzo, se io voglio salvare dati devo allocare memoria per il puntatore con malloc. In questo modo il puntatore
    punta a un area di memoria dove io posso inserire i dati.

tuoi errori

char ver="     "; // ver è un carattere non è un array non posso assegnarli stringhe
char carattere=' ';
char *s =__FILE__; // Non so cosa sia FILE nel tuo codice manca 
char *progName = strrchr(s, '\\'); 

for(int n=strlen(progName)-8; n<=strlen(progName)-4; n++)
  {
  carattere=progName[n];
  ver+=carattere; //Non posso assegnare più carattere a una variabile char, se fosse un array
                              bisognerebbe usare la funzione strcpy o strcat.
  }
ver

Prova cosi!

        char nomeFile[]="file1234";
 char caratteri[5];
 strncpy(caratteri,nomeFile+(strlen(nomeFile)-4),4);
  1. caratteri è la destinazione

  2. nomeFile è il puntatore al primo elemento, il primo carattere, gli sommo la lunghezza della stringa e punto all'ultimo carattere, tolgo 4 e punto al 4 carattere prima della fine stringa. Adesso il puntatore punta al primo carattere che voglio copiare.

3)Siccome le funzioni stringa lavorano col puntatore passato, si comportano allo stesso modo se passi il primo carattere, ovvero il nome del puntatore o array, ma si comportano allo stesso modo se gli passi il puntatore a un carattere intermedio. Partiranno da quel puntatore a carattere.

Banale, si fa in 3 righe

char *s =__FILE__;
s[strlen(s)-4]=0;
s=s+strlen(s)-4;

Con la prima creo l'array di caratteri
Con la seconda porto indietro il terminatore, per scartare la coda che non mi interessa
Con la terza porto avanti il puntatore, per scartare la testa, che non.mi interessa
Come era quella vecchia pubblicità della grappa (boccchino sigillo nero, se ricordo bene): via la testa, via la coda solo il cuore della grappa?

Grazie a tutti. Appena posso, provo.

AmericanDreamer, il tuo codice è molto semplice, ma supponiamo che la lunghezza del nome sia 30 caratteri (comprende tutto il percorso del file):
s[26]=0
s=s+26?
No... Devo spostare il puntatore avanti di 23 elementi, cioè la stringa deve iniziare al ventitreesimo elemento dell'array.

[Copia inutile. Mantenuto solo per non alterare la numerazione dei messaggi.]

Datman:
Grazie a tutti. Appena posso, provo.

AmericanDreamer, il tuo codice è molto semplice, ma supponiamo che la lunghezza del nome sia 30 caratteri (comprende tutto il percorso del file):
s[26]=0
s=s+26?

22 non 26

C'è un secondo calcolo della lunghezza

Sulimarco:
Puoi mettere il link della discussione sul forum a cui ti riferisci?

https://forum.arduino.cc/index.php?topic=611976.0

AmericanDreamer, non funziona...

torn24, non funziona...

void setup()
{
...
char nomeFile=__FILE__;
char ver[5];
strncpy(ver, nomeFile+(strlen(nomeFile)-4), 4);

lcd.setCursor(12,1); lcd.print(ver);
delay(1000);
}

C1P8:
Di un ipotetico filename fatto così:
Nomefilealberto.ino
Tu vorresti che uscisse solo "erto", senza l'inizio e senza estensione.
Ho capito giusto?

Esatto: da un nome "Nomefilealberto_v0.1.ino"
deve uscire: "v0.1".

Non funziona cosa vuol dire?

Spiega, dai

Eccerto che quello di torn24 non ti va
Ti sei dimenticato un asterisco

Voglio dire che non appare nulla.

Metti qui le due versioni

Che hai sbagliato è evidente

La versione che hai scritto da quella di torn24 non dovrebbe nemmeno compilare, altro che non apparire nulla

Metti qui i due programmi, dai