Home › Forum › Informazioni ambiente di sviluppo LogicLab › Acquisizione numero da stringa di testo
- Questo topic ha 2 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 1 anno, 3 mesi fa da
Roberto.
-
AutorePost
-
Giugno 24, 2025 alle 11:32 am #82994
Roberto
PartecipanteIn un mio programma devo acquisire un identificativo di messaggio presente in una stringa di testo, ecco il programma che utilizzo:
VAR MsgID : INT; RxMessage : STRING[ 32 ]; END_VAR RxMessage:='Message ID:12, This is a message'; MsgID:=MID(IN:=RxMessage, L:=2, P:=12);Con la nuova versione di LogicLab mi viene ritornato questo errore di compilazuione:
error G0254: ‘:=’ => Converting a String into a number
Come posso risolvere?
Giugno 24, 2025 alle 11:49 am #83001Sergio Bertana
Amministratore del forumLa funzione MID estrae una sottostringa da una stringa di partenza, indicando la lunghezza della sottostringa e la posizione nella stringa di partenza. Il suo prototipo è:
ANY_STRING MID(IN:=ANY_STRING, L:=UINT, P:=UINT)
Quindi non puoi appoggiare il ritorno di MID in una variabile INT. Come ho già detto in altri topic con le nuove versioni LogicLab introduce sempre correzioni e nuovi controlli sintattici. Per estrarre un numero da una stringa puoi usare la funzione SysVsscanf. Vediamo nel tuo esempio:
VAR MsgID : INT; AStr : STRING[ 16 ]; RxMessage : STRING[ 32 ]; END_VAR RxMessage:='Message ID:12, This is a message'; AStr:=MID(IN:=RxMessage, L:=2, P:=12); eTO_JUNK(SysVsscanf(ADR(AStr), ADR('%d'), INT_TYPE, ADR(MsgID))); eTO_JUNK(SysVsscanf(SysStrFind(ADR(RxMessage), ADR('ID:'), FIND_GET_END), ADR('%d'), INT_TYPE, ADR(MsgID)));Come vedi ho fatto due esempi, nel primo estraggo la sottostringa con i due numeri asccii “12” e poi eseguo la SysVsscanf sulla sottostringa, nel secondo in una sola riga di programma cerco nella stringa il riferimaento “ID;” ed estraggo il valore.
Il secondo esempio ha molti vantaggi, intanto cerca il riferimento e quindi se cambia la testa del messaggio comunque individua sempre il campo che lo segue, inoltre converte il numero qualunque sia il numero di cifre che lo compongono.
Se controlli il ritorno di SysVsscanf puoi verificare se è stato acquisito correttamente il numero e gestire di conseguenza eventuali errori, inoltre nella acquisizione del numero puoi utilizzare anche le regular expressions (Vedi topic).
Giugno 25, 2025 alle 11:50 am #83045Roberto
PartecipanteE’ vero che viene migliorato il tutto, ma questo non permette di lavorare anche su programmi vecchi, quindi devo mantenere due versioni istallate, diversamente devo mettere mano a tutti i codici…
-
AutorePost
- Devi essere connesso per rispondere a questo topic.