Newsgroup: it.comp.lang.c
Titolo: Urgentissimo (per domattina)!!!!!! Vi prego aiutatemi!

Il seguente programma funziona alla perfezione, tranne per il fatto che se
esco dopo aver cercato qualcosa nell'albero sia che la trova o che non la
trova mi da errore di segmentation fault. C'č qualche anima pia che puņ
aiutarmi,  mi serve per domani mattina.
#include <stdio.h>
typedef struct Record
{ char date[10];
  unsigned char info1[100];
  char info2[50];
  unsigned char info3[50];
} RECORD;
typedef struct Albero
{ char date[10];
  unsigned char info1[100];
  char info2[50];
  unsigned char info3[50];
  struct albero *left;
  struct albero *right;
} ALBERO;
void *Load(char *file);
int TreeInsert(ALBERO **tree, void *rec);
int DateConfronta(char *data1, char *data2);
void *Search(void *tree, char *date);
void Inorder(ALBERO *t);
void *Load(char *file)
{ FILE *fp;
  ALBERO *tree=NULL;
  RECORD rec;
  if(!(fp=fopen(file,"rb"))) return NULL;
  rewind(fp);
  while(fread(&rec,sizeof(RECORD),1,fp))
    TreeInsert(&tree,&rec);
  fclose(fp);
  return tree;
}
int TreeInsert(ALBERO **tree, void *rec)
{ RECORD *r=rec;
  int ris;
  if(!*tree)
  { (*tree)=malloc(sizeof(ALBERO));
    strcpy((*tree)->date,r->date);
    memcpy((*tree)->info1,r->info1,100);
    strcpy((*tree)->info2,r->info2);
    memcpy((*tree)->info3,r->info3,50);
    (*tree)->left=(*tree)->right=NULL;
  }
  else if((ris=DateConfronta((*tree)->date,r->date))>0)
TreeInsert(&(*tree)->left,r);
  else if(ris<0) TreeInsert(&(*tree)->right,r);
  else return -1;
  return 0;
}
int DateConfronta(char *data1, char *data2)
{ int i;
  char *mesi[12] = {"gen","feb","mar","apr","mag","giu",
       "lug","ago","set","ott","nov","dic"};
  char d1[10], d2[10];
  for(i=0;i<4;d1[i]=data1[i+5],
              d2[i]=data2[i+5], ++i);
  for(i=0;i<12;++i)
  {
    if(strncmp(mesi[i],data1,3)==0)
       sprintf(d1+4,"%.2d",i);
    if(strncmp(mesi[i],data2,3)==0)
       sprintf(d2+4,"%.2d",i);
  }
  d1[6]=data1[3]; d1[7]=data1[4];
  d2[6]=data2[3]; d2[7]=data2[4];
  d1[8]=d2[8]=0;
  return strcmp(d1,d2);
}
void *Search(void *tree, char *date)
{ int ris;
  ALBERO *t=tree;
  RECORD *r=NULL;
  if(!t) return NULL;
  if((ris=DateConfronta(t->date,date))==0)
  { r=malloc(sizeof(RECORD));
    strcpy(r->date,t->date);
    memcpy(r->info1,t->info1,100);
    strcpy(r->info2,t->info2);
    memcpy(r->info3,t->info3,50);
    return r;
  }
  else if(ris>0) return Search(t->left,date);
  else return Search(t->right,date);
}
void Inorder(ALBERO *t)
{
 if(!t) return;
 Inorder(t->left);
 printf("\ndata: %s",t->date);
 Inorder(t->right);
}
void main()
{ char filename[20]="prova.dat";
  char s;
  char *find;
  ALBERO *albero=NULL;
  FILE *fp;
  printf("A");
  albero=Load(filename);
  for(;;)
  { printf("\n\nMENU\n\n");
    printf("1) Search\n");
    printf("2) Inorder \n");
    printf("0) Exit\n");
    printf("Scegli: ");scanf("%s",&s);
    switch(s)
    { case '1': printf("\nInserisci la data del record da cercare:
");scanf("%s",find);
  if(!Search(albero,find)) printf("\nElemento non trovato!");
  else printf("\nElemento trovato!");
  break;
      case '2': printf("\n  ****  Inorder  ****  \n");
                Inorder(albero);
  break;
      case '0': exit(0);
    }
  s=0;
  }
}
Marilena!!!!

 wrote in message
8kifjj$vgu$1...@lacerta.tiscalinet.it...
| Il seguente programma funziona alla perfezione, tranne per il fatto che
se
| esco dopo aver cercato qualcosa nell'albero sia che la trova o che non la
| trova mi da errore di segmentation fault.
[cut]
e se usassi un debugger?
--

Grazie lo stesso: già fatto!!!