Autore Topic: Alterare una Proprietà o un Metodo di un oggetto modificandone la denominazione  (Letto 411 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
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
   




« Ultima modifica: 24 Ottobre 2016, 15:34:31 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
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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
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.
« Ultima modifica: 24 Ottobre 2016, 15:57:58 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
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  ???
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Ma allora perché se parto con bb.count e arrivo con bb.max funziona?
In che senso "parto" ed "arrivo" ?   ???
« 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
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
 
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
...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:
« 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é 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  :-\ o no?

Comunque ho capito che per vedere l'alterazione occorre rimanere sulla stessa proprietà  :ok:
Altrimenti non vale  :P
« Ultima modifica: 24 Ottobre 2016, 16:43:30 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
« 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. »