[LibreOffice Basic] Passaggio di parametri ad una sub o funzione

di il
3 risposte

[LibreOffice Basic] Passaggio di parametri ad una sub o funzione

Sto studiando il Basic di LibreOffice usando il libro di Andrew Pitonyak (https://www.pitonyak.org/OOME_4_1.odt) e sono incappato in un passaggio dove o c'è un errore oppure non ho capito niente. Prima di scrivere a Pitonyak volevo vedere se qualcuno ha una qualche esperienza da condividere.

Il passaggio si trova a pag.57 (cap. 3.6.1 paragrafo “Pass by reference or by value”):

The following macro uses a variant and a string to call a macro that accepts a variant, and the macro that accepts the string. Passing a variant to a method that accepts a string argument basses the value by reference. The unexpected thing is that passing a string to the method that accepts a variant, passes the value by reference.

Ci sono 2 sub: una accetta un parametro Variant, l'altra un parametro String. L'autore vuole mostrare cosa succede quando si passa un parametro non corrispondente con il tipo atteso, e fa 4 casi. Eseguendo la macro, l'output mostra i seguenti casi:

  1. variabile Variant, parametro String = passaggio by value (il valore della variabile non viene modificato)
  2. variabile String, parametro String = passaggio by reference
  3. variabile Variant, parametro Variant = passaggio by reference
  4. variabile String, parametro Variant = passaggio by reference

Però leggendo il testo, sembra che il caso 1 dovrebbe essere by reference. Il problema è il verbo ‘basses’, che non ho trovato né nel dizionario Merriam-Webster né nel Cambridge. I traduttori on-line lo traducono con ‘abbassare, ridurre’, ma a me sembra più un typo per ‘passes’, e in tal caso la traduzione automatica ha più senso. Però in questo caso l'esempio 1 non sarebbe corretto, perché il passaggio dovrebbe avvenire by reference (a meno che la frase non vada intesa in altro modo).

È aperto il dibattito…

3 Risposte

  • Re: [LibreOffice Basic] Passaggio di parametri ad una sub o funzione

    Mi sembra che sia un errore di stampa (passes). Puoi postare anche gli esempi di codice corrispondenti, se esistono, sul libro?

  • Re: [LibreOffice Basic] Passaggio di parametri ad una sub o funzione

    Sub vSwap( vDatum As Variant )
      Dim asDatum(1 to 3) As String
      Dim sDummy As String
    
      asDatum=Split(vDatum, ".")
      sDummy=asDatum(0)
      asDatum(0)=asDatum(2)
      asDatum(2)=sDummy
      vDatum=Join(asDatum,"-")
    End Sub
    
    Sub sSwap( sDatum As String )
      Dim asDatum(1 to 3) As String
      Dim sDummy As String
    
      asDatum=Split(sDatum, ".")
      sDummy=asDatum(0)
      asDatum(0)=asDatum(2)
      asDatum(2)=sDummy
      sDatum=Join(asDatum,"-")
    End Sub 
    
    Sub passByReferenceTester
      Dim vVar As Variant
      Dim sVar As string
      Dim s As String
    
      vVar="01.02.2011"
      sVar="01.02.2011"
    
      s = vVar & " sSwap( variant var string param ) ==> "
      sSwap(vVar)
      s = s & vVar & CHR$(10)
    
      s = s & sVar & " sSwap( string var string param ) ==> "
      sSwap(sVar)
      s = s & sVar & CHR$(10)
    
      vVar="01.02.2011"
      sVar="01.02.2011"
      s = s & vVar & " vSwap( variant var variant param ) ==> "
      vSwap(vVar)
      s = s & vVar & CHR$(10)
    
      s = s & sVar & " vSwap( string var variant param ) ==> "
      vSwap(sVar)
      s = s & sVar & CHR$(10)
    
      MsgBox(s)
    End Sub

    L'output di passByReferenceTester è questo (LibreOffice 7.4.7):

    01.02.2011 sSwap( variant var string param ) ==> 01.02.2011
    01.02.2011 sSwap( string var string param ) ==> 2011-02-01
    01.02.2011 vSwap( variant var variant param ) ==> 2011-02-01
    01.02.2011 vSwap( string var variant param ) ==> 2011-02-01

    Il codice è preso dal file odt.

  • Re: [LibreOffice Basic] Passaggio di parametri ad una sub o funzione

    Aggiornamento: ho scritto ad Andrew Pitonyak, che mi ha molto gentilmente risposto.

    La sostanza è (in breve) questa:

    • se il tipo tra variabile e paramentro della funzione è diverso, il passaggio avviene per COPIA (ByVal).
    • se il tipo tra variabile e parametro della funzione è lo stesso, il passaggio avviene per RIFERIMENTO (ByRef).

    Nell'esempio che lui riporta, invece, se variabile è String e parametro è Variant, il passaggio avviene per RIFERIMENTO.

    Ed è una stranezza che neanche i programmatori di OpenOffice che lui ha interpelllato sanno spiegare (alcuni dicono che altre parti di OOBasic hanno comportamenti non conformi, ma non ricordano quali).

    Comunque ha riscritto parte di quel paragrafo e modificato la macro. Ha anche aggiornato il paragrafo sulla funzione IsMissing che dalla versione 7 di LibreOffice funziona correttamente.

Devi accedere o registrarti per scrivere nel forum
3 risposte