premetto....array di string o bytes non cambia nulla
Il 2° parametro della funzione esterna (
id est: ...esterna alle funzioni native di Gambas) "
fluid_synth_sysex( ) " del sistema
libfluidsynth prevede il passaggio di un Puntatore a "
char" costante. Poiché il tipo "
char" occupa 1 byte (8bit), ne consegue che l'intera area di memoria riservata puntata dal Puntatore ha una dimensione di
1 * numero_di_byte_scritti, come si può evincere da questo test che riprende i dati del tuo esempio:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char src[] = {0x7f, 0x7f, 0x04, 0x01, 0x00, 0x0};
char *sysex = malloc(6);
memcpy(sysex, src, 6);
printf("%ld\n", sizeof(*sysex));
free(sysex);
return (0);
}
In Gambas il tipo di dato "
String" occupa 4 byte nei sistemi a 32 bit e 8 byte nei sistemi a 64 bit:
http://gambaswiki.org/wiki/lang/typeciò perché il dato "String" in Gambas è in realtà un puntatore a una struttura più complessa che contiene, fra l'altro, la lunghezza della stringa.
Dunque l'area di memoria di un vettore di tipo "
String" occupata per la memorizzazione di ciascuna stringa di valori/caratteri, intesa come "
indirizzo di memoria ad una sub-area distinta ove sono contenuti i veri dati", corrisponde in ogni caso a una quantità di byte pari a:
SizeOf(gb.String) * vettore.CountCiò avviene anche nel caso come il tuo, nel quale istanzi l'array attribuendo un valore numerico (in rappresentazione esadecimale) a ciascun elemento dell'array medesimo. Laddove presumibilmente
Gambas converte ogni valore numerico automaticamente in stringa composta da simbolo/i numerico/i.
Cerco di spiegarmi tecnicamente con questo semplicissimo codice esemplificativo:
Public Sub Main()
Dim sysex As String[] = [&H7F, &H7F, &H04, &H01, 0, 0]
Dim i As Integer
For i = 0 To 47
If i Mod 8 == 0 Then Write "------------ elem. indice " & CStr(i \ 8) & Chr(&0A)
Print i, Hex(Byte@(sysex.Data + i), 2)
Next
Print "=============="
For i = 0 To 47
Print i, String@(Pointer@(sysex.Data + i))
Next
End
Se ciò che ho scritto sin'ora è giusto, tu passi un'area riservata i cui valori sono gli indirizzi di memoria dei singoli valori di tipo Stringa, contenuti nei sei elementi costituenti l'array, anziché passare un'area riservata contenente 6 byte rappresentanti i secchi valori del messaggio di
sysex.
Pertanto, io credo tu debba cambiare il tipo di dato dell'array da
String[ ] a
Byte[ ], poiché la memoria occupata dal tipo di dato "
Byte" in Gambas corrisponde alla quantità occupata dal tipo "
char " in C, e che da codice è agevolmente costatabile con la seguente istruzione:
SizeOf(gb.Byte)Inoltre, per passare agevolmente l'indirizzo di memoria dell'area riservata di un array, ove sono memorizzati i dati, va utilizzata la proprietà "
.Data " dell'array medesimo.
Al di là di queste mie riflessioni, va fatto notare ai lettori come il nostro amico
genex2000 ha abilmente utilizzato un Oggetto vettore statico per memorizzare in un'area allocata i dati necessari.
I miei complimenti.
Sempre ai lettori ricordo che in alternativa
genex2000 avrebbe potuto utilizzare ovviamente anche una variabile di tipo Puntatore da allocare opportunamente e nella quale, poi, scrivere mediante i "
Memory Stream" i dati necessari.