Autore Topic: Come importare e/o usare la funzione "memcopy" di Linux ?  (Letto 1743 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.213
  • Ne mors quidem nos iunget
    • Mostra profilo
« Ultima modifica: 20 Settembre 2025, 22:32: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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.213
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Come importare e/o usare la funzione "memcopy" di Linux ?
« Risposta #1 il: 26 Gennaio 2014, 17:45:35 »
Ad ogni modo io propongo una cosa così:
Codice: gambas [Seleziona]
' void *memcpy(void *str1, const void *str2, size_t n)
Private Extern memcpy(str1 As Pointer, str2 As Pointer, n As Integer) In "libc:6"



Public Sub Main()

  Dim src, dest As Pointer
  Dim s As String = "Questa è una prova con la funzione 'memcpy()'."
 

    src = Alloc(s)
    dest = Alloc(Len(s))
   
    memcpy(dest, src, Len(s))
   
    Print "Dopo memcpy, " & Quote("dest") & ":\n"; String@(dest)

    Free(src)
    Free(dest)

End
« Ultima modifica: 20 Settembre 2025, 22:32:40 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.213
  • Ne mors quidem nos iunget
    • Mostra profilo
« Ultima modifica: 18 Marzo 2016, 19:17:34 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: 934
    • Mostra profilo
Re:Come importare e/o usare la funzione "memcopy" di Linux ?
« Risposta #3 il: 19 Marzo 2016, 02:10:22 »
Per me ha ragione Minisini, bisogna stare attenti ad usare queste cose. E' un attimo scrivere dove non si deve e fare qualche disastro.
Se c'e' bisogno di copiare un array dentro un altro preferisco usare quei pochi secondi in più ma essere sicuro che tutto vda bene.
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.213
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come importare e/o usare la funzione "memcopy" di Linux ?
« Risposta #4 il: 19 Marzo 2016, 22:38:13 »
...bisogna stare attenti ad usare queste cose. ...
A mio avviso, volendo utilizzare la funzione "esterna" di C 'memcpy()' in Gambas, mediante Extern, se i due Puntatori, da passare a detta funzione esterna (come 1° e 2° argomento), vengono creati con la funzione di Gambas " Alloc() " il rischio di eventuale sovrapposizione è evitato.
La funzione Alloc(), che molto probabilmente utilizza la funzione di C " malloc() ", assegna alla variabile di tipo  Puntatore, da essa ritornato, un'area di memoria "riservata" e quindi "sicura".
Se gambas si permettesse di andare a pasticciare con le aree di memoria che il programmatore ha chiesto indirettamente (ossia attraverso Alloc() di Gambas ! ) alla funzione di C malloc() di allocare, di riservare, ci sarebbe un casino. Ma se Gambas avesse, in ipotesi, un suo meccanismo interno, indipendente dalla funzione di C  malloc(), per darti delle aree di memoria, sarebbe folle a non dartele distinte come fa la funzione di C malloc().
« 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.213
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come importare e/o usare la funzione "memcopy" di Linux ?
« Risposta #5 il: 12 Marzo 2018, 04:07:25 »
Un esempio fra molti, mescolando risorse native di Gambas e funzioni esterne, potrebbe essere la copia di dati da un vettore di tipo Byte[ ] a un altro vettore di tipo Byte[ ]:

Codice: [Seleziona]
Library "libc:6"

' void *memcpy (void *__restrict __dest, const void *__restrict __src, size_t __n)
' Copy N bytes of SRC to DEST.
Private Extern memcpy(__dest As Pointer, __src As Pointer, __n As Long)


Public Sub Main()

  Dim sor As Byte[]
  Dim des As Byte[]
  Dim b As Byte
 
   sor = [11, 22, 33, 44, 55, 66, 77, 88]
   
   des = New Byte[sor.Count]
 
' Copia un numero "sor.Count" di dati dall'area di memoria di "sor" nell'area di memoria di "des":'
   memcpy(des.Data, sor.Data, sor.Count)
   
' Verifica il risultato:'
   For Each b In des
     Print b
   Next

End
« Ultima modifica: 12 Marzo 2018, 11:07:02 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.213
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come importare e/o usare la funzione "memcopy" di Linux ?
« Risposta #6 il: 13 Marzo 2018, 02:55:03 »
Di seguito un esempio simile al precedente, ma reso più complesso, poiché i dati andranno scritti nell'apposito membro (void *data) della Struttura, chiamata CARRAY e contenuta nel file sorgente ".../main/gbx/gbx_c_array.h" dell'Interprete.

Codice: [Seleziona]
Private Const NUM As Integer = 8


Library "libc:6"

' void *memcpy (void *__restrict __dest, const void *__restrict __src, size_t __n)
' Copy N bytes of SRC to DEST.
Private Extern memcpy(__dest As Pointer, __src As Pointer, __n As Long)


Public Sub Main()

  Dim p As Pointer
  Dim sor, des As Byte[]
  Dim b As Byte
 
   sor = New Byte[]
   sor = [11, 22, 33, 44, 55, 66, 77, 88]
   
   des = New Byte[NUM]

' Penetra nella Struttura denominata CARRAY, contenuta nel file sorgente ".../main/gbx/gbx_c_array.h":'
   p = Object.Address(des)

' Copia una quantità "NUM" di dati dall'area di memoria di "sor" nell'area di memoria di "des":'
   memcpy(Pointer@(p + 32), sor.Data, NUM)
   
' Verifica il risultato:'
   For Each b In des
     Print b
   Next
 
End
Vedi anche:
http://www.gambas-it.org/wiki/index.php?title=Configurazione,_organizzazione_ed_impostazione_dell%27array_secondo_i_sorgenti_di_Gambas

« Ultima modifica: 13 Marzo 2018, 02:57:23 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.213
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come importare e/o usare la funzione "memcopy" di Linux ?
« Risposta #7 il: 14 Marzo 2018, 03:28:29 »
Aggiungo quest'altro caso molto più complesso.

...ricordate queste mie parole ?
CHI DOMINA la MEMORIA, DOMINA il MONDO degli "OGGETTI"

Ogni "Oggetto" di Gambas è innanzitutto costituito da più porzioni di memoria, organizzate secondo le specifiche Strutture previste dai sorgenti di Gambas per ciascun Oggetto, dedicate a immagazzinare i dati che caratterizzeranno gli Oggetti medesimi.

Poter e sapere dunque accedere alle aree di memoria di un Oggetto, significa poter modificare i valori delle sue proprietà.

Con un'operazione di ingegneria si possono modificare "geneticamente" Oggetti che in apparenza sono quelli originari, e invece fanno riferimento ad altri Oggetti.
Ponete sul Form una "PictureBox" e un "TextBox".
Codice: [Seleziona]
Library "libc:6"

' void *memcpy (void *__restrict __dest, const void *__restrict __src, size_t __n)
' Copy N bytes of SRC to DEST.
Private Extern memcpy(__dest As Pointer, __src As Pointer, __n As Long)


Public Sub Form_Open()

  Dim p1, p2 As Pointer
  Dim t1, t2 As Pointer
  Dim s As String
 
  With PictureBox1
    .Background = Color.Yellow
    .Foreground = Color.Blue
  End With

' Accediamo profondamente nelle Strutture sorgenti della "PictureBox":'
  p1 = Object.Address(PictureBox1)
  p2 = Pointer@(p1)
 
' Accediamo profondamente nelle Strutture sorgenti del "TextBox":'
  t1 = Object.Address(TextBox1)
  t2 = Pointer@(t1)
 
' Facciamo in modo che la "PictureBox" punti alle risorse della "TextBox" !!!'
   memcpy(p1, t1, 512)
   memcpy(p2, t2, 512)
   
' ...è la PictureBox a spostarsi ?'
   PictureBox1.X = 500

' Scusate...ma...quando mai la PictureBox ha avuto la Proprietà ".Text" ?!?!?'
   PictureBox1.Text = PictureBox1.Name

' Eeeh ! ...che nome ha la "PictureBox" ???????'
   Print PictureBox1.Text, TextBox1.Text
   
' Scoprirete che le risorse della PictureBox non sono più quelle della Classe PictureBox, bensì della TextBox !!!'
   For Each s In Object.Class(PictureBox1).Symbols
     Print s
   Next

End



Public Sub TextBox1_Enter()  ' Provate a passare con il mouse sulla "PictureBox".... '
 
  Print "Passaggio del Mouse sul TextBox1 ?"
 
End


Chiameremo questo caso: Oggetti Geneticamente Modificati   ;D
« Ultima modifica: 20 Settembre 2025, 22:42:59 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. »