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

    Scrivere un file bit a bit

    Ciao a tutti ho il seguente dilemma.
    Ho un array di unsigned char che può contenere solo valori 0 e 1. Vorrei scrivere questi valori in un file in modo che ogni elemento dell'array mi occupi un bit. Non essendo molto pratico della programmazione bit a bit sto riscontrando dei problemi di cui non capisco il motivo. Ho scritto il seguente programmino:

    codice:
    out2=fopen("Prova.txt","wb");
    unsogned char c,d;
    c='/0';
    d='/1';
    //in questo modo le variabili dovrebbero avere i bit
    //c = 00000000
    //d = 00000001
    for(j=0;j<lengtharray;j+=8)
    { 
    //scorro tutto l'array a passi di otto(bit in un byte) 
     for(i=0;i<8 && (j+i)<lungharray;i++)
     {
      //per ogni porzione di 8 elementi controllo il valore
      //se è 1 aggiorno la variabile che scriverò nel file
       if (mioarray[j+i]==1)
       {
         d=<<(8-i); //scifto il bit di i posizioni
         c=c|d;   //metto c in or con d cosi da "accendere" il bit opportuno
         d='/1';    //reimposto d=00000001
        }
      }
     //scrivo c nel file out
     fprintf(out,"%b",c);
     //reimposto c =00000000 e analizzo il successivo slot di 8 elementi
     c='/0';
    }
    Non funziona,anzi il programma va in loop infinito!!!
    al posto di printf ho provato anche la funzione
    fputc(out2,c);
    e,essendo un array di unsigned char ho anche cambiato la condizione
    mioarray[j+i]=='1';
    ma senza risultati.
    Ovviamente se qualcuno ha un consiglio per scrivere del codice più pulito,oltre che per far funzionare questo è il benvenuto

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ma a dire il vero se il codice è proprio quello (vabbè con main() e tutto il resto) mi meraviglio del fatto stesso che il compilatore te lo lasci compilare senza segnalarti almeno qualche warning... ammesso che davvero non lo faccia!

    Tanto per cominciare, scrivere '/0' e '/1' è scorretto: gli apici si usano con un singolo carattere (o al massimo con un carattere preceduto da '\') ma quello è sbagliato e giustamente il compilatore ti dice

    warning: multi-character character constant

    che poi che senso hanno quei / ? Al massimo potresti scrivere '\0' e '\1', cioè in questo modo indichi che ciò che segue il simbolo \ non è un carattere ma un valore numerico, ma a questo punto perché non ricorrere ad un array di interi?

    Inoltre, a parte una serie di altre piccole cose (come "unsogned" al posto di "unsigned") cosa significa questo:

    d=<<(8-i); ( confuso forse con d <<= (8-i) ? )

    e questo?

    fprintf(out,"%b",c);

    che è quel %b?

    Ti consiglio di rivedere un po' il codice
    every day above ground is a good one

  3. #3
    Scusate faccio mea culpa per alcuni errori di battitura dovuti alla fretta e all'ora tarda che sono stati scambiati per errori veri e propri.
    1. Si, è '\0' e non '/0'
    in questo modo,almeno da come dice il manuale, posso assegnare alla variabile UNSIGNED CHAR (e non ovviamente unsogned,altro errore) c la maschera ottale della rappresentazione dei bit 00000000,stessa cosa per d='\1' a cui voglio assegnare i bit 00000001, cosi da poter shiftare l'ultimo bit a sx di quante posizioni voglio.
    2.Si, l'istruzione è
    d=d<<(8-i); (oppure d<<=(8-i); come si vuole).
    Qui l'istruzione (8-i) serve (almeno nelle mie intenzioni) a spostare il bit con valore 1 di d (posizionato nella posizione più a dx) di tante posizioni in base alla posizione nella ipotetica maschera di 8 elementi del valore dell'array che stiamo analizzando.
    3.Non %b ma %d, anche se è un unsigned char, se provo a indicargli un %c a video non stampa nulla.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    E' meglio se posti un esempio di codice completo e corretto perché continua ad essere tutto troppo ermetico...

    1) cosa sono lengtharray e lungarray? "dimensioni degli array", sì, ma di quali? E quanto valgono?
    2) d=<<(8-i) ( vabbè che poi sarebbe d <<= (8-i) ) non shifta il bit di "i posizioni", ma di "8-i" posizioni...
    3)
    codice:
    c=c|d;   //metto c in or con d cosi da "accendere" il bit opportuno
         d='/1';    //reimposto d=00000001
    considerando che c vale 0 (almeno nel codice che hai riportato), quell'istruzione non fa altro che assegnare a c il valore di d... questo perché d ha una rappresentazione binaria come questa

    00000001

    dove quell'uno occupa una certa posizione che non è necessariamente quella dell LSB... ma facendo la OR bit a bit con 0 ottieni questo:

    00000001 |
    00000000 =
    ---------------
    00000001

    cioè ottieni lo stesso valore di c, quindi non vedo l'utilità dell'istruzione c = c | d, che a questo punto potrebbe tranquillamente essere sostituita da una semplice c = d...

    Insomma il consiglio è sempre quello riportato all'inizio di questo post
    every day above ground is a good one

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.