[Ri]Visual. della versione a partire dalla 'v' alla fine del nome della cartella

Era già ver[10];

Però deve essere: ver[nchar]='\0';
Adesso va bene.
Grazie! :slight_smile:

(Riuscirò mai a entrare nella mentalità necessaria per capire le stringhe?... Mah!... :frowning: )

Fatta una funzione che lo calcola e che fa qualche controllo:

char ver[10];

void setup()
{ delay(1000);
  Serial.begin(9600);
  Serial.println("avvio...");
  GetVersion(__FILE__,ver,sizeof(ver));
  Serial.println(__FILE__);
  Serial.println(ver);
}
void GetVersion(const char *p_File,char* p_Ver,byte p_Dim)
{ char *pStr; byte NumChr;
  pStr=strrchr(p_File,'v');                   // cerca v
  if(pStr==0) pStr=strrchr(p_File,'V');  // se non trova v cerca V
  if(pStr==0) return;                         // non trova ne v ne V
  NumChr=strlen(pStr)-4;
  if(NumChr>=p_Dim) NumChr=p_Dim;     // se versione > dimensione buffer accorcia
  strncpy(p_Ver,pStr,NumChr);
  p_Ver[NumChr+1]='\0';
}

void loop() { }

Un mio esempio di output su Monitor Seriale:
avvio...
D:\Elettronica\Arduino\arduino-IDE\portable\sketchbook\prgVersioni_1_v1.45\prgVersioni_1_v1.45.ino
v1.45

Il problema è che FILE non può stare nel setup, perché il setup spesso sta in file con nome diverso da quello principale, ad esempio setup.ino. FILE deve essere copiato e abbandonato prima del setup.
Comunque, quelle poche righe vanno benissimo!

char *percorso=__FILE__; 
void setup()
{
char *ver_ext=strrchr(percorso,'v');
char ver[10];
byte n_car=strlen(ver_ext)-4;
strncpy(ver,ver_ext,n_car);
ver[n_car]='\0';
}

P.s.: preferisco n_car perché si distingue subito da char :slight_smile:

Datman:
...Così leggo v1.45.ino...

Ma la versione non era nel nome della sottocartella e non del file?

Maurizio

La versione è scritta alla fine del nome della cartella e alla fine del nome del file omonimo. In quest'ultimo caso non bisogna risalire di un livello, ma bisogna togliere .ino.

Boh

Io tra riposino postprandiale e abbiocco estivo ho fatto un pomeriggio tra letto, lettino in piscina e amaca in pineta

Quindi ho letto poco e capito meno

In quale post trovo un demo della FILE?

Così do qualche 'osso da rodere' al cerebro (non al cerbero)

Datman:
La versione è scritta alla fine del nome della cartella e alla fine del nome del file omonimo. In quest'ultimo caso non bisogna risalire di un livello, ma bisogna togliere .ino.

Quindi tra l'ultima barra e la V immediatamente precedente

Mi sembra paurosamente facile...

Qui ho solo telefonino

Aspettate che faccio un po' di copiaincolls

maubarzi:
Ma la versione non era nel nome della sottocartella e non del file?

Maurizio

Parliamo di sketch Arduino, il nome del file .ino e la cartella devono coincidere (almeno credo).

Datman:
Il problema è che FILE non può stare nel setup, perché il setup spesso sta in file con nome diverso da quello principale, ad esempio setup.ino. FILE deve essere copiato e abbandonato prima del setup.

No invece non c'e' problema. Fai la stessa cosa, ovvero invece di passare FILE alla GetVersion gli passi percorso.
char *percorso=FILE; // var. globale
char ver[10];
...
GetVersion(percorso,ver,sizeof(ver));
...

Niente

Col solo furbofono, senza una tastiera, non ne esco

Mi limito a leggere, per ora

Mi sono fatto prestare una tastiera, con sotto un pc

char * percorso=__FILE__;
char versione[10]={0};
// deve essere abbastanza lungo, contando anche il terminatore
char * fine=strrchr(percorso,'\\');
// trovo la fine
char * inizio= fine;
while(* inizio != '\\' && * inizio!='V' && * inizio !='v'){
   inizio--;
}
// trovo l'inizio
if ( * percorso =='\\'){
   percorso++;
}
// escludo l'eventuale barra
strcpy(versione, inizio, fine-inizio);
// copio con l'aritmetica dei puntatori

Non saprei se va, provare...

@Standard, forse ultima istruzione deve essere strncpy()

Temo tu abbia ragione

Pensavo alla memcpy....

Che forse va bene pure lei

Ok, grigliata finita, vado per il digestivo

Standardoil:
Quindi tra l'ultima barra e la V immediatamente precedente

Mi sembra paurosamente facile...

E' quello che mi son detto pure io, e reputando Gianluca NON un utonto quadratico medio, faticavo a capire dove fosse il problema.
Lui però ci deve aver messo un po' del suo, perchè se i calori estivi non mi ingannano, alternava la ricerca sulla cartella superiore e sul file a seconda dell'umidità e/o delle mie domande per mandarmi in overheat il cervelletto :smiley:

Standardoil:
Mi sono fatto prestare una tastiera, con sotto un pc

...

Non saprei se va, provare...

La logica mi pare corretta, magari ci sarà qualche ciapino qua e là da sistemare, ma potrebbe essere un facile esercizio lasciato al lettore e la scusa per dire di non aver preparato la pappa pronta 8) .

Maurizio

P.S.

Standardoil:
Io tra riposino postprandiale e abbiocco estivo ho fatto un pomeriggio tra letto, lettino in piscina e amaca in pineta

Mi sembri la risposta ad una definizione da cruciverba: uno orizzontale: standardoil!

Buongiorno, Mau :slight_smile:
Ho spiegato tutto il rebus nel messaggio n.27. Ti è sfuggito? :slight_smile:

No, ho provato a ripartire da quello ma evidentemente non ho interpretato correttamente.
Comunque, lasciando al caldo la spiegazione delle varie incomprensioni, con l'approccio di standardoil se ne dovrebbe venir fuori, giusto?

Maurizio

Veramente ho già risolto, come detto, con la soluzione al messaggio n.34, corretto come nel n.42!

Ottimo allora, io vedo di far partire l'aria condizionata per portare i neuroni all'attività normale :wink:

Maurizio

:smiley:

maubarzi:
P.S.
Mi sembri la risposta ad una definizione da cruciverba: uno orizzontale: standardoil!

Complimenti, grande definizione

Ho sempre affermato, per essere più precisi mi sono sempre vantato, di essere un sibarita