Autore Topic: Invertire l'ordine nelle coppie di byte in un vettore con la funzione swab()  (Letto 400 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
« Ultima modifica: 17 Luglio 2016, 00:12:46 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: 959
    • Mostra profilo
Ho provato a fare una soluzione tutta Gambas ma non funziona, chissà perchè: :-\

Codice: [Seleziona]
Public Sub Form_Open()
Dim b As Byte
Dim bb1 As Byte[]
Dim bb2 As New Byte[]
bb1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
For b = 0 To bb1.Count - 2
   bb2.Add(bb1[b], b + 1)
   bb2.Add(bb1[b + 1], b)
   Print bb2[b],
Next
End
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.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Innanzitutto alla fine del processo del tuo codice il numero degli elementi della variabile vettoriale bb2 è 18; dunque superiore al numero degli elementi costituenti la variabile vettoriale bb1...


Ad ogni modo, volendo utilizzare la tua idea, io modificherei così il tuo codice:
Codice: [Seleziona]
Public Sub Main()

Dim b As Byte
Dim bb1 As Byte[]
Dim bb2 As New Byte[]

  bb1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

  For b = 0 To bb1.Max Step 2
    bb2.Push(bb1[b + 1])
    bb2.Push(bb1[b])
    Print bb2[b], bb2[b + 1],
  Next

  If bb2.Count = bb1.Count Then
    Print "\n\nIl numero degli elementi di bb2 corrisponde con quello degli elementi di bb1"
  Else
    Error.Raise("Il numero degli elementi di bb2 NON corrisponde con quello degli elementi di bb1 !")
  Endif

End
« Ultima modifica: 19 Luglio 2016, 12:59:56 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 Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Ho provato a fare una soluzione tutta Gambas ...

una soluzione semplice è usare swap che credo sia la più Gambas possibile (forse):
Codice: [Seleziona]
' Gambas module file
'
Library "libc:6"

' void swab (const void *__restrict __from, void *__restrict __to, ssize_t __n)'
' Swab pairs bytes in the first N bytes of the area pointed to by FROM and copy the result to TO.'
Private Extern swab(__from As Pointer, __to As Pointer, __n As Long)


Public Sub Main()
 
 Dim b As Byte
 Dim bb1 As Byte[]
 Dim bb2 As New Byte[10]
 Dim bb3 As String[]
 
  bb1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
   
' Invertiamo la posizione di ciascun blocco di due dati adiacenti all'interno dell'area di memoia del vettore:'
  swab(bb1.Data, bb2.Data, 10)
  ' verifichiamo'
  For Each b In bb2
    Print b;;
  Next
  Print
  Print bb2[2] + bb2[7]
  '--------------------------------------'
  bb3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
   
  For b = 0 To 9 Step 2           
    Swap bb3[b], bb3[b + 1]     
  Next
  ' verifichiamo'
  For b = 0 To 9
    Print bb3[b];;
  Next
  Print
  Print bb3[2] + bb3[7]
 
End
:ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
una soluzione semplice è usare swap che credo sia la più Gambas possibile (forse):
Perché mai la proposta di Top Fuel non sarebbe ugualmente più Gambas possibile ?   ???
V'è anzi da dire che la sua proposta non utilizza alcuna funzione !   


Va - ad ogni modo - precisato, soprattutto per i programmatori Gambas principianti, che l'intento originario di questa discussione non è quello di elencare soluzioni in Gambas puro per invertire l'ordine dei byte all'interno di una coppia di dati presenti in un'area di memoria, bensì semplicemente quello di mostrare come utilizzare - qualora se ne abbia intenzione - la funzione esterna "swab( ) ".

Va però aggiunto che le interessanti proposte di Top Fuel e di Gianluigi mostrano come anche in puro Gambas (a volte apportando alcuni accorgimenti) sia possibile ottenere i medesimi risultati restituiti da specifiche funzioni esterne scritte in C/C++ .


Comunque sia, per chi volesse sbizzarrirsi nell'uso in Gambas di alcune specifiche funzioni esterne di librerie standard in C:   
https://www.gambas-it.org/wiki/index.php/Richiamo_ed_uso_di_particolari_funzioni_esterne_delle_librerie_standard_scritte_in_C
« Ultima modifica: 11 Maggio 2022, 19:12: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 Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
...
Perché mai la proposta di Top Fuel non sarebbe ugualmente più Gambas possibile ?   ???
...

Ho comunque aggiunto un forse  :P, però credo che quanto da me proposto sia "più Gambas" proprio perché ne sfrutta una sua funzione interna.

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

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
credo che quanto da me proposto sia "più Gambas" proprio perché ne sfrutta una sua funzione interna.
:rolleyes:
....ma perché Top Fuel non ha forse utilizzato risorse interne di Gambas ?
Top Fuel ha utilizzato solo risorse interne di Gambas ed in più il Metodo .Add() (che è sostanzialmente una Funzione) tipico degli Array in Gambas.

Non credo che un codice sia più "Gambas" di un altro se utilizza rispetto a quest'ultimo una Funzione nativa di Gambas.
Quale delle due soluzioni seguenti è infatti... più Gambas ?   
Codice: [Seleziona]
Public Sub Main()

  Print Shl(128, 1)
 
  Print 128 * CInt(2 ^ 1)

End

o meglio ancora, quale delle due seguenti soluzioni è... più Gambas ?
Codice: [Seleziona]
Public Sub Main()

  Dim s1, s2, tmp As String
 
    s1 = "aaaa"
    s2 = "bbbb"
    Swap s1, s2
    Print s1, s2
 
 '''''''''''''''''''''''''''''
 
    s1 = "aaaa"
    s2 = "bbbb"
    tmp = s1
    s1 = s2
    s2 = tmp
    Print s1, s2

End

« Ultima modifica: 21 Luglio 2016, 17:30: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. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
...
Quale delle due soluzioni seguenti è infatti... più Gambas ?   
...

La prima, perché è stata studiata per fare il lavoro, così come swap è stato studiato per fare il lavoro di scambio.
Poi come ben sappiamo uno può usare qualunque mezzo, l'importante è arrivare ad una soluzione corretta.
Io ho dato solo il mio parere che rimane solo mio, tu e gli altri avete ben donde di pensarla diversamente.
 :ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Innanzitutto alla fine del processo del tuo codice il numero degli elementi della variabile vettoriale bb2 è 18; dunque superiore al numero degli elementi costituenti la variabile vettoriale bb1...
Non ho pensato che il ciclo For andava fatto con Step 2.
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.