* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 18, 2024, 11:09:43 am

Inserisci il nome utente, la password e la durata della sessione.

284 Visitatori, 0 Utenti

Autore Topic: [Risolto] Comportamento illogico dell'istruzione RightStr  (Letto 807 volte)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
[Risolto] Comportamento illogico dell'istruzione RightStr
« il: 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.
« Ultima modifica: Agosto 17, 2022, 05:38:38 pm da petrusic »
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Comportamento illogico dell'istruzione RightStr
« Risposta #1 il: 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:Comportamento illogico dell'istruzione RightStr
« Risposta #2 il: 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ò.  :)
« Ultima modifica: Agosto 16, 2022, 11:39:59 am da petrusic »
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:Comportamento illogico dell'istruzione RightStr
« Risposta #3 il: 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.
ciao ciao

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Comportamento illogico dell'istruzione RightStr
« Risposta #4 il: 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
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:Comportamento illogico dell'istruzione RightStr
« Risposta #5 il: 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.
ciao ciao

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18769
  • Topic in totale: 2232
  • Online Today: 303
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 284
Total: 284

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.