Autore Topic: Creare una funzione  (Letto 1205 volte)

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Creare una funzione
« il: 28 Marzo 2009, 15:24:29 »
Come si opera per la creazione di una nuova funzione? Cio ammettendo che io voglia creare una funzione che chiamo per esempio incremento e che accetti in input un valore float e lo incrementi secondo la seguente sintassi:

Codice: [Seleziona]
incremento(valore_da_inserire)

come devo operare?

Il mio è un esempio è ovvio che creare una funzioane per una cosa così è solo una stupidaggine.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Creare una funzione
« Risposta #1 il: 28 Marzo 2009, 16:18:22 »
Attualmente le funzioni in Gambas 2.0 accettano i parametri per valore, vale a dire come nel VB con BYVAL specificato.
In Gambas 3 potranno essere passati anche per riferimento (BYREF): ciò significa che se la funzione modificherà il parametro passato, la modifica avrà effetto anche sul valore della variabile passata dal chiamante.

In soldoni, attualmente per operare una cosa come la tua devi impostare una variabile a livello di classe, così che le modifiche abbiano effetto anche sulla variabile passata.
Quindi, se vuoi ad esempio creare una funzione che incrementi, diciamo, di 2 unità una variabile, devi fare:

Codice: [Seleziona]

'Gambas class file
PRIVATE Variabile AS Integer

PUBLIC FUNCTION Incrementa(Valore AS Integer) AS Integer
  Incrementa += 2
  RETURN Incrementa
END

PUBLIC SUB Form_Load()
DIM A AS Integer
  A = Incrementa(3)
  PRINT A
END

A varrà 5.

Nel dettaglio, la funzione viene definita come una normale procedura, con un nome, i parametri con i loro tipi fra parentesi, ed il tipo di dati che restituirà.
I parametri possono essere usati dalla funzione senza ridichiararli (in pratica, Valore AS Integer è come se dicessi DIM Valore AS Integer all'interno della funzione), e con Return assegno il valore da restituire al nome della funzione.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Creare una funzione
« Risposta #2 il: 28 Marzo 2009, 16:33:50 »
Citazione

leo72 ha scritto:
Attualmente le funzioni in Gambas 2.0 accettano i parametri per valore, vale a dire come nel VB con BYVAL specificato.
In Gambas 3 potranno essere passati anche per riferimento (BYREF): ciò significa che se la funzione modificherà il parametro passato, la modifica avrà effetto anche sul valore della variabile passata dal chiamante.


In pratica parli di puntatori!

Citazione

leo72 ha scritto:
In soldoni, attualmente per operare una cosa come la tua devi impostare una variabile a livello di classe, così che le modifiche abbiano effetto anche sulla variabile passata.
Quindi, se vuoi ad esempio creare una funzione che incrementi, diciamo, di 2 unità una variabile, devi fare:

Codice: [Seleziona]

'Gambas class file
PRIVATE Variabile AS Integer

PUBLIC FUNCTION Incrementa(Valore AS Integer) AS Integer
  Incrementa += 2
  RETURN Incrementa
END

PUBLIC SUB Form_Load()
DIM A AS Integer
  A = Incrementa(3)
  PRINT A
END

A varrà 5.

Nel dettaglio, la funzione viene definita come una normale procedura, con un nome, i parametri con i loro tipi fra parentesi, ed il tipo di dati che restituirà.
I parametri possono essere usati dalla funzione senza ridichiararli (in pratica, Valore AS Integer è come se dicessi DIM Valore AS Integer all'interno della funzione), e con Return assegno il valore da restituire al nome della funzione.


Ti ringrazio....è molto simile al C in effetti...era questo che mi interessava....

Ma se voglio inserire la funzione in una classe e poi richiamarla dal Form come posso fare? mi dice, in questo caso: "Unknow identifier Incrementa". Se inserisco la funzione nello stesso form va tutto bene ma da una classe non capisco come richiamarla...

Ehi Leo scusa se ti correggo ma la linea

Codice: [Seleziona]
RETURN incrementa


in realtà è:

Codice: [Seleziona]
RETURN valore


altrimenti non penso la funzione restituisca qualcosa...

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Creare una funzione
« Risposta #3 il: 28 Marzo 2009, 16:53:19 »
Immaginiamo di voler creare una classe matematica con nuove funzioni.
All'interno di questa classe abbiamo la nostra funzione Incrementa.

Facciamo così. Creiamo una nuova classe clsFunzioniMatematiche e mettiamoci dentro questo codice:
Codice: [Seleziona]

PUBLIC FUNCTION IncrementaPerDue(Valore AS Variant) AS Variant
  Valore += 2
  RETURN Valore
END

Nel form dal quale vuoi usare le tue funzioni dichiara un'istanza della classe clsFunzioniMatematiche a livello globale del form, quindi nell'intestazione dello stesso:
Codice: [Seleziona]

'Gambas class file
PRIVATE FunzioniMatematiche AS NEW clsFunzioniMatematiche

In questa maniera, la nuova classe istanzanziata FunzioniMatematiche sarà accessibile dall'interno di tutto il tuo form.

Adesso mettiamo il caso che hai una procedura da cui richiami la tua nuova funzione:
Codice: [Seleziona]

PUBLIC SUB CalcoliVari()
 [...]
 A = FunzioniMatematiche.IncrementaPerDue(7)
 PRINT A
 [...]
END


Essendo la classe FunzioniMatematiche un'istanza della classe clsFunzioniMatematiche, essa eredita tutte le sue funzioni. E per chiamare una funzione di una classe basta utilizzare la forma classe.metodo, quindi nel nostro caso FunzioniMatematiche.IncrementaPerDue.
A varrà 9.

P.S.:
sì, hai ragione. Ho sbagliato sintassi :-P
Cmq, puoi anche ridurre il tutto a RETURN (Valore + 2).
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Creare una funzione
« Risposta #4 il: 28 Marzo 2009, 17:20:16 »
Ti ringrazio per la chiarezza....alcuni passaggi mi erano oscuri...

tanto che ci sto te lo chiedo qua: esiste una funzione che trasforma da decimale a binario? Ne ho scritta una e l'ho inserita in una classe....se non esiste posso inviarla in area download...

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Creare una funzione
« Risposta #5 il: 28 Marzo 2009, 17:34:49 »
Per decimale intendi un Float? Allora non credo che esista.
La funzione precostituita Bin trasforma da intero a binario.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Creare una funzione
« Risposta #6 il: 28 Marzo 2009, 17:38:00 »
No intendevo interi...vabbè peccato avevo scritto la funzione da decimale a binrio e pure viceversa cioè da binario a decimale

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Creare una funzione
« Risposta #7 il: 30 Marzo 2009, 01:55:55 »
In realtà credo tu intenda la conversione tra una stringa, rappresentante un valore decimale, in un valore puramente binario; in caso contrario parti da un concetto errato, ovvero che un numero è sempre un valore puramente binario, e che la sua rappresentazione a video è solo la trasformazione dello stesso in formato leggibile.

Come risposto da leo, se parliamo di trasformare un valore numerico (puro) in altri formati (vedi Float, Long, Integer, ecc.), la cosa dipende da cosa devi ottenere.

Faccio alcuni esempi di conversione:

a) Integer -> Long : funzione CLong() : si può fare

b) Integer -> Float : funzione CInt() : si può fare

c) Long -> Float : funzione CFloat() : non perdi nulla

d) Long -> Integer : funzione CInt() : fattibile solo per valori inferiori ai 16bit, altrimenti errore!

e) Float -> Integer : funzione CInt() : fattibile solo per valori inferiori ai 16bit, altrimenti errore! ti perdi i decimali

f) Float -> Long : funzione CLong() : ti perdi i decimali

Riguardo alla conversione da stringa, puoi usare le funzioni che ho indicato, perchè capiscono da cosa devono convertire (vale anche da tipo Variant).

Oltre alle poche funzioni che ho elencato, ce ne sarebbero anche altre, utili alla conversione in stringa di valori binari, con conversioni particolari, come: Hex, Bin, ovvero la trasformazione in valore esadecimale (0-9A-F) e binario (0/1) di un valore numerico.

Un'altra cosa, che forse non è ben chiara della doc, è la rappresentazione interna dei tipi Date che, sono in realtà costituiti da un valore float, di cui la parte intera rappresenta la data, mentre la parte decimale rappresenta l'ora.

Altra nota: il tipo Variant è un elemento che può assumere valori di tipo variabile (numero, stringhe, date, ecc.), molto simile al Variant del Basic e al "puntatore a void" del C/C++. Per questo motivo, il tipo Variant viene molto usato nelle classi e nelle funzioni che devono trattare valori altamente variabili e di tipo imprecisato; è però da tener conto che la logica che implica l'uso dei Variant deve essere molto controllata, altrimenti si può incorrere in problemi non facilmente individuabili.

Ultima nota: riguardo alla futura implementazione in Gambas3 del passaggio di valori per riferimento, questo è già valido per gli oggetti nelle attuali release. La novità della versione 3, è quella di espandere questa caratteristica anche per le variabili di base (Integer, String, ecc.); attualmente le modifiche apportate ad una classe (e questo riguarda anche gli array), da parte di una funzione, vengono mantenute anche dopo l'uscita da questa funzione. In effetti, la logica attuale (tenendo conto che Gambas è scritto in C++), invia alla funzione chiamata il puntatore all'oggetto, e NON una sua copia.
Comunque, mi pare che questo l'ho descritto nel wiki; fatemi sapere se non è chiaro...

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Creare una funzione
« Risposta #8 il: 30 Marzo 2009, 02:28:39 »
Si, una cosa non mi è chiara: come fai a scrivere messaggi così lunghi all'una di notte??? :-D

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Creare una funzione
« Risposta #9 il: 30 Marzo 2009, 10:39:26 »
E' perchè la notte lavoro meglio... :-P

Vuoi mettere la pace notturna, al casino del giorno?
Ormai la moglie ci ha fatto il callo, nel senso che a forza di darmi calci sugli stinchi, ha i calli sui piedi... eheheheheh