[Risolto][Vala e GTK4] conversione da weak a global non possibile

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3027
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

[Risolto][Vala e GTK4] conversione da weak a global non possibile

Messaggio da DoctorStrange »

Ciao a tutti. Sviluppo in vala un applicazione per il framework GTK4. Ho questa situazione. Ho definito un oggetto GObject. In pratica questo frammento di codice:

Codice: Seleziona tutto

class executeBash : GLib.Object {
	GLib.List<string> listaOccorrenze = new GLib.List<string>();
	
	public bool processa_lettura(IOChannel canale, IOCondition condition) {
	//Qui faccio cose ma, l'attività sostanziale è popolare la lista che ho
	//definito globalmente a livello di classe:
	this.listaOccorrenze.append("stringa appesa");
	}	
	
	public List<string> BashExecuteWithPipes(string[] spawn_args, string[] spawn_env) {
	//Qui faccio altre cose, ma la piu importante, è di chiamare il
	//metodo qui sopra, e poi ritornare la lista generata lì sopra.
		    var esitoPiping = (uint)output.add_watch(GLib.IOCondition.IN | GLib.IOCondition.HUP, processa_lettura);
			GLib.List<string> listaOut = new GLib.List<string>();
			listaOut = this.listaOccorrenze.copy();
			return listaOut;					    	
	}	
	
}
Questa è la parte principale del frammento di codice che mi mette in crisi: una classe principale di tipo GObject, all'interno della quale ho definito due metodi. Il metodo sottostante, dopo avere eseguito una serie di inizializzazioni e di logica di poco conto, chiama il metodo soprastante il quale legge un IOChannel e popola una lista con le entry risultanto da questa lettura. La lista cosi popolata viene restituita al metodo sottostante.

La compilazione, mi restituisce questo errore, ed impedisce la compilazione:

Codice: Seleziona tutto

../src/executeBash.vala:64.3-64.40: error: Assignment: Cannot convert from `GLib.List<weak string>' to `GLib.List<string>?'
   64 | 		listaOut = this.listaOccorrenze.copy();
      | 		^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
Sembra che la lista definita a livello globale, venga contrassegnata come "weak" dal compilatore e quindi, quando compilo, non può copiare la lista globale, in quella locale per poi restituirla ad altri metodi.

Chiedo quindi: Come si può dichiarare programmaticamente una List come globale, in modo da escludere l'assegnazione iniziale a weak? Oppure esiste un altro modo per procedere alla copia della lista, senza sollevare un errore di assegnazione debole(weak)?

Grazie
Ultima modifica di DoctorStrange il martedì 18 marzo 2025, 10:39, modificato 1 volta in totale.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3027
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: [Vala e GTK4] conversione da weak a global non possibile

Messaggio da DoctorStrange »

Visto che sono passate più di ventiquattr'ore, scrivo qui, in modo da riportare in alto la discussione, ed aggiungo anche alcuni dettagli.
Studiando la documentazione, ho capito un pò di più come funziona il processo. Ogni volta che viene dichiarato un nuovo oggetto, cioè una classe, a run time, questa verrà creata una sola volta e caricata in memoria. Ogni volta che un metodo istanzia una nuova sessione di questo oggetto, non viene creato un nuovo oggetto in memoria, ma un riferimento "reference" all'oggetto.
Il mio problema credo risieda in questo. Dichiarare la mia lista con una visibilità globale all'interno della sua classe, viene visto, a run-time come una reference all'oggetto. Se io voglio usare quest'oggetto, questo sarà marcato come "weak" perchè già esiste un riferimento all'oggetto stesso. Non sò come uscirne. Dovrei creare un nuovo oggetto, ovvero una seconda lista, di appoggio, e copiare al suo interno il contenuto della prima lista. In quale parte della logica però, devo creare la lista di appoggio e copiare?

Grazie
Avatar utente
Rafbor
Prode Principiante
Messaggi: 219
Iscrizione: domenica 13 febbraio 2022, 18:22
Desktop: Xubuntu
Distribuzione: 24.04.2 LTS
Località: Francia

Re: [Vala e GTK4] conversione da weak a global non possibile

Messaggio da Rafbor »

Ciao, dovresti provare a sottoporre il tuo codice a un'IA, che ti suggerirà le correzioni.
Per esempio, l'ho sottoposto a https://www.yiaho.com/ia-generateur-de-code/ (è in francese) ed ecco il risultato:

Codice: Seleziona tutto

class executeBash : GLib.Object {
    GLib.List<string> listaOccorrenze = new GLib.List<string>();

    public bool processa_lettura(IOChannel canale, IOCondition condition) {
        this.listaOccorrenze.append("stringa appesa");
        return true; //Assicurarsi di restituire true o false a seconda della logica del programma.
    }

    public GLib.List<string> BashExecuteWithPipes(string[] spawn_args, string[] spawn_env) {
        var esitoPiping = (uint)output.add_watch(GLib.IOCondition.IN | GLib.IOCondition.HUP, processa_lettura);
        
        // Utilisation de copy() sur la liste originale pour créer une nouvelle liste avec les mêmes éléments  
        GLib.List<string> listaOut = this.listaOccorrenze.copy(); // Assicurarsi che copy() utilizzi il tipo corretto.
        return listaOut;
    }
}
Modifiche apportate :

Ho aggiunto un ritorno true; al metodo processa_lettura. Questo è necessario per indicare se l'operazione è riuscita o meno, a seconda della logica del programma.
Ho chiarito il tipo di listaOut per assicurarmi che sia una GLib.List<string>, che corrisponde all'output di this.listaOccorrenze.copy().

Note aggiuntive:

Verificate anche che l'output sia dichiarato e inizializzato correttamente nella vostra classe. Se l'output non è definito o non è del tipo appropriato, anche questo potrebbe causare problemi.
Se questa.listaOccorrenze deve contenere solo stringhe forti, assicuratevi che nessuna operazione la trasformi in un elenco debole.

Non esitate a farmi sapere se avete bisogno di ulteriore aiuto o se compaiono altri errori!
Facci sapere come va.
RuthWeigel
Prode Principiante
Messaggi: 1
Iscrizione: venerdì 14 marzo 2025, 8:45
Sesso: Maschile

Re: [Vala e GTK4] conversione da weak a global non possibile

Messaggio da RuthWeigel »

Ciao! Interesting problem with the global list being "weak". Have you tried declaring the list static final?
Avatar utente
Rafbor
Prode Principiante
Messaggi: 219
Iscrizione: domenica 13 febbraio 2022, 18:22
Desktop: Xubuntu
Distribuzione: 24.04.2 LTS
Località: Francia

Re: [Vala e GTK4] conversione da weak a global non possibile

Messaggio da Rafbor »

RuthWeigel ha scritto:
venerdì 14 marzo 2025, 8:46
Ciao! Interesting problem with the global list being "weak". Have you tried declaring the list static final?
È una buona idea che volevo anche proporti perché è quella che ho impostato in tutte le mie applicazioni C#: creo una classe statica in cui inserisco tutte le variabili e i metodi globali.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3027
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: [Vala e GTK4] conversione da weak a global non possibile

Messaggio da DoctorStrange »

Scusate il ritardo. Alla fine credo di aver risolto. Come detto da @Rafbor Ho creato una classe esterna alla quale delegare la gestione di tutte le letture. Il problema però era che ancora non riuscivo ad estrarre le letture, perche tutte le istanze create a quella classe, erano inaccessibili. Alla fine ho capito che la lettura dell'IOChannel, viene restituita dalla variabile alla quale IOChannel stesso è assegnato.L'IOFunc nella quale mi ostinavo a cercare di fare il popolamento della mia collection, è delegata solamente se io voglio fare qualche modifica istantanea alla singola entry.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 8 ospiti