E' corretta questa impleentazione[C]??

Messaggioda fk16 » 03/02/2012, 11:22

Secondo voi l'implementazione di questo esercizio è corretta???
Grazie delle eventuali risposte.
Codice: Seleziona tutto
/*Scrivere i codic di due funzioni C che permettono di stampare i bit di un intero
e di copiare in un vettore di 4 char i 4 byte di un numero intero*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>

void bit_print(int a);
char unpack (int p, int k);

int main(){
    int a,j;
    char *str;
    str=(char*)calloc(4,sizeof(char));   
    printf("Inserire il valore dell'intero\n");
    scanf("%d",&a);
    bit_print(a);
    printf("\n");
    for(j=0;j<4;j++)
    str[j] = unpack(a,j);
    for(j=0;j<4;j++)
    printf("%d",str[j]);
    printf("\n");
    system("pause");
    return 0;
}

void bit_print(int a){
     int i;
     int n= sizeof(int) * CHAR_BIT;
     int mask = 1<<(n-1);
     for(i=1;i<=n;++i){
                       putchar(((a&mask)==0) ? '0' : '1');
                       a<<=1;
                       if(i%CHAR_BIT == 0 && i<n)
                       putchar(' ');
                       }}

char unpack (int p, int k){
     int n = k*CHAR_BIT;
     unsigned mask = 255;
     mask <<=n;
     return((p & mask)>> n);
     }
fk16
Junior Member
Junior Member
 
Messaggi: 220
Iscritto il: 08/03/2011, 13:39

Re: E' corretta questa impleentazione[C]??

Messaggioda apatriarca » 03/02/2012, 12:35

Il testo dell'esercizio sembra supporre che sizeof(int) sia uguale a 4. Infatti ne fa preciso riferimento nel testo. Ma è ovviamente più corretto supporre che sia più generale.

La tua funzione unpack non fa comunque quanto richiesto dall'esercizio. Restituisce infatti l'i-esimo byte del numero intero, ma la richiesta dell'esercizio dice che la funzione deve copiare tutti i byte in un array di char.. Per cui il ciclo che hai messo nel main dovrebbe essere inserito nella tua funzione. E sarebbe abbastanza corretto (anche se abbiamo discusso di recente su quale dovesse essere esattamente il significato di copiare i byte dell'intero ed esistono almeno due interpretazione diverse).

La funzione per stampare la rappresentazione binaria del numero mi sembra andare bene anche se l'avrei scritta diversamente. In particolare, avrei modificato la maschera invece del numero.
apatriarca
Moderatore
Moderatore
 
Messaggi: 2124
Iscritto il: 08/12/2008, 20:37
Località: Torino

Re: E' corretta questa impleentazione[C]??

Messaggioda fk16 » 03/02/2012, 13:29

Quindi dovrebbe essere così???
Codice: Seleziona tutto
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>

void bit_print(int);
char* unpack(int);

int main(){
    int a,j;
    char *str;
    str=(char*)calloc(4,sizeof(char));   
    printf("Inserire il valore dell'intero\n");
    scanf("%d",&a);
    bit_print(a);
    str=unpack(a);
    printf("\n");
    for(j=0;j<4;j++)
    printf("%d",str[j]);
    printf("\n");
    system("pause");
    return 0;
}

void bit_print(int a){
     int i;
     int n= sizeof(int) * CHAR_BIT;
     int mask = 1<<(n-1);
     for(i=1;i<=n;++i){
                       putchar(((a&mask)==0) ? '0' : '1');
                       a<<=1;
                       if(i%CHAR_BIT == 0 && i<n)
                       putchar(' ');
                       }}

char* unpack (int p){
     int n,k;
     char *vet;
     vet=(char*)calloc(4,sizeof(char));
     unsigned mask = 255;
     for(k=0;k<4;k++){
     n=k*CHAR_BIT;
     mask <<=n;
     vet[k]= (p & mask)>> n;
     }
     return vet;
     }
fk16
Junior Member
Junior Member
 
Messaggi: 220
Iscritto il: 08/03/2011, 13:39

Re: E' corretta questa impleentazione[C]??

Messaggioda apatriarca » 03/02/2012, 14:19

Ad una prima occhiata sembrerebbe corretto. Ricordati però di deallocare con free la memoria allocata.. Avrei forse lasciato l'allocazione dell'array nel main, probabilmente non avrei neanche usato l'allocazione dinamica della memoria.
apatriarca
Moderatore
Moderatore
 
Messaggi: 2124
Iscritto il: 08/12/2008, 20:37
Località: Torino


Torna a Informatica

Chi c’è in linea

Visitano il forum: claudio86 e 1 ospite