C语言 A律压缩

来源:互联网 发布:出入无时 莫知其乡解释 编辑:程序博客网 时间:2024/06/05 15:24

这里写图片描述

昨天的compress之所以传出一个空值,是因为compress运行后,数组b被释放,所以需要给他定义一个static,它就使得b[8]存放在内存中的静态存储区中,所占用的存储单元一直不释放直到整个程序运行结束 。

#include <stdio.h>#include <stdlib.h>int * compress(int vaule){    int i, j;    int temp, a_temp;    int deviation;    static int b[8] = {0};//必须是static,否则运行结束后b[]会被释放    int a[16];    int c[8] = {16,32,64,128,256,512,1024,2048};    int d[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};    printf("please input vaule:");    scanf("%d",&vaule);    if(vaule < 0){        //vaule = abs(vaule);        vaule = -vaule;    }    else        b[0] = 1;    for(i = 0;i < 7;i++){        if(vaule < c[i]){            printf("i = %d\n",i);            break;        }    }    //段落码    switch (i) {    case 0:        b[1] = 0;        b[2] = 0;        b[3] = 0;        break;    case 1:        b[1] = 0;        b[2] = 0;        b[3] = 1;        break;    case 2:        b[1] = 0;        b[2] = 1;        b[3] = 0;        break;    case 3:        b[1] = 0;        b[2] = 1;        b[3] = 1;        break;    case 4:        b[1] = 1;        b[2] = 0;        b[3] = 0;        break;    case 5:        b[1] = 1;        b[2] = 0;        b[3] = 1;        break;    case 6:        b[1] = 1;        b[2] = 1;        b[3] = 0;        break;    case 7:        b[1] = 1;        b[2] = 1;        b[3] = 1;        break;    default:        break;    }    printf("c[%d] = %d",i,c[i]);    printf("\n");    if(i == 0)        temp = c[i] - 0;    else        temp = c[i] - c[i - 1];    printf("temp = %d\n",temp);    printf("a[] = ");    a_temp = temp / 16;    a[15] = c[i];    for(i = 14, j = 0;i > 0, j < 16; i--, j++) {        a[i] = a[15] - a_temp * d[j];    }    for(i = 0;i<16;i++){        printf("[%d]",a[i]);    }    printf("\n");    for(i = 0;i < 16;i++){        if(vaule < a[i]){            printf("i = %d\n",i);            break;        }    }    //段内码    switch (i) {    case 0:        b[4] = 0;        b[5] = 0;        b[6] = 0;        b[7] = 0;        break;    case 1:        b[4] = 0;        b[5] = 0;        b[6] = 0;        b[7] = 1;        break;    case 2:        b[4] = 0;        b[5] = 0;        b[6] = 1;        b[7] = 0;        break;    case 3:        b[4] = 0;        b[5] = 0;        b[6] = 1;        b[7] = 1;        break;    case 4:        b[4] = 0;        b[5] = 1;        b[6] = 0;        b[7] = 0;        break;    case 5:        b[4] = 0;        b[5] = 1;        b[6] = 0;        b[7] = 1;        break;    case 6:        b[4] = 0;        b[5] = 1;        b[6] = 1;        b[7] = 0;        break;    case 7:        b[4] = 0;        b[5] = 1;        b[6] = 1;        b[7] = 1;        break;    case 8:        b[4] = 1;        b[5] = 0;        b[6] = 0;        b[7] = 0;        break;    case 9:        b[4] = 1;        b[5] = 0;        b[6] = 0;        b[7] = 1;        break;    case 10:        b[4] = 1;        b[5] = 0;        b[6] = 1;        b[7] = 0;        break;    case 11:        b[4] = 1;        b[5] = 0;        b[6] = 1;        b[7] = 1;        break;    case 12:        b[4] = 1;        b[5] = 1;        b[6] = 0;        b[7] = 0;        break;    case 13:        b[4] = 1;        b[5] = 1;        b[6] = 0;        b[7] = 1;        break;    case 14:        b[4] = 1;        b[5] = 1;        b[6] = 1;        b[7] = 0;        break;    case 15:        b[4] = 1;        b[5] = 1;        b[6] = 1;        b[7] = 1;    default:        break;    }    //计算偏差值    deviation = (a[i] + a[i - 1]) / 2 - vaule;    if(deviation < 0)        deviation = -deviation;    for(i = 0;i < 8;i++)        printf("[%d]",b[i]);    printf("\n");    printf("deviation = %d\n",deviation);    //printf("b = %d\n",b);    //printf("*b = %d\n",*b);    return b;}void decompress(int b[]){    int temp;    int k;    char seg;    int c[8] = {1,1,2,4,8,16,32,64};    int d[8] = {0,16,32,64,128,256,512,1024};   if(b[0] == 0){       seg = '+';   }   else       seg = '-';   k = b[1] * 4 + b[2] * 2 + b[3];   temp = d[k] + c[k] * (b[4] * 8 + b[5] * 4 + b[6] * 2 + b[7]);   printf("vaule = %c%d\n",seg,temp);}int main(){    int vaule;    int *b;    int a[8];    int i;    b = compress(vaule);    //printf("%d\n",b);    //printf("%d\n",*b);    for(i = 0;i < 8;i++){        a[i] = *(b + i);        printf("[%d]",a[i]);    }    decompress(a);    return 0;}
1 0