Gambas-it

Gambas3 => Programmazione => Topic aperto da: jockerfox - 02 Settembre 2013, 15:24:14

Titolo: Come sapere il nome del Modulo Chiamante?
Inserito da: jockerfox - 02 Settembre 2013, 15:24:14
Domandina un po difficilina..  ;D
Abbiamo il seguente:

Citazione da: Modulo1
Public sub FunzionePippo()
...
Modulo2.FunzionePaperino()
...
End

Citazione da: Modulo2
Public sub FunzionePaperino()
...
Print <il chiamante>
...
End

Citazione da: FMain
...
Modulo1.FunzionePippo()
...

Come faccio a sapere chi è il chiamante?
In questo caso il Chiamante è Modulo1. Infatti Modulo1 chiama la funzione "FunzionePaperino" in Modulo2.
Chiaro, no?
Titolo: Re: Come sapere il nome del Modulo Chiamante?
Inserito da: vuott - 02 Settembre 2013, 15:56:49
Interessante... ma sarà possibile in assoluto ?
Non sarà forse necessario che il chiamante trasmetta al chiamato una esplicita traccia di sé ?
Titolo: Re: Come sapere il nome del Modulo Chiamante?
Inserito da: md9327 - 02 Settembre 2013, 16:44:08
La cosa in teaoria sarebbe possibile, in quanto gambas ha ovviamente traccia di tutti i passaggi.
Tanto per fare un esempio, basta guardare il trace emesso da Error.

Il problema, da me anche affrontato a suo tempo, è che attualmente non esistono funzionalità on-line per vedere questa trace.
Per farlo sarebbe da intervenire sui sorgenti di gambas, ma qui diventa un'altro discorso.

Una possibile soluzione è quella di gestire il tutto a livello di Event, in quanto esiste la keyword LAST che ti permette di sapere chi ha chiamato una certa funzione. Non sò se questo è possibile anche senza gestiore eventi, ovvero se LAST funziona anche con la sola chiamata diretta della funzione, dovresti provare, io non l'ho mai tentato...
Titolo: Re: Come sapere il nome del Modulo Chiamante?
Inserito da: vuott - 02 Settembre 2013, 16:59:52
Ho provato il tuo suggerimento di Last, ponendo come segue questa parola nel Modulo chiamato dal Modulo chiamante:
Codice: gambas [Seleziona]

' Gambas module file


Public Sub m2()
  
   Print Object.Type(Last)
  
End


...ma il risultato in console è:  FMain

 :-\

(da tenere conto che la sequenza è: FMain chiama Modulo1, il quale chiama il Modulo2)

Titolo: Re: Come sapere il nome del Modulo Chiamante?
Inserito da: vuott - 03 Settembre 2013, 10:19:45
Ho posto la questione nella Mailing List ufficiale di Gambas, ed ho ottenuto una prima risposta:

" If I haven't misunderstood, doesn't
        
Codice: gambas [Seleziona]
System.Backtrace[1]

provide exactly that?

But, note that the project will need to be compiled with "Keep debugging information" option set.

hth
Bruce
"

...ovviamente da verificare.
Titolo: Re: Come sapere il nome del Modulo Chiamante?
Inserito da: md9327 - 03 Settembre 2013, 10:30:16
Mmmmmm, potrebbe essere proprio quello che cerca jocke...
E' da un pò che non metto mano a gambas, è probabile che siano apparse nuove funzionalità. Forse con System sono emerse funzionalità fino ad ora ad esclusivo uso dell'interprete...

Riguardo alla tua prova, le due funzioni erano dentro lo stesso file FMain?
In ogni caso, LAST ritorna l'oggetto chiamante e non il suo metodo... (non avevo specificato questa cosa nella mia precedente...).
Titolo: Re: Come sapere il nome del Modulo Chiamante?
Inserito da: vuott - 03 Settembre 2013, 10:40:52

Riguardo alla tua prova, le due funzioni erano dentro lo stesso file FMain?

In FMain v'è una chiamata alla funzione del primo Modulo; nel primo Modulo v'è la chiamata alla funzione del secondo Modulo.
Titolo: Re: Come sapere il nome del Modulo Chiamante?
Inserito da: vuott - 03 Settembre 2013, 13:04:12
Mmmmmm, potrebbe essere proprio quello che cerca jocke...


Eh, sì, ho fatto una prova. E' proprio quello che lui cercava !  :)