Anche così è abbastanza difficile capire perchè le informazioni sono comunque poche, però una cosa strana l'ho notata:codice:double weight_com; //<------------ quì assert(tracts /* check the function arguments */ & (cnt >= 0) && (index >= 0)); if (cnt <= 1) { /* if only one transaction left */ n = (cnt > 0) ? (*tracts)->cnt -index : 0; tat = (TATREE*)malloc(sizeof(TATREE) +(n-1) *sizeof(int)); if (!tat) return NULL; /* create a transaction tree node */ tat->cnt = cnt; /* and initialize its fields */ tat->size = -n; tat->max = n; (*tracts)->weight_tran= weight_com; /// <------- quì while (--n >= 0) tat->items[n] = (*tracts)->items[index +n]; return tat; }
Nella riga in basso dove ho scritto "quì" fai un'assegnazione con weight_com che è stato dichiarato ma non inizializzato in alcun modo,quindi questo non può voler dire nulla di buono.Se come mi sembra di intuire il valore di (*tracts)->weight_tran lo devi calcolare in base al valore nella chiamata ricorsiva precedente,weight_com deve essere un parametro non una variabile locale.se lo lasci così qualche problema c'è di sicuro anche se non è proprio il tuo problema magari,percheè al momento dell'assegnazione weight_com contiene solo spazzatura.