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

Ciao a tutti
Tempo fa, in questa discussione Estrarre caratteri a destra dal nome del file
eravamo giunti a questo blocco di codice, da mettere nel setup, per estrarre la versione dal nome della cartella del progetto Arduino e scriverla sul display all'accensione:

 char *percorso=__FILE__; // Dalla macro __FILE__ prende il percorso del file in uso.
        // Questa parte di programma, però, si trova nel file/cartella dell'IDE c_setup, in cui
        // non è scritta la versione del programma. La versione è scritta nel file principale,
        // che ha lo stesso nome della cartella che contiene tutti i file del programma.
        // Possiamo, quindi, tornare indietro al nome della cartella nel percorso del file, prima
        // dell'ultima barra rovesciata, e prendere gli ultimi caratteri del nome della cartella,
        // che sono la versione del programma.
  char *ver=strrchr(percorso,'\\'); // va a posizionarsi alla fine del nome della cartella
  *ver=0;    // Pone a zero il puntatore per indicare la fine della stringa.
  ver=ver-5; // Torna indietro di 4 elementi (caratteri), all'inizio del numero della versione,
             // che vogliamo estrarre. Fino alla v0.9 o v1.9 deve essere ver-4;
             // dalla v0.10 deve essere ver-5.
  lcd.print(ver);

In questo modo vengono presi gli ultimi 5 caratteri del nome della cartella, che contengono la versione nella forma v4.0a. Se la versione fosse v4.0, però, dovrebbe tornare indietro solo di 4 caratteri, perciò dovrei modificare il codice. Come potrei, allora, tornare indietro alla 'v' e visualizzare i caratteri da lì alla fine del nome della cartella? Ho provato facendo

 char *ver=strrchr(percorso,'\\'); // va a posizionarsi alla fine del nome della cartella
  *ver=0;    // Pone a zero il puntatore per indicare la fine della stringa.
  ver=ver-10; // Torna indietro di 10 elementi (caratteri).
  ver=strrchr(ver,'v'); // Va a cercare la 'v'.
  lcd.print(ver);

Parte, sì, dalla 'v', ma visualizza gli ultimi caratteri del nome del file, compreso il .ino finale, non il nome della cartella! Dove ho sbagliato?

Grazie
Gianluca

Non ricordo se avevo partecipato a quella discussione

Ma ricordo che avevo letto con piacere

Stando allo standard del 'c' un puntatore che punta a una costante stringa non punta a memoria modificabile

Quindi non è detto che quando fai

*ver=0;

La scrittura sia eseguita realmente

E comunque il compilatore è autorizzato a ottimizzare

Prova a infilare qualche 'volatile'

Oppure prova a copiare la macro in un array di caratteri creato apposta, e dopo fare ricerche e sostituzioni sull'array e non sulla costante stringa

Ciao, Standardoil

Considera che il primo programma, a parte la scomodità di dover impostare la lunghezza della versione in ver=ver-5, funziona benissimo :slight_smile:

La cosa non mi tange

Quando si lavora coi puntatori su aree strane della memoria può succedere di tutto

Quindi prova a fare come ti ho detto

Questo, per la cronaca, è l'apparecchio che sto completando, in cui ho inserito il codice della versione:

Bello, cosa che è?

E' un prova cavi RJ45/D9, in grado di identificare anche solo 2 fili collegati. Serve per provare i collegamenti RS232/422 realizzati con adattatori D9/RJ45 e rete UTP. Tra cablaggio degli adattatori preesistenti in impianto (che vendono da collegare, quindi non si sa con certezza come sono stati realizzati), cablaggio di quelli nuovi e piedinature dei vari apparati, ogni volta che bisogna fare una modifica d'impianto è quasi come dover fare un terno al lotto... >:(

E rispetto ai tester fatti con un divisore cmos e una manciata di led che vantaggi da?

Questo rappresenta immediatamente le connessioni tramite una fila superiore di numeri da 1 a 9 fissi e una fila inferiore con i segnali identificati all'arrivo. Inoltre, molti prova cavi, anche di marche rinomate, fanno le prove partendo dal presupposto che il cavo deve avere 8 fili collegati in alcune maniere standard; se ne arrivano solo 3 (RS232) danno indicazioni completamente errate!
Anche acquistare un apparecchio simile non è facile: pur scrivendo nel capitolato certe caratteristiche, ben difficilmente un venditore saprà dire se fa esattamente quelle cose... Così ho detto: "Va bene, acquistiamolo, ma nel frattempo ne invento uno come dico io!" :slight_smile:

Bravo

Il display è lato ricevitore, giusto?

Ho provato a mettere volatile:

mettendolo in
volatile char percorso=FILE;
dice:
exit status 1
no matching function for call to 'print(volatile char
&)'

mettendolo in
volatile char *ver=strrchr(percorso,'\');
invece, non cambia nulla: scrive la versione con .ino, quindi dal nome del file anziché dal nome della cartella.

Non mi sembra, però, che stiano accadendo cose strane: credo di aver solo sbagliato io il codice, considerando che in queste cose, purtroppo, vado ancora a tentoni :frowning:

Il display è lato ricevitore, giusto?

In realtà, no se ti riferisci alla disposizione dei componenti: è, sì, collegato al ricevitore, ma per poter posizionare comodamente la piattina del display ho dovuto metterla vicino al trasmettitore, con dei fili sotto che la collegano al ricevitore.

Come ho detto in un'altra discussione, i due microcontrollori hanno lo stesso programma caricato. La parte di programma che deve funzionare (Tx o Rx) viene selezionata all'accensione leggendo lo stato di un pin selettore di modo.

Bello, apparecchio

Non difficile da fare, e con una manciata di if puoi anche far scrivere che tipo di cavo hai

Del tipo:

Null modem ok
Null modem polo 3 scollegato
Diretto con handshaking hw

Etc etc

Datman:

Il display è lato ricevitore, giusto?

In realtà, no se ti riferisci alla disposizione dei componenti: è, sì, collegato al ricevitore, ma per poter posizionare comodamente la piattina del display ho dovuto metterla vicino al trasmettitore, con dei fili sotto che la collegano al ricevitore.

Ma in un contenitore solo?

E quando hai cavi posati in un edificio come fai?

e con una manciata di if puoi anche far scrivere che tipo di cavo hai

Già lo fa: ETH, ETHX, 232, 422, ... 8)

E quando hai cavi posati in un edificio come fai?

L'unità remota devo costruirla, ma è uguale a quella interna. C'è solo un pin di configurazione che modifica leggermente come vengono generati gli impulsi per permettere il funzionamento senza la massa comune. In quella interna, in realtà, ho anche usato lo stesso quarzo del ricevitore per il clock del trasmettitore.

Datman:
In questo modo vengono presi gli ultimi 5 caratteri del nome della cartella, che contengono la versione nella forma v4.0a. Se la versione fosse v4.0, però, dovrebbe tornare indietro solo di 4 caratteri, perciò dovrei modificare il codice. Come potrei, allora, tornare indietro alla 'v' e visualizzare i caratteri da lì alla fine del nome della cartella?

Io non farei cose strane, ciclo while andando indietro di 1 e vedendo se trovi la 'v' oppure 'V'
e ricorda anche di verificare se sei arrivato a inizio stringa (occhio che andando da dx a sx inizio stringa cosè? di sicuro almeno c:\ oppure d:\ ?? oppure il pointer FILE = a v ?? da verificare

Questa è la discussione in cui cominciò l'avventura:
Estrarre caratteri a destra dal nome del file

nid69ita:
Io non farei cose strane, ciclo while andando indietro di 1 e vedendo se trovi la 'v' oppure 'V'
e ricorda anche di verificare se sei arrivato a ...

Concorquoto
Tornare indietro fino a una v
E includerla

Oppure una barra, ed escluderla
È garantito che una barra ci sia, prima di arrivare alla radice del file system e sbordare fuori prima dell'inizio della stringa

Scusa l'ignoranza ma:

  char *ver=strrchr(percorso,'\\'); // va a posizionarsi alla fine del nome della cartella
  *ver=0;    // Pone a zero il puntatore per indicare la fine della stringa.
  ver=ver-5; // Torna indietro di 4 elementi (caratteri), all'inizio del numero della versione,
             // che vogliamo estrarre. Fino alla v0.9 o v1.9 deve essere ver-4;
             // dalla v0.10 deve essere ver-5.
  lcd.print(ver);
  1. Cerchi l'ultima occorrenza del carattere "". OK
  2. Poni a zero il puntatore... ???????
    Questa non l'ho capita. In realtà vai a sostituire la barra con uno zero? per poi poter fare la print fermandoti li?
    Mi sa che il commento mi ha fuorviato, comunque, come dice il socio, provare a scrivere su una costante non so cosa produca, perchè tu stai provando a sovrascrivere il valore contenuto nella costante FILE
    O sbaglio?
    Da quel che ho capito, percorso è un puntatore all'inizio della costante FILE non ad una copia del suo valore scritto su una variabile.

Io, a questo punto, andrei indietro a cercare la v ma se trovo un'altra barra mi fermerei. Male che vada, se è linux trovi la root, se windows trovi l'unità disco.

Per curiosità, riusciresti a stampare l'intero valore contenuto su FILE?

Maurizio

Buongiorno, Maurizio
Hai letto la discussione iniziale, di cui al mio messaggio n.16, in particolare i messaggi numero:
8
26...32
40...42
58...92?
Altrimenti rischiamo di rifare inutilmente le stesse cose :slight_smile: