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:
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.
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:
destra, sinistra, striTot: String;
Ho trasferito le sezione della stringa di partenza in dette tre var, restituendone poi il contenuto alla var striMia:
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:
={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:
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ò. :)