JavascriptProva

venerdì 6 gennaio 2012

Ecco le basi del mio convertitore!

Fatto!.

Non ricordavo come avevo risolto il problema l'altra volta con il VB6, e il fatto di avere a che fare con il VB 2010 mi inibiva psicologicamente, ma ora ho ricostruito perfettamente la procedura.
Ecco il prototipo del mio convertitore, al quale basta solo sostituire i codici ASCII per averlo funzionante sulle parentesi angolari da sostituire con le sequenze di escape < e >
Module Module1
    Sub main()
        Dim variabile As Byte
        FileOpen(1, "C:\Users\Io\Documents\file.txt", OpenMode.Binary)
        FileOpen(2, "C:\Users\Io\Documents\output.txt", OpenMode.Binary)
        Dim n As Integer = 1, k As Integer = 1
        Do Until EOF(1)
            FileGet(1, variabile, n)
            Debug.Print(variabile)
            If variabile = 65 Then
                variabile = 66
                FilePut(2, variabile, k)
                variabile = 67
                k = k + 1
                FilePut(2, variabile, k)
                variabile = 68
                k = k + 1
                FilePut(2, variabile, k)
            Else
                FilePut(2, variabile, k)
            End If
            n = n + 1
            k = k + 1
        Loop
    End Sub
End Module
Per ora questo sostituisce una A con la sequenza BCD in un nuovo file chiamato output.txt.
Funziona! Sono soddisfatto!

Rimaneggiamo il file

Questo è un modo per sostituire un carattere a un altro...
Banale...
Module Module1
   Sub main()
        Dim variabile As Byte
        FileOpen(1, "C:\Users\Io\Documents\file.txt", OpenMode.Binary)
        Dim n As Integer = 1
        Do Until EOF(1)
            FileGet(1, variabile, n)
            Debug.Print(variabile)
            If variabile = 65 Then
                variabile = 66
                FilePut(1, variabile, n)
            End If
            n = n + 1
        Loop
    End Sub
End Module
Alla fine il file conterrà la sequenza "BBCDEF...", in quanto la A viene sostituita dalla B.

Ripeto, banale.
Il problema è sostituire una parentesi angolare con la sequenza <, perchè lo spazio occupato è diverso.

Aprire il file in modalità binaria e leggere tutto il contenuto

Ecco: ho approntato in pochi secondi il codice che mi permette di aprire il file in modalità binaria:
Module Module1
   Sub main()
        Dim variabile As Byte
        FileOpen(1, "C:\Users\Io\Documents\file.txt", OpenMode.Binary)
        FileGet(1, variabile, 1)
        MsgBox(variabile)
    End Sub
End Module
Il file contiene le lettere dell'alfabeto maiuscole:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Ottengo come risultato il seguente:



Che se ricordo bene è il codice ASCII della A maiuscola (41H in esadecimale).
Bene.
Ora voglio recuperare tutti i bytes fino alla fine del file.

Module Module1
   Sub main()
        Dim variabile As Byte
        FileOpen(1, "C:\Users\Io\Documents\file.txt", OpenMode.Binary)
        Dim n As Integer = 1
        Do Until EOF(1)
            FileGet(1, variabile, n)
            MsgBox(variabile)
            n = n + 1
        Loop
    End Sub
End Module
Ecco fatto!

Usare files come tabelle anche qui!

Voglio provare a trattare un file come una tabella (cosa che non mi pare di aver mai fatto neanche in VB6)...

I campi della tabella saranno Nome, Cognome, Età.

Così:
Nome Cognome Età
Mario Rossi 19
Claudio Bianchi 23


Ed ecco come con FilePut inserisco i record nel file-tabella e come con FileGet li recupero:
Module Module1
    Structure Persona
         Dim Nome As String
         Dim Cognome As String
        Dim Eta As Integer
    End Structure


    Sub main()

        Dim Individuo As New Persona
        Dim Recipiente As New Persona
        With Individuo
            .Nome = "Mario"
            .Cognome = "Rossi"
            .Eta = 19
        End With
        FileOpen(1, "C:\Users\Io\Documents\file.txt", OpenMode.Random, , , 24)
        FilePut(1, Individuo, 1)
        FileGet(1, Recipiente, 1)
        MsgBox(Recipiente.Nome & " " & Recipiente.Cognome & " " & Recipiente.Eta)
    End Sub
End Module


Funziona! La casella di testo mi mostra che i dati sono stati scritti sul file e recuperati correttamente da un'altra variabile dello stesso tipo.

Variabile stringa in VB 2010

Se ho capito bene, le stringhe in VB 2010 sono trattate a tutti gli effetti come oggetti.
Quando io scrivo
        Dim variabile As String
non ottengo allocazione di memoria per la variabile.

Ora tratto la stringa come trattavo gli oggetti in VB6
        Dim variabile As String
        variabile = New String("cretino")
Questo funziona!
Con la seconda riga del codice io avrei creato in memoria uno spazio nel quale ho memorizzato la parola "cretino".
Questo può essere sintetizzato anche così:
        Dim variabile As String
        variabile = "cretino"
che funziona ugualmente. E questa è la sintassi alla quale sono abituato dal VB6... a meno che anche in quel linguaggio fosse possibile usare la sintassi con l'operatore New che non ho mai esplorato... il dubbio mi viene.

mercoledì 4 gennaio 2012

Stringhe di lunghezza fissa in una struttura

Forse ho trovato il modo di definire una stringa di lunghezza fissa come membro di una struttura in VB 2010.

La applico:
    Structure MiaStruttura
        <VBFixedString(10)> Dim Nome As String
        Dim Cognome As String
    End Structure
...e il compilatore non fa storie: ciò significa che è tutto OK!

Strutture e la vecchia istruzione Type

Ora che ci faccio con il file?
Cavoli, mi sono scordato tutto...

Quali erano le modalità di accesso? Accesso casuale, binario... e poi?

Ed ecco che mi trovo di fronte alla definizione di tipi personalizzati!

L'istruzione Type del classico VB6 lascia il VB 2010 come un deficiente che ti segnala errore perchè non la capisce.
Ma ecco che trovo in rete uno Structure.
Certo! Negli altri linguaggi di programmazione si parla di strutture.

Vediamo...

Ecco. Le stringhe a lunghezza fissa non sono supportate! Ecco perchè quando aggiungo al membro della struttura *10 ottengo un messaggio di errore.

Questo codice funziona:
Module Module1
    Structure MiaStruttura
        Dim Nome As String
        Dim Cognome As String
    End Structure

    Sub main()
        Dim Persona As MiaStruttura
        Persona.Nome = "Ciccio"
        Persona.Cognome = "Molliccio"
        MsgBox(Persona.Nome & " " & Persona.Cognome)
    End Sub
End Module
Invece di Type ho usato Structure e ho definito ugualmente un tipo personalizzato...
Ora gioco con i modificatori di accesso.
Inserisco un altro modulo e ci metto la dichiarazione della struttura
Module Module2
    Structure MiaStruttura
        Dim Nome As String
        Dim Cognome As String
    End Structure
End Module
E così funziona.

Ora inserisco il modificatore di accesso Private alla dichiarazione della struttura:
Module Module2
    Private Structure MiaStruttura
        Dim Nome As String
        Dim Cognome As String
    End Structure
End Module

E ottengo un messaggio di errore che segnala l'impossibilità della compilazione del programma

Però nello stesso modulo il modificatore Private non impedisce la compilazione.
Questo significa che Private si riferisce allo stesso modulo in cui viene dichiarata la struttura.