Shannon-Fano编码

时间:2015-11-17 18:47:54

标签: c++ memory compression dynamic-allocation

我一直试图对shannon-fano压缩进行编码,我认为我陷入了内存分配。它进入函数的第二次迭代,然后在

处崩溃
   nod *node=new nod;
   node->st=new nod;     
   node->st->st=NULL;
   node->st->dr=NULL;

此函数应该使用Divide et Impera创建二叉树,但第一次调用 shannonFano(n-> st,begin); 时会崩溃。我的假设是内存的分配是错误的。     班级点头        {char * info;         int * pondere;         int val;         struct nod * st,* dr;

void shannonFano(nod *n, int dim)
{     
  if (dim>1)
  {

 int begin=0;
 int end=dim;
 int b_sum=n->pondere[0];
 int e_sum=n->pondere[dim];
 nod *node=new nod;
 node->st=new nod;     
 node->st->st=NULL;
 node->st->dr=NULL;

 node->dr=new nod;     
 node->dr->st=NULL;
 node->dr->dr=NULL;

 while (begin !=end-1)
 {
  if (b_sum > e_sum)
      {end--;
       e_sum=e_sum+n->pondere[end];
       } else {
              begin++;
              b_sum=b_sum+n->pondere[begin];
              }
 }

 strncpy(node->info,n->info,begin);
 for (int i=0;i<begin;i++)
     node->pondere[i]=n->pondere[i];
     node->val=0;
     n->st=node;

 strncpy(node->info,&n->info[end],dim-end+1); 
 for (int i=end;i<dim;i++)
     node->pondere[i]=n->pondere[i];     
     node->val=1;      
     n->dr=node;

   shannonFano(n->st,begin);
   shannonFano(n->dr,dim-end+1);              

    }           

}

2 个答案:

答案 0 :(得分:0)

我不确定你想做什么,但我看到了问题。根据您的格式,您希望每次执行for循环后的三行,但只有第一行。您需要添加{}

答案 1 :(得分:0)

我真的看不到100%的代码,以及它是如何被执行的,所以如果我错了就不要对我大喊大叫,但这一行:

int e_sum=n->pondere[dim];

似乎很可疑。这个数组在哪里被分配?它的大小暗淡吗?如果是这样,最后一个元素将在 pondere[dim-1];并使用dim中的值会导致未定义的行为,可能会导致程序崩溃。

此外,你的for循环后面没有括号,所以只有它们之后的第一行才能在循环中执行,而你的缩进建议你试图执行所有缩进的行(我相信每个3行)