Gambas-it

Gambas3 => Programmazione => Topic aperto da: vuott - 24 Ottobre 2016, 13:28:34

Titolo: Alterare una Proprietà o un Metodo di un oggetto modificandone la denominazione
Inserito da: vuott - 24 Ottobre 2016, 13:28:34
L'esempio che segue mostra varie cose, una - fra le quali - è che bisogna prestare attenzione quando si usano i Memory Stream per scrivere nella memoria !    ;D

Codice: [Seleziona]
Public Sub Main()

 Dim s As String
 Dim i As Integer
 Dim p As Pointer
 Dim st As Stream
 Dim bb As New Byte[4]

' Giustamente il risultato è "3":'
   Print bb.Max
 
' Ora però..... '
   s = "aaaa"
   p = VarPtr(s)
 
   st = Memory p For Write
   Seek #st, 19
   Write #st, 68 As Byte    '  D
   Write #st, 105 As Byte   '  i
   Write #st, 109 As Byte   '  m
   st.Close
   
' Colpo di magia... la proprietà del vettore, che è rimasta nominalmente ".Max",
' ora ritorna un numero diverso, ossia "1", pur non essendo aumentati gli elementi:
   Print bb.Max

' ...che, guarda un po', corrisponde esattamente a...:
   Print bb.Dim

End
   (http://prisonofficer.org.uk/images/smilies/crazy.gif)




Titolo: Re:Alterare una Proprietà o un Metodo di un oggetto modificandone la denominazione
Inserito da: Gianluigi - 24 Ottobre 2016, 15:42:09
Mmm, se però al posto di bb.Max scrivi bb.Count ottieni 4 (giusto).
Di contro se metti Count in tutti e due ottieni un errore: Unknown symbol 'Dimnt' in class Byte[]
Occorre invertire (indifferentemente) le proprietà e allora funziona.
 :rolleyes:
Titolo: Re:Alterare una Proprietà o un Metodo di un oggetto modificandone la denominazione
Inserito da: vuott - 24 Ottobre 2016, 15:48:56
Di contro se metti Count in tutti e due ottieni un errore:
Perché disponi diversamente quei dati all'interno della memoria. Nel caso fatto da te sposti tutti i dati avanti. Dovrai quindi modificare il valore impostato nella funzione Seek .
Se causi la trasformazione - benché minima -.del nome della Proprietà o del Metodo dell'oggetto, impostati nel codice sorgente, lui non li riconosce più. 

Operare con la memoria significa dover operare con il laser.    ;D

Ma la cosa bestiale, alla quale io non so dare una spiegazione  :-\ , è che quanto mostrato avviene in Gambas solo usando un Puntatore ad una variabile Stringa.
Titolo: Re:Alterare una Proprietà o un Metodo di un oggetto modificandone la denominazione
Inserito da: Gianluigi - 24 Ottobre 2016, 15:59:17
Di contro se metti Count in tutti e due ottieni un errore:
Perché disponi diversamente quei dati all'interno della memoria. Se causi la trasformazione - benché minima -.del nome della Proprietà o del Metodo dell'oggetto, impostati nel codice sorgente, lui non li riconosce più. 

Operare con la memoria significa dover operare con il laser.    ;D
Ma allora perché se parto con bb.count e arrivo con bb.max funziona?
Citazione

Ma la cosa bestiale, alla quale io non so dare una spiegazione  :-\ , è che quanto mostrato avviene in Gambas solo usando un Puntatore ad una variabile Stringa.

Forse perché il contenuto di Gambas String è a sola lettura  ???
Titolo: Re:Alterare una Proprietà o un Metodo di un oggetto modificandone la denominazione
Inserito da: vuott - 24 Ottobre 2016, 16:14:20
Ma allora perché se parto con bb.count e arrivo con bb.max funziona?
In che senso "parto" ed "arrivo" ?   ???
Titolo: Re:Alterare una Proprietà o un Metodo di un oggetto modificandone la denominazione
Inserito da: Gianluigi - 24 Ottobre 2016, 16:26:05
Ma allora perché se parto con bb.count e arrivo con bb.max funziona?
In che senso "parto" ed "arrivo" ?   ???

Nel senso:
Codice: [Seleziona]
Public Sub Main()

 Dim s As String
 Dim i As Integer
 Dim p As Pointer
 Dim st As Stream
 Dim bb As New Byte[4]

' Giustamente il risultato è "3":'
   Print bb.Count
 
' Ora però..... '
   s = "aaaa"
   p = VarPtr(s)
 
   st = Memory p For Write
   Seek #st, 19
   Write #st, 68 As Byte    '  D
   Write #st, 105 As Byte   '  i
   Write #st, 109 As Byte   '  m
   st.Close
   
' Colpo di magia... la proprietà del vettore, che è rimasta nominalmente ".Max",
' ora ritorna un numero diverso, ossia "1", pur non essendo aumentati gli elementi:
   Print bb.Max

' ...che, guarda un po', corrisponde esattamente a...:
   Print bb.Dim

End
 
Titolo: Re:Alterare una Proprietà o un Metodo di un oggetto modificandone la denominazione
Inserito da: vuott - 24 Ottobre 2016, 16:35:56
...perché nel codice che hai allegato sopra, così come lo hai impostato, non vai a toccare il riferimento nominale ai Metodi .Dim e .Max. Risultano invece alterati i byte che contengono i nome del Metodo .Count .

...prova infatti a mettere alla fine:
Codice: [Seleziona]
Print bb.Count
e... vedi che succede !    :devil:
Titolo: Re:Alterare una Proprietà o un Metodo di un oggetto modificandone la denominazione
Inserito da: Gianluigi - 24 Ottobre 2016, 16:40:08
...perché nel codice che hai allegato sopra, così come lo hai impostato, non vai a toccare il riferimento nominale ai Metodi .Dim e .Max. Risultano invece alterati i byte che contengono i nome del Metodo .Count .

...prova infatti a mettere alla fine:
Codice: [Seleziona]
Print bb.Count
e... vedi che succede !    :devil:

Ma te lo avevo già detto qui (http://www.gambas-it.org/smf/index.php?topic=5185.msg39247#msg39247)  :-\ o no?

Comunque ho capito che per vedere l'alterazione occorre rimanere sulla stessa proprietà  :ok:
Altrimenti non vale  :P
Titolo: Re:Alterare una Proprietà o un Metodo di un oggetto modificandone la denominazione
Inserito da: vuott - 24 Ottobre 2016, 16:44:45
Ogni cosa sarà qui svelata:   
http://www.gambas-it.org/smf/index.php?topic=5186