Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C++Builder] 2 Cicli for annidati eseguono operazioni diverse

    Il seguente pezzo di programma dovrebbe dare x output comletamente uguali a patto che atm.Enable[numero] siano true
    codice:
    for(a=0;a<4;a++)
      {for(b=0;b<10;b++)
         {if(eth.Enable[(a*10)+b])
           {M_Template->Lines->Add("interface ethernet ");
            M_Template->Text=(M_Template->Text+a+"."+b);
            [...]        
           }
         }
      }
    Il risultato di questa operazione viene scritto in un Memo (M_Template) che dovrebbe essere così:
    codice:
    interface ethernet 0.0
    [...]
    interface ethernet 0.1
    [...]
    [------]
    interface ethernet 3.10
    [...]
    Invece di avere quest'output ho la prima riga errata :
    codice:
    interface ethernet
    0.0
    e tutte le altre sono giuste. Da cosa può dipendere? (Può sembrare stupido domandare aiuto per un semplice ritorno a capo di troppo, ma quello può causare enormi guai al resto....

    Ho cercato di cambiare più volte il modo di scrivere l'output, ma in ogni caso che ho provato mi da errori simili (una volta anche peggio VVoVe: )
    Grazie infinite in anticipo!


    Edito per aggiungere:

    Il problema non è la combinazione 0.0 ma il primo termine che scrive. :master: che cosa avrò errato?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,311
    Devo ammettere che ho fatto molta fatica a capire, dal testo che hai scritto, che il problema risiedeva solamente nel fatto che hai un ritorno a capo che non desideri.

    Il problema è dovuto al fatto che utilizzi il metodo Add della proprietà Lines che è di tipo TStringList; tale metodo aggiunge dei "ritorni a capo" (la sequenza di caratteri corrispondente) alla stringa che la classe mantiene al suo interno; ciascun ritorno a capo funge da separatore e permette alla classe di restituire la stringa monolitica come un insieme di stringhe separate, ciascuna relativa ad una diversa linea.

    Se la stringa finale non diviene troppo lunga, potresti tentare di accodare il testo da aggiungere alla proprietà Text (Lines.Text = Lines.Text + NewString), evitando di usare il metodo Add che aggiunge la stringa postponendo un ritorno a capo.

    In secondo luogo, visto che il testo prodotto ti serve per operazioni supplementari di una certa delicatezza, io non immagazzinerei il testo all'interno di un controllo TMemo; piuttosto, userei una banale stringa concatenata nel modo che ti ho suggerito e, alla fine del processo, visualizzerei quest'ultima nel Memo solo per verifica, impostando la proprietà Lines.Text al contenuto della stringa.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Ti "conosco" da poco ma mi fai paura! VVoVe:
    Mi è bastata sostituire la stringa
    codice:
    M_Template->Lines->Add(interface ATM ");
    M_Template->Text=(M_Template->Text+a+"."+b);
    con
    codice:
    M_Template->Lines->Text=(M_Template->Text+"interface ATM "+a+"."+b);
    ed adesso funziona benissimo.

    p.s.
    In secondo luogo, visto che il testo prodotto ti serve per operazioni supplementari di una certa delicatezza, io non immagazzinerei il testo all'interno di un controllo TMemo; piuttosto, userei una banale stringa concatenata nel modo che ti ho suggerito e, alla fine del processo, visualizzerei quest'ultima nel Memo solo per verifica, impostando la proprietà Lines.Text al contenuto della stringa.
    Questo perfortuna non è necessario, in quanto il testo viene scritto automaticamente dal programma e non ha bisogno di essere corretto in esso!

    Thank you very much

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,311
    Originariamente inviato da Ephestus
    Questo perfortuna non è necessario, in quanto il testo viene scritto automaticamente dal programma e non ha bisogno di essere corretto in esso!
    Non facevo riferimento a problemi di correzione...

    Si tratta di usare gli strumenti giusti per lo scopo adeguato: perchè dovresti influenzare negativamente le performance del programma e attirare problemi difficili da individuare come quello che hai avuto usando un controllo che serve per la visualizzazione di testo per la memorizzazione di una stringa di configurazione?
    Oltre ad utilizzare una risorsa dispendiosa in termini di codice, devi scrivere anche codice più complesso per adeguarti alle specifiche dettate, anzi forzate dal Memo quando potresti immagazzinare tutti i dati in una stringa, risparmiando codice, evitando che gli effetti collaterali del controllo visuale ti ostruiscano nel raggiungimento del tuo obiettivo (come è accaduto), ottimizzando le prestazioni ed eliminando tutto quel codice che serve solamente a far funzionare il controllo visuale allo stesso modo di una normale stringa, risorsa che puoi già sfruttare direttamente.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Originariamente inviato da alka
    Non facevo riferimento a problemi di correzione...

    Si tratta di usare gli strumenti giusti per lo scopo adeguato: perchè dovresti influenzare negativamente le performance del programma e attirare problemi difficili da individuare come quello che hai avuto usando un controllo che serve per la visualizzazione di testo per la memorizzazione di una stringa di configurazione?
    Oltre ad utilizzare una risorsa dispendiosa in termini di codice, devi scrivere anche codice più complesso per adeguarti alle specifiche dettate, anzi forzate dal Memo quando potresti immagazzinare tutti i dati in una stringa, risparmiando codice, evitando che gli effetti collaterali del controllo visuale ti ostruiscano nel raggiungimento del tuo obiettivo (come è accaduto), ottimizzando le prestazioni ed eliminando tutto quel codice che serve solamente a far funzionare il controllo visuale allo stesso modo di una normale stringa, risorsa che puoi già sfruttare direttamente.
    Ehm...forse non hai frainteso qual è l'utilizzo di questo programma, o, molto più probabilmente, io mi sono spiegato male e non ho capito cosa mi stai dicendo:
    Il programma non ha lo scopo di configurare direttamente un'interfaccia, ma di creare a video un template che verrà poi usato dai tecnici sul posto per configurare ciascuna macchina.
    Ho quindi bisogno di creare a video questa schermata che NON può avere errori grafici, in quanto viene copiato ed incollato sulla macchina specifica, senza che "l'uomo" modifichi nulla!

    Da quel che ho capito tu mi stai consigliando di creare un stringa (AnsiString) in cui è presente il template...non è più dispendioso? Un'unica stringa che mantenga 100 o più righe con gli spazi ed i ritorno a capo esattamente come voglio io? Non so... ...mi pare peggio...

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,311
    Originariamente inviato da Ephestus
    Ehm...forse non hai frainteso qual è l'utilizzo di questo programma, o, molto più probabilmente, io mi sono spiegato male e non ho capito cosa mi stai dicendo:
    Il programma non ha lo scopo di configurare direttamente un'interfaccia, ma di creare a video un template che verrà poi usato dai tecnici sul posto per configurare ciascuna macchina.
    Ho quindi bisogno di creare a video questa schermata che NON può avere errori grafici, in quanto viene copiato ed incollato sulla macchina specifica, senza che "l'uomo" modifichi nulla!
    Ora ne ho capito di più...

    Originariamente inviato da Ephestus
    Da quel che ho capito tu mi stai consigliando di creare un stringa (AnsiString) in cui è presente il template...non è più dispendioso? Un'unica stringa che mantenga 100 o più righe con gli spazi ed i ritorno a capo esattamente come voglio io? Non so... ...mi pare peggio...
    Perchè dovrebbe essere più dispendioso? In che senso dovrebbe esserlo? Pensaci bene...

    In realtà, tu stai già lavorando su una AnsiString, anche se non lo sai, poichè è quello il supporto ultimo di memorizzazione usato dalla proprietà Lines.
    Il problema è che tu sei obbligato ad utilizzare i metodi della classe TStringList a cui Lines appartiene, quindi richiami erroneamente i metodi Add oppure Insert che sono senz'altro più complessi del semplice accodamento manuale che potresti eseguire su una normale AnsiString definita da te, mi segui?

    A questo si aggiunge il fatto che non stai lavorando su una TStringList creata da te, ma sulla proprietà Lines che appartiene al controllo Memo; il controllo reagisce in un certo modo ad ogni aggiornamento del testo contenuto...perchè fare eseguire questo codice ad ogni più piccola aggiunta fatta al testo? Questo sì che mi sembra dispensioso...

    Voglio precisare che nella realtà non è che noteresti grossi cambiamenti, intendiamoci...sto solo cercando di farti capire il mio punto di vista generale sul fatto di scegliere sempre il mezzo che più si avvicina all'esigenza che hai in un certo punto del processo di sviluppo del tuo programma.
    Non fraintendere, si tratta di frivolezze, non certo di un'aspra critica.

    Nel caso in esame, hai a tutti gli effetti già risolto il problema, ma se tu fossi partito da subito con il concetto di "evito i problemi di gestire la mia stringa nel Memo e me la costruisco internamente eludendo tutti i possibili effetti collaterali per visualizzarla solamente alla fine del processo", forse non avresti nemmeno aperto questa discussione.

    Cerco solamente di indirizzarti verso un modo di pensare che - secondo me, ovviamente - è formalmente più corretto.

    Va benissimo anche la tua soluzione attuale; io comunque non avrei corso rischi ed avrei utilizzato subito una stringa per concatenare testi parziali e ritorni a capo, concludendo con l'assegnazione della stringa alla proprietà Lines.Text del TMemo "in blocco" per la sua visualizzazione, anzi avrei potuto addirittura evitare questo passaggio e copiare direttamente il testo nella Clipboard, rileggendo le tue specifiche.

    L'importante è che tu abbia compreso il mio punto della questione, poi ovviamente scegli la soluzione che ritieni più adatta e più giusta...magari, tieni conto di quanto detto alla prossima occasione.

    Happy implementation!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Originariamente inviato da alka
    In realtà, tu stai già lavorando su una AnsiString, anche se non lo sai, poichè è quello il supporto ultimo di memorizzazione usato dalla proprietà Lines.
    Il problema è che tu sei obbligato ad utilizzare i metodi della classe TStringList a cui Lines appartiene, quindi richiami erroneamente i metodi Add oppure Insert che sono senz'altro più complessi del semplice accodamento manuale che potresti eseguire su una normale AnsiString definita da te, mi segui?
    Bhé ho capito cosa vuoi dire, però c'è da notare che se io definisco un'AnsiString Pippoa questa riesco a inserire un valore Pippo="Amico di Topolino" o ad aggiungerlo in riga Pippo=Pippo+" e di Minnie" Però non trovo il ritorno a capo.... (mi sento un'idiota)
    Originariamente inviato da alka
    A questo si aggiunge il fatto che non stai lavorando su una TStringList creata da te, ma sulla proprietà Lines che appartiene al controllo Memo; il controllo reagisce in un certo modo ad ogni aggiornamento del testo contenuto...perchè fare eseguire questo codice ad ogni più piccola aggiunta fatta al testo? Questo sì che mi sembra dispensioso...
    Non c'è dubbio che tu abbia ragione! Rimane sempre e solo l'unico problema descritto sopra
    Originariamente inviato da alka
    Voglio precisare che nella realtà non è che noteresti grossi cambiamenti, intendiamoci...sto solo cercando di farti capire il mio punto di vista generale sul fatto di scegliere sempre il mezzo che più si avvicina all'esigenza che hai in un certo punto del processo di sviluppo del tuo programma.
    Non fraintendere, si tratta di frivolezze, non certo di un'aspra critica.
    Frivolezze che separano un buon programmatore da un principiante...

    Originariamente inviato da alka
    Cerco solamente di indirizzarti verso un modo di pensare che - secondo me, ovviamente - è formalmente più corretto.
    E te ne sono grato
    Mi sento un po' leccaculo...ma dico davvero...Più critiche ricevo prima e meglio imparo!


  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,311
    Originariamente inviato da Ephestus
    Però non trovo il ritorno a capo.... (mi sento un'idiota)
    Non lo so nemmeno io...
    In Delphi, si esprime con il carattere # seguito dal codice ASCII. Altrimenti, prova a vedere se hai una costante di nome sLineBreak da utilizzare al suo posto...basta accodarla alla stringa.

    Originariamente inviato da Ephestus
    Frivolezze che separano un buon programmatore da un principiante...
    Mah, per la verità penso ci siano tanti altri fattori diversi da questo.


    Originariamente inviato da Ephestus
    Mi sento un po' leccaculo...
    Perchè mai? Tanto non devo darti voti, quindi...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Originariamente inviato da alka
    Mah, per la verità penso ci siano tanti altri fattori diversi da questo.
    Sicuramente, ma anche la classe con cui si programma e la capacità di rendere un programma leggero, veloce ed affidabile dipendono anche da queste piccole cose. [Più o meno questo era il concetto che il mio prof. di programmazione voleva insegnarci...non importa se il programma funziona ad hoc, l'importante è che la logica che ci sta dietro sia la più semplice, veloce ed intuitiva!]

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.