Gambas-it

Gambas3 => Domande tecniche => Topic aperto da: Gianluigi - 28 Gennaio 2015, 17:54:40

Titolo: Circa UCase
Inserito da: Gianluigi - 28 Gennaio 2015, 17:54:40
Ho notato una cosa, se io scrivo Ucase$(“perché”) ottengo PERCHé
Se invece scrivo Print.Ucase(“perché”) ottengo PERCHÉ
E' giusto così, oppure...

 :ciao:
Titolo: Re: Circa UCase
Inserito da: Top Fuel - 28 Gennaio 2015, 18:26:04
Probabilmente un buggettino.
Titolo: Re: Circa UCase
Inserito da: Gianluigi - 28 Gennaio 2015, 19:43:54
Si vede che sei il socio perfetto, mi capisci anche se scrivo cavolate (ho scritto così anche sulla ML) :)
Comunque intendevo String.Ucase()
Scusate
 :ciao:
Titolo: Re: Circa UCase
Inserito da: vuott - 28 Gennaio 2015, 20:20:18
Probabilmente un buggettino.

Non tutte le cose strane sono necessariamente bug !

La ragione esiste.... vi rinvio a quest'altra analoga discussione:    ;D

  http://www.gambas-it.org/smf/index.php?topic=2109.0
Titolo: Re: Circa UCase
Inserito da: Gianluigi - 28 Gennaio 2015, 20:44:21
@vuott
Hai proprio ragione, mi sarebbe bastato fare
For i = 32 To 126
  Print i, Chr$(i)
Next
per rendermene conto, prima di parlare.

Però una cosa non l'ho capita, perché InStr da 4, conta anche l'accento?

 :ciao:
Titolo: Re: Circa UCase
Inserito da: vuott - 28 Gennaio 2015, 21:15:01
...perché InStr da 4, conta anche l'accento?


.......caccia al tesoro: Scoprire come vengono rappresentate/costruite le lettere accentate extra ASCII    ;D
Titolo: Re: Circa UCase
Inserito da: Gianluigi - 28 Gennaio 2015, 23:19:52

.......caccia al tesoro: Scoprire come vengono rappresentate/costruite le lettere accentate extra ASCII    ;D

Allora vediamo... tu me lo avevi già spiegato, in occasione di questa discussione (http://www.gambas-it.org/smf/index.php?topic=3312.msg32384#msg32384).
Quindi da quanto qui spieghi il carattere (speciale) ASCII esteso può essere rappresentato da due caratteri ASCII consecutivi.
Se questa è la giusta interpretazione allora è normale che se io conteggio le parole in “modalità ASCII” otterrò 2 al posto di 1 ogni volta che c'è un carattere speciale.
Però non sono riuscito a estrarre il doppio carattere ASCII dalla stringa “é”.  :rolleyes:
 :ciao:
Titolo: Re: Circa UCase
Inserito da: vuott - 29 Gennaio 2015, 02:13:32
Allora vediamo... tu me lo avevi già spiegato, in occasione di questa discussione (http://www.gambas-it.org/smf/index.php?topic=3312.msg32384#msg32384).

Molto bene.



Quindi da quanto qui spieghi il carattere (speciale) ASCII esteso può essere rappresentato da due caratteri ASCII consecutivi.

... è  rappresentato da due caratteri consecutivi.


Però non sono riuscito a estrarre il doppio carattere ASCII dalla stringa “é”.


" O San Midi (http://it.wikipedia.org/wiki/Musical_Instrument_Digital_Interface) musico ed anacoreta,
  guida tu il mio cammino:
  io m'affido solo a te.
  Io m'affido solo a te !
"


Possiamo utilizzare almeno 4 modalità per vedere via codice i valori costituenti i caratteri non-ASCII  !

1a modalità
Quando noi lavoriamo con i caratteri, utilizziamo memoria, nella quale essi vengono immagazzinati. Pertanto, è là... in qualche spelonca della memoria del calcolatore che vanno rintracciati e stanati.
Quale risorsa di Gambas ci consente di sondare i profondi e misteriosi recessi della memoria ?
...i Memory Stream .    ;D

Vediamo come procediamo:
Codice: gambas [Seleziona]
Public Sub Main()

' Immagazziniamo i valori che compongono la lettera "è" nella memoria
' mediante il suo assegnamento in una coerente variabile di tipo Stringa:
  Dim s As String = "è"

' Sappiamo che per operare con i "Memory Stream" dobbiamo avere una variabile
' di tipo Puntatore, nella quale leggere (o scrivere) appunto con gli "Stream":
  Dim p As Pointer
  Dim st As Stream
  Dim b1, b2 As Byte

' Generiamo una variabile di tipo Puntatore che punta all'indirizzo di memoria della variabile
' di tipo Stringa contenente il valore "è":
    p = VarPtr(s)
    
' Generiamo dal Puntatore una variabile di tipo "Stream", con la quale - come già detto -
' potremo leggere nell'area di memoria puntata dal Puntatore:
      st = Memory p For Read

' Leggiamo il 1° byte dell'area di memoria puntata dal Puntatore e la mostriamo in console:
      Read #st, b1
      Print Hex(b1),

' Leggiamo il 2° byte dell'area di memoria puntata dal Puntatore e la mostriamo in console:
      Read #st, b2
      Print Hex(b2)

' Chiudiamo il flusso di memoria:
      st.Close

' Per mera controprova scriviamo in console il combinato risultato delle due letture:
      Print Chr(b1); Chr(b2)

End

In console vedremo i valori (C3  -  A8) delle due variabili di tipo Byte combacianti perfettamente con i valori riportati dalla mia precedente spiegazione che tu hai ritrovato.
La controprova ci restituisce in console nuovamente e coerentemente la lettera:  " è "



2a modalità
Senza dover scomodare San Midi, né i flussi di memoria, possiamo ottenere più semplicemente il medesimo risultato con i Vettori di tipo Byte[ ]:    :D
Codice: gambas [Seleziona]
Public Sub Main()

  Dim s As String = "è"
  Dim bb As Byte[]

' Carichiamo in un Vettore di tipo "Byte[]" tutti i valori che compongono
' e rappresentano il carattere contenuto nella variabile di tipo "String":
   bb = Byte[].FromString(s)
      
' Quindi li vediamo nella console:
   Print Hex(bb[0]), Hex(bb[1])

' Procediamo alla controprova:
   Print Chr(bb[0]); Chr(bb[1])

End




3a modalità
Possiamo anche semplicemente utilizzare qualche funzione per le Stringhe:
Codice: gambas [Seleziona]
Public Sub Main()

  Dim s As String = "è"

   Print Hex(Asc(Mid("è", 1, 1))), Hex(Asc(Mid("è", 2, 1)))

' Solita controprova:
   Print Chr(Asc(Mid("è", 1, 1))); Chr(Asc(Mid("è", 2, 1)))

End




4a modalità
La quarta modalità è la più breve, anche se restituisce un risultato più sporco, da ripulire quindi ed interpretare.
Codice: gambas [Seleziona]
Public Sub Main()

  Dim s As String = "è"

' Utilizziamo la funzione di dereferenziazione di un "Puntatore a Puntatore" in modo del tutto inusuale:
' inserendo come suo argomento la variabile Stringa contenente la lettera localizzata.
' Ciò nella considerazione che la variabile Stringa punta essa stessa ad un'area di memoria:
   Print Pointer@(s)

End

Il risultato è costituito dall'indirizzo di memoria della stringa di valori ed alla fine, a destra, dai valori che cerchiamo. In questo caso, come si nota, i  valori costituenti la lettera "è" sono posti in un ordine inverso, ossia così:  a8c3
Sapendo così interpretare quel risultato, siamo in grado comunque di conoscere i due valori che cercavamo.    ;D
Titolo: Re: Circa UCase
Inserito da: Gianluigi - 29 Gennaio 2015, 16:38:45
Che dire di fronte a questa Lezione Magistrale?

GRAZIE  :D

Lo so che urlare non è educato ma quando ci vuole ...ci vuole.
 :ciao:

PS: Io dei puntatori ho un sacro timore, però constato, grazie a te, che piano piano inizio a vederli sotto una diversa luce.  :)
Titolo: Re: Circa UCase
Inserito da: Gianluigi - 29 Gennaio 2015, 17:32:27
L'ultimo tuo esempio potrebbe essere completato così?
Codice: gambas [Seleziona]
Dim s, a, b As String
   
  s = "è"
' Dereferenziamo la variabile Stringa in modo del tutto inusuale: mediante la funzione di Gambas utilizzata solitamente 
' per dereferenziare un Puntatore a Puntatore. Ciò nella considerazione che la variabile Stringa punta essa stessa ad un'area di memoria:   
  a = Pointer@(s)   
  s = Right$(a, 4)
  a = Mid$(s, 3)
  b = Left$(s, 2)
  Print a, b
  ' solita controprova
  Print Chr(Val("&" & a)); Chr(Val("&" & b))


 :ciao:
Titolo: Re: Circa UCase
Inserito da: vuott - 29 Gennaio 2015, 17:38:40
L'ultimo tuo esempio potrebbe essere completato così?


Come, poi, tu estrapoli i valori da quel risultato, è un'operazione a parte, e la relativa modalità è a tua scelta.