Newsgroup: it.comp.lang.c
Titolo: Problema di "general exception..." etc..

Salve a tutti!!
Grazie ancora per i chiarimenti che con tanta ma tanta pazienza mi andate
fornendo...
Ma sono davvero un gran rompiscatole...quindi ecco un altro problema:
questo prog ha un piccolo problema....
Quando arriva il momento di inserire più di un elemento ha il problema
grosso di non inizzializzarmi il successivo elemento della lista, per cui
quando arriva al punto di
        if (*p==NULL)        nella funzione "inserisci", mi ripete più volte
il seguente else di richiamo della funzione causandomi il "general etc...".
Perchè??
Grazie a tutti quelli che avranno la santa pazienza di dare un occhio a sta
roba che peraltro è ancora incompleta....
Ciao a tutti!!
Andrea
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
struct artista
  {
  char nome[40];
  char album[30];
  char data[10];
  };
struct elemento
  {
  struct artista art;
  struct elemento *next;
  };
void menu()
 {
 clrscr();
 puts("\n scegli l'operazione.");
 puts("\n I)nserisci.");
 puts("\n L)eggi.");
 puts("\n S)alva.");
 puts("\n C)arica.");
 puts("\n O)rdina.");
 puts("\n V)isualizza tutti i record.");
 puts("\n F)ine.");
 }
void inserisci(struct elemento **p);
void leggi(struct elemento *p);
void salva(struct elemento *p);
int main ()
 {
 struct elemento *p=NULL;
 char scelta;
 do
  {
  menu();
  scelta=getchar();
  switch(scelta)
   {
   case 'i': inserisci(&p);
    break;
   case 'l': leggi(p);
    break;
   case 's': salva(p);
    break;
   case 'o': ;
    break;
   case 'v':;
    break;
   case 'f': exit(1);
    break;
   default:;
   }
  }
  while (scelta!='f');
 return 0;
 }
void inserisci(struct elemento **p)
 {
 clrscr();
 char nome_art[40];
 char data[10];
 char album[30];
 if (*p==NULL)
  {
  *p=(struct elemento *)malloc(sizeof(struct elemento *));
  (*p)->next=NULL;
  puts("\n immetti il nome dell'artista");
  scanf("%s",&nome_art);
  puts("\n immetti il nome dell'album");
  scanf("%s",&album);
  puts("\n immetti la data");
  scanf("%s",&data);
  strcpy((*p)->art.album, album);
  strcpy((*p)->art.nome, nome_art);
  strcpy((*p)->art.data, data);
  }
  else {
         (*p)->next=NULL;
   inserisci(&(*p)->next);
   }
  }
void leggi(struct elemento *p)
 {
 clrscr();
 char scelta;
 fflush(stdin);
 puts("\n scegli come effettuare la ricerca:");
 puts("\n Nome Artista (n).");
 puts("\n Album (a).");
 puts("\n Data (d).");
 scanf("%c",&scelta);
 switch(scelta)
  {
  case 'n':
     {
     char nome[40];
     printf("\n immetti il nome dell'artista:   ");
     scanf("%s",&nome);
     for(;p!=NULL;p=p->next)
      {
      if (!strcmp(p->art.nome, nome))
       {
       clrscr();
       printf("\n nome dell'artista:   %s", p->art.nome);
       printf("\n titolo dell'album:   %s", p->art.album);
       printf("\n data:   %s", p->art.data);
       }
      else puts("\n artista non presente");
      }
     return;
     };
  case 'a':
     {
     char album[30];
     puts("\n immetti il titolo dell'album:  ");
     gets(album);
     for(;p!=NULL;p=p->next)
      {
      if(!strcmp(p->art.album, album))
       {
       printf("\n nome dell'artista:  %s", p->art.nome);
       printf("\n titolo dell'album:  %s", p->art.album);
       printf("\n data:    %s", p->art.data);
       }
      else puts("\n album non presente!");
      }
     return;
     };
  case 'd':
     {
     char data[10];
     puts("\n immetti la data da ricercare:   ");
     gets(data);
     for (;p!=NULL;p=p->next)
      {
      if (!strcmp(p->art.data, data))
       {
       printf("\ nome dell'artista:  %s", p->art.nome);
       printf("\ titolo dell'album:   %s", p->art.album);
       printf("\ data:  %s", p->art.data);
       }
      else puts("\n data non presente");
      }
     return;
     };
  }
 }
void salva(struct elemento *p)
 {
 FILE *pf;
 char nome[30];
 printf("\n inserire il nome del file su cui salvare:  ");
 scanf("%s", &nome);
 pf=fopen(nome,"w");
 if (pf)
  while(p)
   {
   fwrite (&p, sizeof(struct elemento),1,pf);
   p=p->next;
   }
  else puts("\n impossibile salvare su file");
  fclose(pf);
 }

 pf=fopen(nome,"w");
                ^^^
Attenzione : quando scrivi su disco delle strutture che contengono
dati di tipo stringa e' bene, per sicurezza, aprire il file con "w+b".
--
Andrea Laforgia
andrea_...@bigfoot.com

 
andrea_...@bigfoot.com

manca...
Dovresti impostarlo sulla compilazione di codice ANSI, sempre che esso
lo supporti.
--
Andrea Laforgia
andrea_...@bigfoot.com

 manca...
Possibile? Non può essere più vecchio del mio TurboC++ 1.01... o si?
EMG

manca...
Non e' che usi un compilatore C++?
Marco