Autore Topic: Extern in gambas3  (Letto 1211 volte)

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 416
    • Mostra profilo
Extern in gambas3
« il: 10 Maggio 2010, 19:18:29 »
Ciao a tutti. Premetto che non so utilizzare extern e non l'ho mai utilizzato su gambas 2.x.
Leggendo dalla documentazione (forse è un po' povera....) ho scritto questo codice:
Codice: [Seleziona]
Extern mlt_factory_init(Null As Pointer) = 0 As Pointer In "libmlt-dev"
Ma ricevo questo errore in fase di test del programma:
Codice: [Seleziona]
Syntaxt error. The first argument is not a valid identifier

Mi date una zampa a capire?

PS: I messaggi d'errore dovrebbero essere selezionabili in modo da poter copiare ed incollare il testo facilmente, non pensate? Forse possiamo segnalare come richiesta?

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Extern in gambas3
« Risposta #1 il: 10 Maggio 2010, 23:55:49 »
prova così:

Extern mlt_factory_init(Null As Pointer = 0 As Pointer In "libmlt-dev")

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 416
    • Mostra profilo
Re: Extern in gambas3
« Risposta #2 il: 11 Maggio 2010, 09:43:07 »
prova così:

Extern mlt_factory_init(Null As Pointer = 0 As Pointer In "libmlt-dev")
Niente, ricevo sempre lo stesso messaggio d'errore, col fumetto accanto ad Extern....

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Extern in gambas3
« Risposta #3 il: 11 Maggio 2010, 12:22:22 »
Codice: [Seleziona]
Extern mlt_factory_init(Null As Pointer) = 0 As Pointer In "libmlt"
oppure
Codice: [Seleziona]
Extern mlt_factory_init(Null As Pointer) = 0 As Pointer In "libmlt:dev"

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 416
    • Mostra profilo
Re: Extern in gambas3
« Risposta #4 il: 11 Maggio 2010, 14:00:57 »
Codice: [Seleziona]
Extern mlt_factory_init(Null As Pointer) = 0 As Pointer In "libmlt"
oppure
Codice: [Seleziona]
Extern mlt_factory_init(Null As Pointer) = 0 As Pointer In "libmlt:dev"
Niente...non va, credo però che sia l'Extern che non gli piaccia.....

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Extern in gambas3
« Risposta #5 il: 11 Maggio 2010, 19:22:42 »
comunque l' errore dice che il primo argomento non è valido quindi sostiturei "Null" con un nome di variabile a cui poi puoi forse assegnare il valore null

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 416
    • Mostra profilo
Re: Extern in gambas3
« Risposta #6 il: 11 Maggio 2010, 21:23:52 »
comunque l' errore dice che il primo argomento non è valido quindi sostiturei "Null" con un nome di variabile a cui poi puoi forse assegnare il valore null
Fatto, ora mi dice:
Codice: [Seleziona]
Missing in

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Extern in gambas3
« Risposta #7 il: 04 Dicembre 2011, 00:14:38 »
Fatto, ora mi dice:
Codice: [Seleziona]
Missing in

...va tolto quel: = 0

Inoltre, se la funzione non deve restituire niente, quel As Pointer può essere omesso.

In buona sostanza la chiamata di una funzione esterna non ha differenze dalla chiamata di una funzione che abbiamo creato all'interno del nostro programma Gambas. L'unica differenza è che, essendo essa esterna, dobbiamo dichiarare questa circostanza, e fare in modo che Gambas chiami tale funzione posta all'esterno dei suoi sorgenti. Ciò si ottiene mediante appunto l'uso di Extern. La dichiarazione di una funzione esterna va effettuata al di fuori delle routine.
Extern serve per richiamare funzioni esterne a Gambas. ...è un po' come se ''Extern'' annunciasse: "Farò in modo che il programma utilizzi questa funzione "xxxx(yyy)" che non appartiene alle risorse di Gambas, ma si trova in questa libreria.".
L'unica difficoltà che può essere incontrata, in modo particolare per chi è completamente a digiuno di nozioni basilari del linguaggio C, è la comprensione dei prototipi e delle dichiarazioni, ed in modo particolare degli eventuali parametri formali, delle funzioni esterne che sono scritte in C/C++. Infatti, dette funzioni dovranno essere riscritte secondo il protocollo Gambas.
Riguardo alla funzione vera e propria, essa sarà posta all'interno di una routine. Esempio:
Codice: gambas [Seleziona]

Private EXTERN funzione_esterna(valore1 As String, Valore2 As integer) As Integer IN "libreria_esterna:num_vers"

Public Sub routine_esempio(primoValore As String, secondoValore As Integer)

 Dim rit_funz As Integer

' passiamo i due valori alla funzione perché li elabori:
   rit_funz = funzione_esterna(primoValore, secondo Valore)

 Print rit_funz

End


La libreria può anche essere dichiarata separatamente, e prima della dichiarazione Extern:
Codice: gambas [Seleziona]

Library "libreria_esterna:num_vers"

Il numero della versione può essere anche omesso.

Vi è da aggiungere che la dichiarazione di una libreria influenzerà ogni dichiarazione del prototipo di una funzione esterna con Extern successiva. Cosicché, se sarà necessario fruire di funzioni presenti in due o più librerie, bisognera dichiarare la Libreria corrispondente prima di Extern e della routine contenente la funzione da utilizzare.
E' possibile dichiarare le librerie esterne anche prima della dichiarazione con EXTERN del prototipo delle correlate funzioni:
Codice: gambas [Seleziona]

Library "1^_libreria_esterna:num_vers"

Private EXTERN funzione_esterna1(valoreA As ..., ValoreB As ...) As ...


Library "2^_libreria_esterna:num_vers"

Private EXTERN funzione_esterna2(valoreC As ..., ValoreD As ...) As ...


Public Sub prima_routine_esempio(...qui eventuali parametri della routine...)
..... ' qui l'uso della funzione_esterna_1( )
End


Public Sub seconda_routine_esempio(...qui eventuali parametri della routine...)
..... ' qui l'uso della funzione_esterna_2( )
End


Per maggiori informazioni vedere la Wiki:
https://www.gambas-it.org/wiki/index.php/Guide_della_comunit%c3%a0#Interfacciare_Gambas_con_librerie_dinamiche_esterne_.so

in particolare:
http://www.gambas-it.org/wiki/index.php/Extern:_richiamare_funzioni_esterne_a_Gambas
« Ultima modifica: 09 Settembre 2020, 20:11:57 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. »