Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802

    Puntatori, MemProof e deallocazioni di memoria

    Ciao Alka,
    ho verificato con MemProof il software per testare la DLL e non mi restituisce nessun errore anche commentando il FreeMem usato per deallocare la memoria allocata manualmente dalla DLL. In base a quanto mi dicevi però non dovrebbe essere corretto, amenochè una volta chiuso il form, windows mi deallochi in automatico i buffer allocati dalla DLL. Sempre all'interno di MemProof, nella sezione "Debug Window", capita di trovare alcune voci del tipo:
    Exception 80000003 BREAKPOINT at 7C911230
    ma anche parecchie Exception di access violation. Nonostante questi messaggi il software però non da segni di problemi o errori ma non credo sia comunque una cosa normale. Confermi?
    www.beppegrillo.it
    Il blog di Beppe!!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Non è ben chiaro come tu abbia disposto i test, ad ogni modo non conosco il tool (MemProof) a cui fai riferimento, non l'ho mai utilizzato, quindi non saprei darti opinioni sui risultati che fornisce.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    Tu non fai mai test sulla memoria che occupa il tuo programma? Comunque non so perchè ma non mi convince per niente la verifica che ho fatto, mi fido di più di te che di MemProof. Ma come si fa a distribuire un software senza uno straccio di documentazione? Sarà anche gratuito ma non ha senso.

    Comunque tornando a noi, se mantengo la deallocazione manuale come mi hai consigliato tu, mi comporta parecchi problemi se tento di connettermi nuovamente via seriale. C'è qualcosa che mette in crisi tutto lo script ma che mi venissero 100 euro in tasca se riesco a capire dove sta questo maledetto problema.
    www.beppegrillo.it
    Il blog di Beppe!!

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da colde
    Tu non fai mai test sulla memoria che occupa il tuo programma?
    Lo vedo dal Task Manager. Certo, se osservassi un aumento a dismisura della memoria, dovrei cercare di risalire al punto nel sorgente in cui si verifica il memory leak, ma cerco sempre di fare uso dei costrutti e delle procedure Delphi che garantiscono la distruzione degli oggetti che creo, mantenendo il più pulito e organizzato il codice, usando solo strutture che sono in grado di padroneggiare (o che mi predispongo a padroneggiare).

    Ho un'applicazione che smista la posta elettronica e gestisce caselle email con i componenti Indy, facendo sia da server sia da client POP3/SMTP; gira perennemente non occupa mai più di 5MB (a interfaccia aperta), mentre occupa circa 980Kb quando ridotto nella tray; se lavorando mantiene questi valori per giorni e giorni, suppongo che il "core" del programma sia ben strutturato e funzionante.

    Originariamente inviato da colde
    Comunque non so perchè ma non mi convince per niente la verifica che ho fatto, mi fido di più di te che di MemProof. Ma come si fa a distribuire un software senza uno straccio di documentazione? Sarà anche gratuito ma non ha senso.
    Ma come non ha senso... certo che se vuoi "capra e cavoli"... qualsiasi cosa gratuita si tiene così com'è, senza tralasciare il fatto che potresti averlo scaricato da un sito in cui l'azienda consente il download del programma ma ne fornisce l'assistenza tecnica a pagamento: il solo fatto di poterlo usare è già un grande regalo, se permetti.

    Se ritieni che sia insufficiente, allora procedi con l'acquisto di un tool differente.

    Originariamente inviato da colde
    Comunque tornando a noi, se mantengo la deallocazione manuale come mi hai consigliato tu, mi comporta parecchi problemi se tento di connettermi nuovamente via seriale. C'è qualcosa che mette in crisi tutto lo script ma che mi venissero 100 euro in tasca se riesco a capire dove sta questo maledetto problema.
    Penso che sia doveroso precisare che, al di là di qualche suggerimento, non posso fornirti assistenza tecnica remota su quello che è il codice della tua DLL, l'impostazione del tuo progetto, il modo in cui lo usi, la configurazione del compilatore e così via, insomma non mi è possibile umanamente diagnosticare qualsiasi tipo di problema, anche se il codice viene parzialmente riportato qui, né ho il tempo sufficiente (ammesso che riuscissi a fare ciò) di fornirti un'analisi dettagliata... ai miei clienti cosa racconto? e io quando lavoro?

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

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

  5. #5
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    lo so, hai ragione. Sto cercando non a caso di documentarmi il più possibile ma ancora sti maledetti puntatori mi danno problemi, non mi entrano in testa; non pensavo fossero così complessi da capire, o forse sono io che sono un po duro di comprendonio. E dire che di guide ne ho lette! Ma niente da fare.
    www.beppegrillo.it
    Il blog di Beppe!!

  6. #6
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    Guarda questa cosa:

    repeat
    while ApdComPort1.CharReady do
    begin
    Response := Response+ApdComPort1.GetChar;
    end;
    until TimerExpired(ET);
    //Alloco memoria per contenere il valore di ritorno della funzione da passare al software
    GetMem(Result,Length(Response));
    //Copio il valore di ritorno nella variabile che la funzione ritorna
    Result := @Response[1];

    Result è di tipo PChar.

    Teoricamente il codice è corretto ma:
    - Response contiene tutta la stringa corretta che riceve dalla seriale
    - Result solo una parte

    Response contiene una stringa con diversi caratteri null (#0) ma nonostante tutto è completa (teoricamente invece dovrebbe terminare quando riceve un carattere null-terminated che se non erro è proprio #0); Result invece dovrebbe fregarsene dei caratteri nulli dato che non è null-terminated e invece quando trova un valore nullo termina. Perchè? Come posso ovviare a sta cosa? Scusa se ti inondo di domande ma mi serve per capire ciò che dalla documentazione non capisco.
    www.beppegrillo.it
    Il blog di Beppe!!

  7. #7
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    Piccola precisazione: non posso sostituire il carattere null con altro carattere.

    Edit:
    ok anche i PChar sono null-terminated.
    Ma allora cosa diavolo posso usare? Se uso le string (stranamente se ne frega del carattere di terminazione), quando dealloco la memoria mi da access violation, se uso il PChar come variabile di ritorno tra le due funzioni mi tronca i dati..vado a sdraiarmi su un'autostrada.

    Funzione Polling()
    ResponseBox := DownloadPolling(String(GID), String(DID));

    Funzione DownloadPolling()
    Response := 'abcd#0efghil#0mnop#0qrst#0uvz'
    Result := PChar(Response);

    ho bisogno di ferie
    www.beppegrillo.it
    Il blog di Beppe!!

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.