E' corretta questa impleentazione[C]??

fk16
Secondo voi l'implementazione di questo esercizio è corretta???
Grazie delle eventuali risposte.
/*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);
     }

Risposte
apatriarca
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.

fk16
Quindi dovrebbe essere così???
#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;
     }

apatriarca
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.