Vai al contenuto

Acquisizione numero da stringa di testo

Home Forum Informazioni ambiente di sviluppo LogicLab Acquisizione numero da stringa di testo

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Autore
    Post
  • #82994
    Anonimo
    Inattivo

    In 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?

    #83001
    Sergio Bertana
    Amministratore del forum

    La 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).

    #83045
    Roberto
    Partecipante

    E’ 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…

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Devi essere connesso per rispondere a questo topic.