Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Agosto 15, 2022, 10:35:27 pm

Titolo: [Risolto] Comportamento illogico dell'istruzione RightStr
Inserito da: petrusic - Agosto 15, 2022, 10:35:27 pm
Sto scrivendo una function per estrarre il risultato di un'espressione aritmetica.

All'interno di un ciclo di istruzioni eseguo un'operazione alla volta. Dopo ciascuna operazione sostituisco alla sottostringa contenente una singola operazione il suo risultato  e ricompongo l'intera stringa con l'istruzione:
Codice: [Seleziona]
striMia:= LeftStr(striMia, (ix1 - 1)) + FloatToStr(totale) + RightStr(striMia, (lun - ix2 + 1));

Ho messo sotto controllo l'istruzione ed ho potuto constatare che per le prime volte viene eseguita bene. Ad un certo punto, piuttosto che completare la stringa con gli ultimi 64 caratteri della stringa (risultanti in quel momento) ne vengono accodati 65, con la conseguente sconclusionata alterazione dell'espressione. Ciò non mi consente di proseguire la mia prova.

Non chiedo aiuto per trovare un mio errore di scrittura perchè se ci fosse un mio errore si verificherebbe sempre. Visto invece che, per le prime tre volte di ripetizione del ciclo, la stringa viene ricostruita correttamente e la quarta volta viene accodato un carattere in più, non vorrei che ci fosse un problema (bug) che qualcuno ha già incontrato prima di me.
Titolo: Re:Comportamento illogico dell'istruzione RightStr
Inserito da: DragoRosso - Agosto 15, 2022, 10:44:42 pm
Codice: [Seleziona]
striMia:= LeftStr(striMia, (ix1 - 1)) + FloatToStr(totale) + RightStr(striMia, (lun - ix2 + 1));

Ho messo sotto controllo l'istruzione ed ho potuto constatare che per le prime volte viene eseguita bene. Ad un certo punto, piuttosto che completare la stringa con gli ultimi 64 caratteri della stringa (risultanti in quel momento) ne vengono accodati 65, con la conseguente sconclusionata alterazione dell'espressione. Ciò non mi consente di proseguire la mia prova.

Come fai a definire la lunghezza della parte di stringa ritornata dalla "FloatToStr(totale)" ? La lunghezza è variabile. Non è che sia quello il problema ?

Ciao
Titolo: Re:Comportamento illogico dell'istruzione RightStr
Inserito da: petrusic - Agosto 16, 2022, 11:25:40 am
Come fai a definire la lunghezza della parte di stringa ritornata dalla "FloatToStr(totale)" ? La lunghezza è variabile. Non è che sia quello il problema ?

Per togliere ogni dubbio ho creato tre var stringa:
Codice: [Seleziona]
destra, sinistra, striTot: String;

Ho trasferito le sezione della stringa di partenza in dette tre var, restituendone poi il contenuto alla var striMia:
Codice: [Seleziona]
 striTot:= FloatToStr(totale);
 lunstriTot:= Length(striTot);
 sinistra:= LeftStr(striMia, (ix1 - 1));
 destra:= RightStr(striMia, (lun - ix2 + 1));
 lunReale:= Length(destra);
 striMia:= sinistra + striTot + destra;       

Ho eseguito la writeln delle tre stringhe, nelle varie esecuzioni del ciclo fino ad arrivare al momento fatidico dell'errore di lunghezza.

Per completezza, riporto la mia espressione di prova del programma:
Citazione
={2748,15-1048*(4,18+,16/4+2,75)+4,25+(3,75*6+1,6*((,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-,50)}

Riporto ora il contenuto delle writeln eseguite in tutte le ripetizione del ciclo, fino alla manifestazione dell'errore:
Citazione
function CalcolaFormula

striMia: ={2748,15-1048*(4,18+,16/4+2,75)+4,25+(3,75*6+1,6*((,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-,50)}
striMia: ={2748,15-1048*(4,18+0,16/4+2,75)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}
striMia, da 22, lungh.6= 0,16/4
-----
striMia= ={2748,15-1048*(4,18+0,16/4+2,75)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}
sinistra= "={2748,15-1048*(4,18+" (lughezza= 21)
destra= "+2,75)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}" (lughezza calcolata= 99- lughezza var.destra= 99)
striMia= ={2748,15-1048*(4,18+0,04+2,75)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}
ix1= "22" - inizio sottostringa destra= "28"
striMia, da 17, lungh.9= 4,18+0,04
-----
striMia= ={2748,15-1048*(4,18+0,04+2,75)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}
sinistra= "={2748,15-1048*(" (lughezza= 16)
destra= "+2,75)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}" (lughezza calcolata= 99- lughezza var.destra= 99)
striMia= ={2748,15-1048*(4,22+2,75)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}
ix1= "17" - inizio sottostringa destra= "26"
striMia, da 17, lungh.9= 4,22+2,75
-----
striMia= ={2748,15-1048*(4,22+2,75)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}
sinistra= "={2748,15-1048*(" (lughezza= 16)
destra= ")+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}" (lughezza calcolata= 94- lughezza var.destra= 94)
striMia= ={2748,15-1048*(6,97)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}
ix1= "17" - inizio sottostringa destra= "26"
striMia= ={2748,15-1048*6,97)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}
striMia, da 41, lungh.10= 0,25+153,2
-----
striMia= ={2748,15-1048*6,97)+4,25+(3,75*6+1,6*((0,25+153,2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}
sinistra= "={2748,15-1048*6,97)+4,25+(3,75*6+1,6*((" (lughezza= 40)
destra= "2)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}" (lughezza calcolata= 64- lughezza var.destra= 64)
striMia= ={2748,15-1048*6,97)+4,25+(3,75*6+1,6*((153,452)-4,12+6,05))+(5,28/4+13,29)+4,3*2-(9+6,48)+(13,0+6,58*3-0,50)}
ix1= "41" - inizio sottostringa destra= "51"

Ho contato i caratteri contenuti nella stringa "destra" , sfruttando anche un mio vecchio programma, in Gambas, nato proprio per sommare il n° di caratteri digitati in una Casella di Edit: Sono 65 e non 64. Non capisco perchè il Pascal ne conti 64.

L'unica spiegazione potrebbe essere che ne venga trascurato uno. Ma nelle ripetizioni precedenti del ciclo ciò NON avviene.

M'arrovello ancora il cervello come posso fare per scoprirlo. Perderò del tempo  >:(, ma . . .  lo scoprirò.  :)
Titolo: Re:Comportamento illogico dell'istruzione RightStr
Inserito da: petrusic - Agosto 16, 2022, 12:08:53 pm
Ho contato i caratteri contenuti nella stringa "destra" , sfruttando anche un mio vecchio programma, in Gambas, nato proprio per sommare il n° di caratteri digitati in una Casella di Edit: Sono 65 e non 64. Non capisco perchè il Pascal ne conti 64.

L'unica spiegazione potrebbe essere che ne venga trascurato uno. Ma nelle ripetizioni precedenti del ciclo ciò NON avviene.

M'arrovello ancora il cervello come posso fare per scoprirlo. Perderò del tempo  >:(, ma . . .  lo scoprirò.  :)

Non ho ancora scoperto l'inghippo, ma e mi vergogno di avere cominciato questa discussione, perchè  ho sbagliato a contare ed a leggere la risposta del mio vecchio programma che mi dava 65 come numero progressivo del prossimo carattere da immettere e NON la somma di quelli immessi, ma me ne ero dimenticato.
Così pure, riportando la stringa in una riga di file di testo e posizionando il cursore alla fine di essa, ho sempre leggo il numero progressivo della posizione successiva all'ultima già impostata.

Sono veramente mortificato.

chiedo   S c u s a   a tutti.
Titolo: Re:Comportamento illogico dell'istruzione RightStr
Inserito da: Stilgar - Agosto 16, 2022, 03:07:06 pm
Non mi è chiaro come fai a dire che deve contarne 65 al posto di 64.
Stai parlando del numero dei caratteri e delle posizioni?


Stilgar
Titolo: Re:Comportamento illogico dell'istruzione RightStr
Inserito da: petrusic - Agosto 17, 2022, 05:38:14 pm
Solo per notizia.

Le prime prove hanno funzionato. Ora sto cercando di complicare l'espressione. Intanto questa discussione può considerarsi conclusa.