Autore Topic: [RISOLTO] AND condizionale che valuta secondo operando solo se necessario  (Letto 1637 volte)

Offline filipsnew

  • Gamberetto
  • *
  • Post: 28
    • Mostra profilo
esiste di suo questa operazione?
« Ultima modifica: 09 Aprile 2015, 11:32:17 da filipsnew »
Sub <homofaberfortunaesuae> End

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #1 il: 03 Aprile 2015, 09:43:57 »
...non mi risulta  :-\ l'esistenza in Gambas di un operatore simile al AndAlso del VB.
« 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #2 il: 03 Aprile 2015, 14:23:46 »
Una cosa del genere non è logica booleana vera e propria. Una operazione And richiede sempre un confronto a due.
Non mi viene nessuna maniera di simularla a dire il vero.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
« Ultima modifica: 04 Aprile 2015, 00:19:19 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #4 il: 03 Aprile 2015, 18:17:38 »
Il funzionamento l'ho capito, ma mi viene difficile pensare ad una maniera per farlo in Gambas. :-\
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.150
  • Tonno verde
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #5 il: 03 Aprile 2015, 19:33:48 »
Il funzionamento l'ho capito, ma mi viene difficile pensare ad una maniera per farlo in Gambas. :-\

Scusa l'ignoranza ma...
Codice: gambas [Seleziona]
If mystring IsNot Nothing And mystring.Contains("Foo") Then 
  ' bla bla
End If
'Questo genera un 'eccezione se mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If
'Questo no

'Ma se tu fai:

If mystring IsNot Nothing Then
  If mystring.Contains("Foo") Then
    'bla bla
  Endif
End If


non ottieni lo stesso risultato?
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #6 il: 04 Aprile 2015, 02:21:39 »
non ottieni lo stesso risultato?

Sostanzialmente sì.


Potremmo divertirci anche con il C ;D creando un'apposita libreria esterna dinamica: nella cartella Dati del progetto scriveremo questo file sorgente di C, che chiameremo, ad esempio, andalso.c:
Codice: c [Seleziona]
float AndAlso(int num, int denom) {

   float rit = 0.0;

   if (denom != 0 && num/denom) {   // evita che il calcolo num/denom generi un errore di divisione per zero
       rit = (float) num/denom;
       return rit;
   }

   return -1;

}


Il codice principale di Gambas sarà:
Codice: gambas [Seleziona]
Private Extern AndAlso(n As Integer, c As Integer) As Single In "/tmp/andalso"


Public Sub Main()

  Dim rit As Single

   Creaso()
   
    rit = AndAlso(100, 40)
    If rit = -1 Then Error.Raise("Errore: eccezione in virgola mobile !")
   
    Print rit

End


Private Procedure Creaso()
 
    Shell "gcc -o /tmp/andalso.so " &/ Application.Path &/ "andalso.c -shared -fPIC" Wait
 
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. »

Offline filipsnew

  • Gamberetto
  • *
  • Post: 28
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #7 il: 04 Aprile 2015, 11:40:41 »
ciao e grazie. Non capisco.. avevo cancellato immediatamente questo post, perché subito dopo avevo trovato alcune risposte sull'argomento. Ma forse è meglio che si sia mantenuto, perché la risposta è che esiste in Gambas la valutazione di corto circuito per OR e AND, con il vincolo (limite che in .NET non sussiste) che non possono essere mescolati (= solo sequenze di OR oppure solo sequenze di AND) e la sequenza deve stare su un'unica riga.

P.es.:

Codice: [Seleziona]
 
  Dim c As integer

  i = 2324
          
  If i = 2324 Or If c = 1 / 0 Then
    
     Stop
    
  Else
    
     Stop
        
  Endif

non solleva alcuna eccezione. Questo è più elegante e leggibile (almeno per me) di quanto risulti annidare comandi If (cosa che inzialmente avevo ovviamente fatto, e che comunque per l'OR non avrebbe senso).

@vuott: non ho capito quello che hai fatto.. hai creato una libreria in C poi l'hai eseguita tramite creasol, ma a cosa serve? usi il cortocircuito di C per valutare una divisione o sollevare eccezione di divisione per zero.. ???
« Ultima modifica: 04 Aprile 2015, 11:55:11 da filipsnew »
Sub <homofaberfortunaesuae> End

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.150
  • Tonno verde
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #8 il: 04 Aprile 2015, 12:14:47 »
Per rimanere nell'esempio fatto inizialmente sarebbe più corretto così:

Codice: gambas [Seleziona]
Dim c, i As Integer
   c = 10
  
  If c = 11 And If i = 1 \ 0 Then
    
  Endif

 :ciao:

P.S. A me questo pare proprio un And Destro ne più ne meno di quello di VB.Net.
Infatti anche AndAlso valuterà la seconda voce se la prima è corretta  :-\
« Ultima modifica: 04 Aprile 2015, 13:23:59 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #9 il: 04 Aprile 2015, 14:22:30 »

@vuott: non ho capito quello che hai fatto.. hai creato una libreria in C....
Sì, solo un esempio con il C.   :-\

La soluzione del C evita il blocco causato dall'eccezione (cosa che faccio rilevare da Gambas solo successivamente). Infatti il C in quel caso salta semplicemente l'intera istruzione condizionale.
« 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 filipsnew

  • Gamberetto
  • *
  • Post: 28
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #10 il: 04 Aprile 2015, 14:30:46 »
@vuott, ah ecco! avevo capito male credendo che volessi con la libreria ottenere un equivalente AndAlso in Gambas per valutare in generale espressioni booleane e non vedevo come.. era allora solo un esempio particolare di divisione tra interi col cortocircuito &&
« Ultima modifica: 04 Aprile 2015, 14:35:09 da filipsnew »
Sub <homofaberfortunaesuae> End

Offline filipsnew

  • Gamberetto
  • *
  • Post: 28
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #11 il: 04 Aprile 2015, 14:46:21 »
Per rimanere nell'esempio fatto inizialmente sarebbe più corretto così:

Codice: gambas [Seleziona]
Dim c, i As Integer
   c = 10
  
  If c = 11 And If i = 1 \ 0 Then
    
  Endif

 :ciao:

P.S. A me questo pare proprio un And Destro ne più ne meno di quello di VB.Net.
Infatti anche AndAlso valuterà la seconda voce se la prima è corretta  :-\

Infatti è esattamente lo stesso che AndAlso con valutazione di cortocircuito. Però la dichiarazione multipla di variabili che hai fatto non so se sia corretta come in .NET.. infatti quando io ho provato qualche giorno fa mi segnava sempre errore e p.es. 10 integer li dovrei impilare con dichiarazioni dedicate. Un'altra "pecca" che ho rilevato, rispetto a VB.NET, è l'impossibiltà di dichiarare in posizione arbitraria nel corpo di routine. Cmq, fortunatamente questo interprete VB mi sta aiutando enormemente a trasferire alcune cosette su Linux :) .. è molto intuitivo anche se l'intellisense è abbastanza inferiore a quello di casa Microsoft.. comunque sia, complimenti a Minisini!
Sub <homofaberfortunaesuae> End

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.150
  • Tonno verde
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #12 il: 04 Aprile 2015, 15:07:16 »
Però la dichiarazione multipla di variabili che hai fatto non so se sia corretta come in .NET.. infatti quando io ho provato qualche giorno fa mi segnava sempre errore e p.es. 10 integer li dovrei impilare con dichiarazioni dedicate.

Scusa ma non ho capito in Gambas è lecito dichiarare così:
Codice: gambas [Seleziona]
Dim c, i As Integer, s As String, b As Byte


 :ciao:

P.S. Ah forse ho capito, ti stai mica confondendo con le dichiarazioni a livello di modulo? In effetti li le devi impilare.
« Ultima modifica: 04 Aprile 2015, 15:52:27 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.150
  • Tonno verde
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #13 il: 04 Aprile 2015, 15:29:28 »
in Gambas la valutazione di corto circuito per OR e AND, con il vincolo (limite che in .NET non sussiste) che non possono essere mescolati (= solo sequenze di OR oppure solo sequenze di AND) e la sequenza deve stare su un'unica riga.
...

Scusa ma anche qui non mi è chiaro cosa intendi dire.
Ma in Gambas puoi mischiare AND e OR non puoi mischiare And If e Or If ma quasi mi pare un bene anzi guarda questo codice il primo è ingannevole uno potrebbe pensare che passi a Or e invece come è giusto che sia esce avendo un And If alla sua destra.
Codice: gambas [Seleziona]
Dim c, i As Integer
   c = 10
   i = 10
  If c = 11 And If i = 1 \ 0 Or c = 10 And i = 10 Then
    Print "Niente"
  Endif

  If c = 11 And i = 100 Or c = 10 And i = 10 Then
    Print "Seconda valutazione (dopo OR)"
  Endif

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline filipsnew

  • Gamberetto
  • *
  • Post: 28
    • Mostra profilo
Re: AND condizionale che valuta secondo operando solo se necessario
« Risposta #14 il: 05 Aprile 2015, 07:04:58 »
in Gambas la valutazione di corto circuito per OR e AND, con il vincolo (limite che in .NET non sussiste) che non possono essere mescolati (= solo sequenze di OR oppure solo sequenze di AND) e la sequenza deve stare su un'unica riga.
...

Scusa ma anche qui non mi è chiaro cosa intendi dire.
Ma in Gambas puoi mischiare AND e OR non puoi mischiare And If e Or If ma quasi mi pare un bene anzi guarda questo codice il primo è ingannevole uno potrebbe pensare che passi a Or e invece come è giusto che sia esce avendo un And If alla sua destra.
Codice: gambas [Seleziona]
Dim c, i As Integer
   c = 10
   i = 10
  If c = 11 And If i = 1 \ 0 Or c = 10 And i = 10 Then
    Print "Niente"
  Endif

  If c = 11 And i = 100 Or c = 10 And i = 10 Then
    Print "Seconda valutazione (dopo OR)"
  Endif

 :ciao:

Dunque, considerando la prima espressione booleana da testare c'è da dire che 1) l'operatore terminale è OR per cui l'interprete dovrà eseguire le due sottoespressioni (verosimilmente partendo da sinistra) ossia gli operandi dell'OR 2) essendo un OR tradizionale, la valutazione *deve* essere effettuata su ambedue e 3) la logica di cortocircuito dell'And If agirà soltanto sulla prima delle due (fermandosi alla valutazione di c = 11 in FALSE) 4) quando verrà poi valutata la seconda  (TRUE) si rientrerà all'OR terminale per la valutazione finale: FALSE OR TRUE = TRUE. (Praticamente in VB.NET io uso solo AndAlso e OrElse.)
Sub <homofaberfortunaesuae> End