Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [QBASIC] Problema dimensione file

    Salve,
    ho creato, grazie (e sopratutto) al vostro aiuto, un programmino che mi permette di effettuare l'acquisizione dati da una scheda connessa alla seriale.
    L'acqusizione avviene ogni secondo e i dati vengono salvati su di un file che si contiene 24 ore di dati, dipodichè il file viene chiuso e ne viene riaperto un'altro.

    Il programma, che gira su un vecchio 486, dopo aver chiuso il file sull'hard disk ne fa una copia anche su un floppy.

    ...o meglio è quello che io vorrei.

    Purtroppo mi sto rendendo conto che i file di 24 ore di dati sono troppo grandi per essere contenuti in un dischetto.

    Il comando per aprire, scrivere e chiudere il file sono i seguenti:
    OPEN nomefile$ FOR APPEND AS #20
    PRINT #20, DATE$, TIME$, kW
    CLOSE #20

    Vorrei sapere se esiste un altro modo per poter scrivere i dati riducendo lo spazio sul disco in modo da poter avere un file di dimensioni tali da essere contenuto in un floppy da 1.44 Mb (meglio se più file..).

    Mi basterebbe anche solo un indizio così da ricercare su google la soluzione.

    Saluti,
    Alberto

  2. #2

    Re: [QBASIC] Problema dimensione file

    OPEN nomefile$ FOR APPEND AS #20
    Non usare mai un numero fisso per il 'numfile', usa FREEFILE.

    Vorrei sapere se esiste un altro modo per poter scrivere i dati riducendo lo spazio sul disco in modo da poter avere un file di dimensioni tali da essere contenuto in un floppy da 1.44
    Al momento il file quanto è grande? Potresti pensare di salvare i dati (soprattutto la data e l'ora) in binario anzichè come stringhe e risparmieresti parecchio spazio.

    Tra l'altro, se i dati si riferiscono tutti allo stesso giorno e i record sono salvati ogni secondo, serve proprio memorizzare data e ora per ogni record?

    HTH,

  3. #3
    Ciao,
    ti ringrazio per la risposta.
    Quella di salvare in binario potrebbe essere una prova...
    Sarebbe: OPEN nomefile$ FOR BINARY ....... ???
    E poi per scriverci sempre con in PRINT oppure devo usare il put?

    Scrivendo in binario il file risulta illegibile e devo creare un programmino che mi riporti in ascii il testo giusto?

    ciao e grazie

  4. #4
    Quella di salvare in binario potrebbe essere una prova...
    Sì, ma prima fai due conti per capire se ne vale la pena.

    Sarebbe: OPEN nomefile$ FOR BINARY ....... ???
    Sì.

    E poi per scriverci sempre con in PRINT oppure devo usare il put?
    PUT e GET.

    Scrivendo in binario il file risulta illegibile e devo creare un programmino che mi riporti in ascii il testo giusto?
    Sì, giusto. Ma al momento il file quanto è grande? 'kW' di che tipo è? Potrebbero esserci anche altre soluzioni, senza ricorrere al formato binario. E poi serve salvare data e ora per ogni record?

  5. #5
    Wow, ancora vivo il qbasic, c'ho passato la gioventù li sopra.

    Per ridurre le dimensioni di un file, il metodo più efficace è usare un algoritmo di compressione... il più usato è la codifica di Huffman (per darti un'idea della potenza, è la base dei moderni archivi zip e rar, che sai quanto agiscono bene sul testo).

    Ovviamente implementarlo (specialmente in basic, che non ha i puntatori) può essere complesso... ma cercando su google dovresti trovare qualcosa già fatto...
    ... io, cercando giusto huffman+qbasic, ho trovato questo
    http://internettrash.com/users/fdb/qbcmp.rar
    scaricalo e testalo, se funziona bene puoi adattarlo un minimo per il tuo programma.

    Dandogli una prima occhiata è abbastanza semplice l'interfaccia... col file huffman2.bas prende il nome del file da comprimere dalla linea di comando e lo restituisce compresso nel file output.huf, mentre col file encoder.bas prende il file compresso output.huf e lo decomprime nel file indicato sulla linea di comando.
    Input e output li puoi facilmente adattare al tuo programma, modificando i 4 open.
    Gli altri 2 file dovrebbero essere di libreria.
    Occhio alle istruzioni: siccome non è solo per qbasic, per usarlo in qbasic fai un search&replace per convertire SSEG in VARSEG nel codice.

    Se usi questo, testalo bene, perchè è li a scopo didattico, altrimenti googla e con pazienza trovi.
    UtèñtE non ti dirà mai come trasformare l'argilla in marmo, ma se gli chiederai come progettare una simulazione con le bacche di mirto, ti risponderà: "Versane ancora!".

  6. #6
    Ciao,
    forse risolvo in maniera molto più semplice... nel pc ho visto che c'è win 3.11 e quindi potrei far partire da una shell in programma e da un altra un altro programmino che ad un orario prestabilito mi zippa il file e lo copia nel floppy... domani provo..

    Comunque avevo pensato di ridurre un pò la dimensione del file riducendo i decimali dopo la virgola..
    E' possibile ridurre ad un solo decimale dopo la virgola in una variabile che è il risultato di una divisione?

    Ciao

  7. #7
    Beh, anche quella è una soluzione

    Per evitare d'appesantire il tutto usando win 3.1, scaricati il pkzip per dos
    http://www.uv.tietgen.dk/staff/mlha/Download/dos/#PKZIP
    (c'è anche l'unzip e il manuale)

    e per non usare altri programmini, lancialo direttamente dal tuo programma con un
    SHELL "pkzip ...parametri..."

    Se poi vuoi chiudere il tutto in una scatoletta veloce (consiglio non richiesto), procurati il quickbasic o il turbobasic, fai quei 2 adattamenti che servono e compila.

    Per l'ultima domanda... non so, non ho sott'occhio il completissimo help di qbasic con tutti i comandi, ma se non c'è il commando apposito, puoi semplicemente fare
    var = INT(var * 10) / 10
    e di fatto tronchi a una cifra decimale.

    Buon lavoro
    UtèñtE non ti dirà mai come trasformare l'argilla in marmo, ma se gli chiederai come progettare una simulazione con le bacche di mirto, ti risponderà: "Versane ancora!".

  8. #8
    Ciao,
    avevo pensato anche a win 3.11 perchè in questo modo ho una sorta di ambiente multitasking che non mi interrompe l'acquisizione dati mentre zippo e copio il file...
    ...o almeno così dovrebbe essere...

  9. #9
    Win 3.1 da quel punto di vista ti peggiora solo le cose, perchè aggiunge una marea di task di sistema in concorrenza al tuo e lo scheduling che usa è amatoriale... a parte che un sistema monoprocessore non può mai essere veramente multitasking, ma ciò di cui avresti bisogno tu, se il flusso di dati è intenso, è perlomeno di un sistema realtime... a quel punto dovresti passare a linux e settarlo come si deve, o perlomeno passare al c che ti permette di controllare i processi, con un sistema microsoft non ne esci, non li usano certo per i sistemi di controllo, può darsi che dati ne stai già perdendo così, dipende solo dal buffer in sti casi. Lanciando pkzip da dentro il programma comunque riduci il tempo perso davvero al minimo, e se regge il buffer, appunto, non perdi nulla. Purtroppo quello che ti serve per una realizzazione seria e sicura si scontra con i limiti del linguaggio, dell'interprete e dei sistemi che lo supportano.
    UtèñtE non ti dirà mai come trasformare l'argilla in marmo, ma se gli chiederai come progettare una simulazione con le bacche di mirto, ti risponderà: "Versane ancora!".

  10. #10
    Il campionamento lo faccio ogni secondo...per un 486 dovrebbe essere un'eternità
    Ma domani se trovo mezz'ora provo e ti faccio sapere!
    Quanto al buffer...la scheda di acqusizione dati non credo che supporti l'uso del buffer perchè per inviare i dati si aspetta che gli vengano richiesti (polling?).

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.