Autore Topic: Ordinare vettori separati  (Letto 1476 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ordinare vettori separati
« Risposta #15 il: 02 Marzo 2018, 02:12:57 »
Se non vado errante per passare un parametro come indirizzo e non per valore c'è l'istruzione ByRef.
Sì, Gambas fornisce, come risorsa dedicata in modo specifico per passare un valore "per Riferimento" (che è come dire "per Indirizzo"), la parola-chiave " ByRef ":
Codice: [Seleziona]
Public Sub Main()

  Dim vl As Integer
 
   vl = 10

   Funzione(ByRef vl)
 
   Print vl

End


Private Function Funzione(ByRef i As Integer)
 
  i *= 1000
 
End
Evidentemente la parola-chiave " ByRef " provvederà a passare alla Funzione chiamata l'indirizzo di memoria della variabile da passare come parametro attuale.

Come però sappiamo, noi possiamo utilizzare anche un Puntatore, o più precisamente "l'indirizzo di memoria della variabile" (di un tipo numerico o anche di tipo String), per effettuare un passaggio a una sotto-procedura (più segnatamente una Funzione).
Per avere l'indirizzo di memoria della variabile, da passare, dovremo utilizzare la funzione " VarPtr( ) ".
Questa modalità comporta, però, un lavoro più complesso all'interno della Funzione chiamata, in particolare se il valore passato attraverso il Puntatore deve essere manipolato, poiché - come sappiamo - per incidere sui dati presenti nell'area di memoria puntata da un Puntatore è assolutamente necessario l'uso delle risorse dei " Memory Stream ".

Esempio:
Codice: [Seleziona]
Public Sub Main()

  Dim vl As Integer
 
   vl = 10

   Funzione(VarPtr(vl))
 
   Print vl

End


Private Function Funzione(p As Pointer)
 
  Dim st As Stream

' 1) Dereferenziamo il Puntatore ricevuto;
' 2) Manipoliamo il suo valore originario contenuto nella variabile "i";
' 3) Scriviamo il nuovo valore nell'area di memoria puntata dal Puntatore "p";
   st = Memory p For Write
   Write #st, Int@(p) * 1000 As Integer
   st.Close
 
End
« Ultima modifica: 02 Marzo 2018, 03:34:17 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ordinare vettori separati
« Risposta #16 il: 02 Marzo 2018, 15:22:39 »
Il passaggio "per Indirizzo" fa in modo che la modifica avvenga direttamente ...all'indirizzo di memoria dell'Oggetto (o del tipo di valore) passato. Quindi non si crea una copia e non si deve così occupare altra memoria per il medesimo dato da passare.
Ogni "Oggetto" di Gambas è innanzitutto costituito da più porzioni di memoria, organizzate secondo le specifiche Strutture previste dai sorgenti di Gambas per ciascun Oggetto, dedicate a immagazzinare i dati che caratterizzeranno gli Oggetti medesimi.

Da ciò deriva che, se un Oggetto è generato via codice, è possibile in talune circostanze (ove non siano richiesti gli Eventi disponibili dell'Oggetto in questione) evitare l'uso delle variabili Globali, per rappresentare l'Oggetto medesimo, e usare invece una variabile locale da passare " per Indirizzo " a una Funzione.

Mostriamo un breve codice con mero fine esemplificativo:
Codice: [Seleziona]
Public Sub Button1_Click()

  Dim vb As ValueBox
 
   With vb = New ValueBox(Me)
     .X = 100
     .Y = 100
     .W = 50
     .H = 30
     .Alignment = Align.Right
     .Value = 10
     
   End With
   
   Wait 2

   Funzione(vb)
 
   Wait 2
 
   vb.Value *= 4

End


Private Function Funzione(vlb As ValueBox)
 
  vlb.Value *= 1000
 
End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »