Autore Topic: Circa UCase  (Letto 1157 volte)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Circa UCase
« il: 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:
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
Re: Circa UCase
« Risposta #1 il: 28 Gennaio 2015, 18:26:04 »
Probabilmente un buggettino.
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 Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re: Circa UCase
« Risposta #2 il: 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:
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
Re: Circa UCase
« Risposta #3 il: 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
« 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
Re: Circa UCase
« Risposta #4 il: 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:
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
Re: Circa UCase
« Risposta #5 il: 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
« 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
Re: Circa UCase
« Risposta #6 il: 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.
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:
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
Re: Circa UCase
« Risposta #7 il: 29 Gennaio 2015, 02:13:32 »
Allora vediamo... tu me lo avevi già spiegato, in occasione di questa discussione.

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 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
« Ultima modifica: 30 Gennaio 2015, 10:44:30 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
Re: Circa UCase
« Risposta #8 il: 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.  :)
« Ultima modifica: 29 Gennaio 2015, 16:46:19 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re: Circa UCase
« Risposta #9 il: 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:
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
Re: Circa UCase
« Risposta #10 il: 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.
« 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. »