Autore Topic: [Risolto] Funzione da libreria esterna  (Letto 1594 volte)

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
[Risolto] Funzione da libreria esterna
« il: 26 Ottobre 2017, 23:38:32 »
Salve, ho un problema con una funzione della libreria "libcairomm-1.0" (ho usato questa perché "libcairo:2.1140-2.1" in usr/lib non cè)
che mi causa incomprensione è questa:
Codice: [Seleziona]
' void cairo_text_extents(cairo_t *cr,Const char * utf8,cairo_text_extents_t * extents);
' Gets the extents for a string of text.
Private Extern cairo_text_extents(cr As Pointer, utf8_string As String, extents As Pointer)
Da DevHelp:

void   cairo_text_extents(cairo_t *cr,const char *utf8, cairo_text_extents_t *extents);
Gets the extents for a string of text.

E non so come "tradurla" in quanto cairo_text_extents_t in realtà e una struttura.
Io ho una stringa che devo "centrare" in uno spazio specifico, la funzione di cui sopra mi ritorna la lunghezza della stringa.
Come posso fare ?
 :'(
Grazie  :2birre:
« Ultima modifica: 28 Ottobre 2017, 23:53:59 da vigiot »
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.718
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #1 il: 27 Ottobre 2017, 00:44:30 »
E non so come "tradurla" in quanto cairo_text_extents_t in realtà è una struttura.

Come tu dici, effettivamente "cairo_text_extents_t " è una Struttura:
https://www.cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-text-extents-t
formata da 6 membri, tutti del tipo "double" del C, che in Gambas corrisponde sostanzialmente al tipo " Float ".

Se, dunque, vuoi gestire in Gambas i membri di quella Struttura, anziché il solo Puntatore ad essa, dovrai dichiarare, con le modalità previste:
http://www.gambas-it.org/wiki/index.php?title=Strutture:_dichiarazione_ed_uso
una Struttura composta da 6 membri di tipo "Float ".

Poiché al terzo parametro della funzione esterna si deve passare una variabile di tipo della Struttura "cairo_text_extents_t ", ai membri della quale saranno assegnati dei valori, è necessario dunque che tale variabile sia creata con la parola-chiave " New ".
« 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 vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #2 il: 27 Ottobre 2017, 08:04:29 »
Grazie infinite per la risposta.  :D
Avevo ipotizzato una cosa simile, ma della serie "Poche idee ma ben confuse..."
 non avevo la più pallida idea da dove iniziare. :-\ :-\
P.S. Generare un file immagine da una DrawingArea utilizzante la libreria "libX11:6.3.0"
non poteva funzionare nel mio caso perché tale libreria nel mio /usr/lib/ non cè !  :evil:

provo con i tuoi suggerimenti, sperando di aver capito...
Grazie ancora  vuott
 :ciao: :ciao:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.718
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #3 il: 27 Ottobre 2017, 10:23:50 »
P.S. Generare un file immagine da una DrawingArea utilizzante la libreria "libX11:6.3.0"
non poteva funzionare nel mio caso perché tale libreria nel mio /usr/lib/ non cè !
Il file della libreria condivisa da cercare è: libX11.so.6.3.0



Per completezza aggiungo che il terzo parametro di quella funzione esterna può essere gestito in Gambas anche mediante una variabile di tipo Puntatore (come nell'esempio da te riportato).
In tale circostanza, per accedere ai valori presenti nell'area di memoria della Struttura, dovrai utilizzare le specifiche funzioni native di Gambas per dereferenziare i Puntatori (in questo caso Float@( ) ), oppure la risorsa "Memory Stream", avendo comunque cura di rispettare le norme della "aritmetica dei Puntatori".
Così, se tu volessi accedere alla porzione di memoria, corrispondente al 5°membro (indice 4) della Struttura, dovresti scrivere:
Codice: [Seleziona]
f = Float@(variabile_puntatore + (sizeof(gb.Pointer) * 4))

Letture suggerite:
- http://www.gambas-it.org/wiki/index.php?title=Gestione_in_Gambas_delle_Strutture_esterne
- http://www.gambas-it.org/wiki/index.php?title=Variabili_di_tipo_Puntatore_e_loro_dereferenziazione
- http://www.gambas-it.org/wiki/index.php?title=Dereferenziare_senza_Memory-Stream_un_pointer_ad_una_Struttura,_passato_da_una_funzione_esterna
- http://www.gambas-it.org/wiki/index.php?title=Definizione_ed_uso_dei_Memory_Stream

« Ultima modifica: 28 Ottobre 2017, 02:01:49 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 vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #4 il: 27 Ottobre 2017, 11:27:04 »
Grazie per l'ulteriore consiglio, ho scaricato i file e li ho salvati per poterli leggere con calma.  8)
A proposito della libreria cercavo appunto le librerie con l'estensione  ".so"
Ma quella e molte altre non le ho trovate.  :o
Digerito il quanto farò sapere.
Grazie ancora ... :ciao: :ciao:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.718
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #5 il: 27 Ottobre 2017, 11:40:34 »
A proposito della libreria cercavo appunto le librerie con l'estensione  ".so"
Ricorda che in Gambas nella dichiarazione delle librerie condivise esterne la parte relativa all'estensione ".so." è sostituita con il simbolo dei due punti " : "
 http://www.gambas-it.org/wiki/index.php?title=Extern:_richiamare_funzioni_esterne_a_Gambas#Identificazione_e_dichiarazione_della_Libreria_contenente_la_Funzione_esterna



Ma quella e molte altre non le ho trovate.
  ???
Prova a fare la ricerca semplicemte con " libX11.so ".


« Ultima modifica: 27 Ottobre 2017, 11:53: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 vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #6 il: 27 Ottobre 2017, 12:47:58 »
Provato, ma "Nessun Risultato"
Mah ... ??? ???
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #7 il: 28 Ottobre 2017, 00:06:45 »
Tornando a fagiolo, ho capito di non aver capito un ciufolo.  :mad: :mad:
a questa variabile esterna serve un puntatore ad una struttura che possa ricevere i dati da lei stessa calcolati.
Quindi in teoria , dopo avere dichiarato la struct devo passare un puntatore alla struttura da me creata
come terzo parametro della funzione esterna.
Appunto ... :-\
E qui non ho capito come si fa .... :hard: :hard:
Potreste aiutarmi magari con un esempio?
Il mio povero neurone superstite minaccia sciopero...  >:( >:(

Grazie  :ciao: :ciao:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.718
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #8 il: 28 Ottobre 2017, 01:57:11 »
Ti ho già indicato come fare.

Tu hai due possibilità di scelta:
1) "ricreare" in Gambas la Struttura "cairo_text_extents_t ", contenuta nella libreria esterna, e conseguentemente passare alla funzione esterna (quando la userai effettivamente in una sub-routine) la variabile del tipo di quella Struttura-Gambas da te scritta. La variabile, che si riferisce alla tua Struttura, in questo caso necessita di essere "creata", quindi dovrai usare la parola "New".
2) usare e passare alla funzione esterna una variabile di tipo Puntatore che punti ad un'area di memoria riservata avente una dimensione pari alla quantità di memoria occupata dalla Struttura "cairo_text_extents_t ". L'allocazione di memoria riservata si effettua con la funzione nativa di Gambas: "Alloc( )", la quale restituisce appunto un Puntatore.

Dunque, o usi la prima modalità oppure usi la seconda modalità.

Il passaggio dei valori dalla funzione esterna alla variabile del tipo della Struttura in questione è evidentemente per "Indirizzo".


« Ultima modifica: 28 Ottobre 2017, 02:05:32 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 vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #9 il: 28 Ottobre 2017, 09:13:02 »
Grazie  :D :D
Soprattutto della pazienza !
Come avrai intuito, sono nel pallone.
Quindi faccio tesoro dei tuoi consigli, stacco la spina per mezza giornata ( evitando lo "sciopero neuronale" ), poi riprendo.
 :ok:
Grazie ancora ... :ciao: :ciao:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.718
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #10 il: 28 Ottobre 2017, 15:23:35 »
Nel tuo caso, poiché i membri della Struttura "cairo_text_extents_t " sono - come sappiamo - tutti di tipo "double", la strada più semplice a mio avviso è la prima: ricreare nel tuo progetto Gambas la Struttura con i membri tutti "Float ".
Se, invece, ti vuoi un po' complicare la vita, ma desideri imparare l'uso delle variabili di tipo Puntatore in Gambas, devi scegliere la seconda opzione.

In qualunque caso, non dimenticare, ovviamente, la dichiarazione della funzione esterna mediante la parola " Extern ".
« 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 vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #11 il: 28 Ottobre 2017, 18:08:36 »
Non capisco ... ???
Ho provato:
Codice: [Seleziona]
Library "libcairomm-1.0"

' void cairo_text_extents(cairo_t *cr,Const char * utf8,cairo_text_extents_t * extents);
' Gets the extents for a string of text.
Private Extern cairo_text_extents(cr As Pointer, utf8_string As String, extents As Pointer)
subito all'inizio, nelle "dichiarazioni"
poi ho aggiunto:
Codice: [Seleziona]
Public Struct cairo_text_extents_t
    x_bearing As Float
    y_bearing As Float
    width As Float
    height As Float
    x_advance As Float
    y_advance As Float
End Struct
che è la copia della struttura in c.

Creata la sub:
Codice: [Seleziona]
Public Sub disegna_fattura(cairo As Pointer)
  Dim my_text_extent As Cairo_text_extents_t
  ' Dim my_text_extent As New Cairo_text_extent_t
  Dim ptn As Pointer
  Dim my_width As Float
 
  cairo_set_source_rgb(cairo, 0.0, 0.0, 0.0)
  cairo_select_font_face(cairo, "Droid Serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD)
  cairo_set_font_size(cairo, 18.0) 
  cairo_text_extents(cairo, "Nome Qualsiasi", VarPtr(ptn))
  my_text_extent = ptn
  my_width = my_text_extent.width
 
  cairo_move_to(cairo, (114 - (my_width / 2)), 40)
  cairo_show_text(cairo, "Nome Qualsiasi")
End
all'esecuzione ...
Mi da errore di segmentazione (11)  ???
Sia che usi la chiave New alla struttura di base cairo_text_extent_t , sia senza.
si inchioda alla chiamata della struttura esterna : cairo_text_extents(cairo, "Nome Qualsiasi", VarPtr(ptn))
 :nono: :hatecomputer:
Ma cosa devo fare allora  :-\ :-\
Grazie
 :ciao: :ciao:

Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.718
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #12 il: 28 Ottobre 2017, 19:44:48 »
Dim my_text_extent As New Cairo_text_extent_t
all'esecuzione ...
Mi da errore di segmentazione (11)  ???
Sia che usi la chiave New alla struttura di base cairo_text_extent_t , sia senza.
Vorrei capire bene, ...cioè, se tu passi alla funzione esterna, in questo modo:
Codice: [Seleziona]
Dim my_text_extent As New Cairo_text_extents_t
 ......
 ......
cairo_text_extents(cairo, "Nome Qualsiasi", my_text_extent)
la variabile del tipo di quella Struttura da te scritta, tu ottieni un errore ?

Il terzo parametro formale nella dichiarazione con "Extern" deve fare riferimento al tipo della Struttura da te scritta, ossia:
Codice: [Seleziona]
Private Extern cairo_text_extents(cr As Pointer, utf8_string As String, extents As Cairo_text_extents_t)


si inchioda alla chiamata della struttura esterna : cairo_text_extents(cairo, "Nome Qualsiasi", VarPtr(ptn))
Prova con al funzione "Alloc( )":
Codice: [Seleziona]
  Dim my_text_extent As New Cairo_text_extents_t
  Dim ptn As Pointer
  ......
  ......
  ptn = Alloc(Object.SizeOf(my_text_extent), 1)
  ......
  ......
  cairo_text_extents(cairo, "Nome Qualsiasi", ptn)
In questo secondo caso, ricorda che
1) il terzo parametro formale nella dichiarazione con "Extern" deve fare riferimento al tipo Puntatore;
2) alla fine dell'uso del Puntatore dovrai liberare la porzione di memoria allocata utilizzando la funzione " Free( ) ", come segue:
Codice: [Seleziona]
Free(ptn)
altrimenti ti verrà sollevato l'avviso in console: " gbx3: warning: 1 allocation(s) non freed. "
« Ultima modifica: 28 Ottobre 2017, 20:08:20 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.718
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #13 il: 28 Ottobre 2017, 23:34:05 »
Per esempio con questo semplice e breve codice io non ottengo l'errore da te segnalato:

Codice: [Seleziona]
Library "libcairomm-1.0:1.4.0"

Public Struct cairo_text_extents_t
    x_bearing As Float
    y_bearing As Float
    width As Float
    height As Float
    x_advance As Float
    y_advance As Float
End Struct

Private Const CAIRO_FORMAT_ARGB32 As Integer = 0
Private Enum CAIRO_FONT_SLANT_NORMAL = 0, CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_SLANT_OBLIQUE
Private Enum CAIRO_FONT_WEIGHT_NORMAL = 0, CAIRO_FONT_WEIGHT_BOLD

' cairo_surface_t * cairo_image_surface_create(cairo_format_t formatI, int width, int height)
' Creates an image surface of the specified format and dimensions.
Private Extern cairo_image_surface_create(formatI As Integer, width As Integer, height As Integer) As Pointer

' void cairo_set_source_rgb (cairo_t *cr, double red, double green, double blue)
' Sets the source pattern within cr to an opaque color.
Private Extern cairo_set_source_rgb(cr As Pointer, red As Float, green As Float, blue As Float)

' void cairo_select_font_face (cairo_t *cr, const char *family, cairo_font_slant_t   slant, cairo_font_weight_t  weight)
' Selects a family and style of font from a simplified description as a family name, slant and weight.
Private Extern cairo_select_font_face(cr As Pointer, family As String, slant As Integer, weight As Integer)

' void cairo_set_font_size (cairo_t *cr, double size)
' Sets the current font matrix to a scale by a factor of size.
Private Extern cairo_set_font_size(cr As Pointer, size As Float)

' void cairo_text_extents(cairo_t *cr,Const char * utf8,cairo_text_extents_t * extents);
' Gets the extents for a string of text.
Private Extern cairo_text_extents(cr As Pointer, utf8_string As String, extents As Cairo_text_extents_t)


Public Sub Main()

  Dim cairo As Pointer
  Dim my_text_extent As New Cairo_text_extents_t
 
   cairo = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 400, 200)
   If cairo = 0 Then Error.Raise("Impossibile creare la superficie per l'immagine !")
   
   cairo_set_source_rgb(cairo, 0.0, 0.0, 0.0)
   cairo_select_font_face(cairo, "Liberation Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD)
   cairo_set_font_size(cairo, 18.0)
   
   cairo_text_extents(cairo, "testo quasiasi", my_text_extent)

End
« Ultima modifica: 28 Ottobre 2017, 23:38:16 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 vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Funzione da libreria esterna
« Risposta #14 il: 28 Ottobre 2017, 23:53:21 »
Che dire Grazieeee  ;D ;D :2birre: :2birre:
Provato con Alloc() e funziona.
ma con l'ultima modifica (tuo post successivo) mi da lo stesso errore.
Ad ogni buon conto l'importante è che il problema sia stato risolto.
Grazie a te ...

Citazione
Se un programma non funziona o funziona male, il problema è fra la sedia e la tastiera ....
  :rotfl:
metterò risolto con infinito piacere
Grazie  :ciao: :ciao:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein