Italian community of Lazarus and Free Pascal
Programmazione => Generale => Topic aperto da: suibaf - Febbraio 09, 2025, 09:47:07 pm
-
Salve,
stò lavorando, a livello amatoriale, su Lazarus e stò prendendo confidenza con l'ambiente. (4.0RC2).
Stò cercando di fare il porting di un vecchio software scritto in un altro linguaggio.
Apparte la manualità di alcuni processi:
- dover lavorare sui distruttori;
- mi sembra non ci sia un garbage collector;
- ho dovuto rinominare un pulsante e ho duvuto cercare manualmente e rinominare il pulsante ovunque.
Mi piacerebbe saper se sono io che ancora non conosco l'ambieente oppure devvo lavorare davvero a mano per effettuare questa semplice operazione.
Grazie mille
-
Ti rispondo su alcune cose, non conosco troppo bene l'ambiente per poterti aiutare completamente su ciò che hai chiesto.
Il Pascal (quindi Lazarus, Delphi, etc ...) non ha un garbage collector, le risorse vengono deallocate immediatamente.
Per tutti i shortcut vai qui: https://wiki.freepascal.org/Lazarus_IDE_Shortcuts (https://wiki.freepascal.org/Lazarus_IDE_Shortcuts)
Per quello che riguarda la rinominazione di una entità, se vai sulla entità da rinominare e clicchi con il tasto dx del mouse ti compare un menu, e una delle voci è "REFACTORING" ... li trovi ciò che ti serve.
Quando crei un nuovo metodo in una classe, se lo definisci prima nella sezione interface (cioè devo la classe viene definita) premendo <CTRL> <SHIFT> D l'IDE ti crea l'implementazione nella sezione implementation.
Per quello che riguarda i distruttori, le classi devono averli solo se all'interno della classe stessa crei (il termine tecnico è ISTANZI) delle risorse che non hanno come "parente" la classe stessa e non le liberi prima che la classe venga "distrutta".
Giusto per farti capire, la tua Form principale e tutti i suoi componenti di base non hanno un distruttore dichiarato, eppure sono istanziate e non c'è alcun leak senza distruttori quando chiudi l'applicazione.
Le variabili di tipo numerico, stringa o record non vanno distrutte e quindi il loro uso non implica l'uso di un eventuale distruttore. Per le variabili di tipo puntatore generico a cui sono assegnate delle risorse vanno liberate le risorse, non la variabile stessa. Ciò si fà eseguendo un cast o con la parolina "as" (che identifica un cast con la sintassi del Pascal) o dereferenziando la variabile stessa (con il carattere ^).
Le variabili di tipo "array non statico" devono essere poste a zero come lunghezza oppure eguagliate a nil, tenendo presente che il loro contenuto và liberato prima se non è un tipo "integrale". Cioè se l'array è un array di classi ad esempio, ovviamente ogni singolo elemento dell'array và "liberato" prima di eliminare l'array stesso.
Anche per i record valgono le stesse precauzioni: il record di per sè non deve essere liberato esplicitamente ma se qualche membro di un record non è il solito tipo intergale allora questo deve essere distrutto prima.
Come tutti i linguaggi, è necessario conoscerne la specificità per ottenere il massimo con il minimo sforzo. E il Pascal ha la curva di apprendimento migliore di tutti i linguaggi, quindi con un minimo di esperienza potrai sicuramente trovarti più a tuo agio.
Ciao
-
Per quello che riguarda la rinominazione di una entità, se vai sulla entità da rinominare e clicchi con il tasto dx del mouse ti compare un menu, e una delle voci è "REFACTORING" ... li trovi ciò che ti serve.
Per praticità:
I controlli grafici (tipo appunto i bottoni) li puoi rinominare con l'Object Inspector modificando la proprietà "Name": confermando, verranno rinominati anche tutti i metodi e gli eventi.
Per le variabili segui le indicazioni di DragoRosso ma, per praticità, ti posso dire che il tasto F2 sopra il nome di una variabile, normalmente risolve alla grande in tutto il sorgente.
-
Intanto veramente grazie per le risposte e complimenti! Per gioco ho fatto la stessa domanda a ChatGpt. Segue la risposta:
Lazarus, essendo basato su Free Pascal, non ha un garbage collector come i linguaggi moderni tipo Java o Python. La gestione della memoria è manuale, quindi devi occuparti tu di creare e distruggere gli oggetti nel modo corretto.
Risposte ai tuoi dubbi:
Gestione della memoria e distruttori
Sì, devi gestire manualmente gli oggetti creati dinamicamente (con Create e Free o FreeAndNil).
Se un oggetto è assegnato a un TComponent con un Owner, viene liberato automaticamente quando l'Owner viene distrutto.
Se non usi un Owner, devi liberare la memoria manualmente.
Rinominare un componente (pulsante) manualmente
In teoria, Lazarus dovrebbe gestire il Refactoring automatico come in altri IDE, ma attualmente questa funzione è limitata.
Se cambi il nome di un componente nell'Object Inspector, Lazarus non aggiorna automaticamente tutti i riferimenti nel codice. Devi farlo tu.
Soluzione alternativa: Puoi usare la funzione "Trova e sostituisci" (Ctrl + H) nell'IDE per velocizzare il processo.
Funzioni che possono aiutarti
Se rinomini un componente e il progetto non è troppo grande, prova la funzione di "Rinomina" (Refactor > Rename Identifier), ma a volte ha problemi.
Usa Find Declaration (Ctrl + Click sul nome del componente) per individuare dove è usato.
Se il nome è usato in molte unità, puoi usare la ricerca su tutto il progetto (Ctrl + Shift + F).
Purtroppo, Lazarus non ha lo stesso livello di automazione di altri IDE moderni come Delphi, quindi sì, alcuni passaggi vanno fatti a mano. Però, con gli strumenti giusti, puoi ridurre il lavoro manuale. 😊
-
uhm...
secondo me gli hanno gli fatto fare il deep learning nei forum di embarcadero ;D
comunque ci sono molte altre cose da dire sulla liberazione delle risorse in Free Pascal
si può usare il reference counting delle interfacce
oppure usare le liste di oggetti che assumono l'ownership degli oggetti contenuti
ci sono anche delle discussioni come questa che segue (ma anche altro), che però di consiglio di sperimentare quando avrai un po' più di padronanza con lazarus/fpc
https://forum.lazarus.freepascal.org/index.php?topic=37524.0 (https://forum.lazarus.freepascal.org/index.php?topic=37524.0)
quello che ti poso dire è che la mancanza del garbage collector non è poi così drammatica, anzi :)
semplicemente ci sono altri meccanismi per fare quello che fa un gc ma che vanno in funzione esattamente quando serve
-
Mi associo a quanto detto da @nomorelogic.
Il garbage collector è secondo me un impiccio, parlo in termini generali. Meglio avere prontezza della situazione e con il Pascal c'è l'hai.
Puoi fare interi programmi costruendo classi, metodo, oggetti vari, etc ... senza chiamare alcun distruttore (sul ns. blog c'è l'esempio sulle interfacce).
Le tecniche per fare questo sono le più varie, è necessario solo capire come funzionano i principi di allocazione, istanza, referenza, liberazione, scopo e vita di un oggetto, reference counting.
Ma pian piano vedrai che tutto ciò sarà semplicemente normale e non ci penserai su più.
-
uhm...
secondo me gli hanno gli fatto fare il deep learning nei forum di embarcadero ;D
Quale posto migliore per istruire una "intelligenza" sul Pascal ? ;D ;D ;D
-
Anche no.
Poi ci pensa l'AI a scrivere i programmi.
Come allenare il tuo boia a farti fuori ... ;D ;D ;D ;D
-
Anche no.
Poi ci pensa l'AI a scrivere i programmi.
Come allenare il tuo boia a farti fuori ... ;D ;D ;D ;D
OT ESTREMO, ma lasciatemi questa libertà ...
Hi, hi, hi il boia difetta dell'arma. Una IA, per ora, non riesce e secondo me non riuscirà a breve e neanche a medio termine a fornire un progetto completo. Lo fà, ma è imbarazzante, con progetti noti mettendoci del suo e facendo si che ciò che fornisce sia inutile.
Il programmatore servirà sempre e comunque. Il ruolo dello stesso forse cambierà, però "non c'è mai un male che non sia anche un bene" (proverbio della mia regione), per dire che forse sia andrà in realtà in meglio per noi.
Ciò che vedo invece come pericolo, oltre alla manomissione della realtà filtrata dalla IA, è la "presa" di ogni informazione come la parola di DIO in terra. Se frequentate i forum vedrete sempre più spesso gente che propone soluzioni copiate pari pari da una IA, affermando che se l'ha "detto" lei allora sarà così.
Poi a livello di posti di lavoro, direi che chi ci perderà saranno sicuramente tutti i lavori impiegatizi: pensate alle segretarie ... dove c'è ne una magari non ci saranno problemi, ma dove ce ne sono molte ... il lavoro "impiegatizio" la IA lo svolge bene e quasi perfettamente, non serviranno più 5-10-20 ... segretarie ma solo un decimo e forse anche meno.
Più che per i programmatori il problema si riverserà su altri fronti sociali e allora si che saranno dolori.
Comunque vedremo dai. Vi lascio in compagnia dell'inno del programmatore, caso mai ve la foste persa.
Questo è un link della versione teatrale, solo per i forti di stomaco ;D :https://www.youtube.com/watch?v=FRdAbptTJ40 (https://www.youtube.com/watch?v=FRdAbptTJ40)
Questa è la versione dell'autore originale (cambia solo il video): https://www.youtube.com/watch?v=w5y_oR20DEI (https://www.youtube.com/watch?v=w5y_oR20DEI)
-
Comunque vedremo dai. Vi lascio in compagnia dell'inno del programmatore, caso mai ve la foste persa.
Questo è un link della versione teatrale, solo per i forti di stomaco ;D :https://www.youtube.com/watch?v=FRdAbptTJ40 (https://www.youtube.com/watch?v=FRdAbptTJ40)
Non è poi così male :D