2015-11-17 1 views
0

J'ai essayé de coder la compression shannon-fano et je pense que je suis resté coincé dans une allocation de mémoire. Il va jusqu'à la deuxième itération de la fonction, puis écrasé àCodage Shannon-Fano

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

Cette fonction est censée créer l'arbre binaire en utilisant Divide et impera, mais la première fois qu'il appelle shannonFano (n> st, commencer) il se bloque. Ma supposition est que l'allocation de la mémoire est fausse. classe nod {char * info; int * pondere; int val; struct nod * st, * dr; Je ne suis pas sûr de ce que vous voulez faire, mais je vois des problèmes.

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);    

    }   

} 
+1

Bienvenue chez SO. S'il vous plaît, formatez correctement votre code et expliquez mieux quel est le problème. Je vous remercie. – skypjack

Répondre

0

Selon votre formatage, vous souhaitez que les trois lignes après vos boucles for soient exécutées à chaque fois, mais seule la première le sera. Vous devez ajouter {}.

0

Je ne peux pas vraiment voir 100% de votre code, et comment il est exécuté, alors ne me crier si je me trompe, mais cette ligne:

int e_sum=n->pondere[dim]; 

semble suspect. Où cette table a-t-elle été attribuée? Est-il de taille dim? Si c'est le cas, le dernier élément serait trouvé à pondere[dim-1]; et l'utilisation de la valeur de dim causerait un comportement indéfini, ce qui risquerait de bloquer votre programme. En outre, vos boucles for ne sont pas suivies d'accolades, donc seulement la première ligne après les exécute dans la boucle, alors que votre indentation suggère que vous essayez d'exécuter toutes les lignes indentées (3 dans chaque cas, je crois

+0

Je n'ai pas l'intention d'inclure toutes ces 3 lignes pour; Je voulais juste les voir groupés. pondere est automatiquement affecté dans le constructeur que je n'ai pas montré ici. Pendant le débogage, j'ai remarqué qu'il ne passe pas la deuxième itération de 'nod * node = new nod; nœud-> st = nouveau nœud; nœud-> st-> st = NULL; nœud-> st-> dr = NULL; ' –