Modificare/concatenare il contenuto di DEFINE nel corso del funzionamento (RISOLTO)

Buongiorno a tutti.
Ho un problema che purtroppo non riesco a risolvere.Le mie conoscenze di C non arrivano fino a questo livello, sono moooolto basiche.
Queste righe sono parte di un programma che gestisce il protocollo sACN con arduino.
Non è un mio programma, ma sto cercando di adattarlo alle mie esigenze.
Ho apportato parecchie modifiche ma questa non riesco a risolverla.

Ho ho questa definizione all'inizio del codice

#define ARTNET_NODE_NAME "XNet2-ArtNet/sACN > #" // definisce il nome dell'interfaccia che non cambia mai

appena dopo, seguendo il listato ho questa istruzione in cui leggo il valore di universo che posso impostare di volta in volta, via pagina web

byte intU = EEPROM.read(533); // legge da eeprom il numero di universo

intU è un valore numerico da 1 a 16.
tramite programma esterno quando mando una certa istruzione all'interfaccia, quessta mi risponde con il contenuto di ARTNET_NODE_NAME, che però ora è fisso a "XNet2-ArtNet/sACN > #"

Mettiamo che una volta partito il programma ed impostato intU via web , intU sia 1.
avrei la necessita di far si che , durante il codice, quando viene richiamato ARTNET_NODE_NAME il suo contenuto sia "XNet2-ArtNet/sACN > #1" .
In pratica accodo al contenuto iniziale il valore di intU
Ho provato ad usare, molto ignorantemente gli operatori di concatenameto stringhe...ma ovviamente l'IDE mi dice che non va bene.
Qualcuno puo darmi qualche suggerimento pratico?
Grazie anticipate e scusate l'ignoranza.
Mario

COSA hai provato ad usare ... gli operatori della classe String o le funzioni che si trovano in <string.h> e che ti permettono il concatenamento di stringhe classiche del 'C'?

Perché, con quest'ultimi, non ci dovrebbe essere problema a creare una stringa (classica del 'C') come vuoi tu ... :roll_eyes:

Guglielmo

così comè non fuziona e non funzionerà

come dice @gpb01 bisogna vedere cosa hai usato, comunque io trasformerei la #define in una dichiarazione di stringa (C string, NULL terminated) di lunghezza adeguata a contenere ANCHE il carattere aggiuntivo che ti serve, ma terminata un carattere prima
e poi dopo la lettura metto a posto il (pen) ultimo carattere

attenzione a un possibile problema invisibile: tu leggi da EEprom un intero, ma userai un carattere
se ti è chiaro proseguiamo, altrimenti dobbiamo chiarire prima la differenza che esiste tra "0", '0', 0 e NULL

Grazie a tutti per i replay.
Per concatenamenti era =+ e pure & ma già pensavo che non andassero bene.
Per il discorso eeprom ..si,leggo un intero da eeprom e poi quando la visualizzo nella pagina web ,con HTML(uso println per creare la pagina html ), la inserisco come intU.
Ignorantemente pensavo bastasse "concatenare"...un po' come si fa in VB,ma qui mi sono scontrato con le mia poca esperienza in c.

Grazie e buon proseguimento.
Mario

Crea una stringa classica del C (buf) abbastanza grande per contenere il dato, ed usa snprintf() come se stampassi non su monitor seriale ma dentro a quella stringa (buf)

char buf[25];   // 0-19 char + fine stringa
snprintf(buf,sizeof(buf),"%s %d",ARTNET_NODE_NAME , intU);
Serial.println(buf);
#define ARTNET_NODE_NAME "XNet2-ArtNet/sACN > #"

byte g_universo = 1; // 1÷16
const byte g_lenBuff = strlen(ARTNET_NODE_NAME) + 3;
char g_buff[g_lenBuff];

void setup() {
 
    Serial.begin(115200);
    
    Serial.print("g_lenBuff = ");
    Serial.println(g_lenBuff);
    sprintf(g_buff, "%s%02u", ARTNET_NODE_NAME, g_universo);
    Serial.println(g_buff);
    Serial.print("len of g_buff = ");
    Serial.println((strlen(g_buff)));
    Serial.println();
    for (byte i=0; i<16; i++) {
        //sprintf(g_buff, "%s%02u", ARTNET_NODE_NAME, g_universo);
        sprintf(g_buff, "%s%u", ARTNET_NODE_NAME, g_universo);
        Serial.println(g_buff);
        g_universo++;
    }
}

void loop() {
     
}

Rimane valido il suggerimento di @nid69ita.
Ciao.

Grazie ragazzi.
Probabilmente la "DEFINE" è trattata in maniera complessa all'interno della libreria a cui si appoggia.
Ho provato ambe due le soluzione e quella proposta da Maurotec si è rilevata efficace.

#define ARTNET_NODE_NAME "XNet2-ArtNet/sACN > #"
const byte g_lenBuff = strlen(ARTNET_NODE_NAME) + 3;
char g_buff[g_lenBuff];
//......etc etc...
sprintf(g_buff, "%s%02u", ARTNET_NODE_NAME, intU);
...(altro codice )...>>> setNodeName(g_buff);// risponde ad artnet poll con short e universo

Un altro mattoncino di conoscenza nel mio piccolo bagaglio ignorante.
Buona salute a tutti e grazie per il supporto

Uh?... Parliamo italiano, che è meglio! :wink:

grazie per le replice ed il supporto! :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.