Pagina 1 di 1

Agenda in c (riprovo con liste e dynall)

Inviato: mar 7 lug 2009, 17:32
da Blallo

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLN 80
#define MAXCN 32
#define MAXNM 20

const char name[]="mydatabase.dat";

typedef struct agenda
{
	char nome[MAXNM];
	char cognome[MAXCN];
	char indirizzo[MAXLN];
	int num;
	char nota[MAXLN];
	struct agenda *next;
}agenda;

typedef agenda * agendaPtr;

agendaPtr push(agendaPtr head, agenda val);
agendaPtr pop(agendaPtr head);

int main()
{
	agendaPtr tmp;
	agendaPtr head=NULL;
	agenda val;
	FILE *fp;
	int c=0;
	char t_cogn[MAXCN], t_nom[MAXNM];

	printf("************************\n");
	printf("*********AGENDA*********\n");
	printf("************************\n");
	printf("***(c) Savino Liguori***\n");
	//printf("************************");
	
	if((fp=fopen(name,"r+w"))==NULL)
	{
		fprintf(stderr,"Errore apertura database");
		return EXIT_FAILURE;
	}

	while(c<5)
	{
		printf("************************\n");
		printf("1:Leggi Lista Contatti\n");
		printf("2:Aggiungi Contatto\n");
		printf("3:Rimuovi Contatto\n");
		printf("4:Cerca Contatto\n");
		printf("0:Esci Dal Programma\n");
		scanf("%d", &c);
		if(c==0)
		{
			printf("Grazie per aver usato AGENDA");
			return EXIT_SUCCESS;
		}
		else if(c==1)
		{	
			while(!feof)
			{
				fscanf(fp, "%s %s %s %d %s", val.nome, val.cognome, val.indirizzo, &val.num, val.nota);
				printf("%s %s", val.nome, val.cognome);
			}
			rewind(fp);
		}
		else if(c==2)
		{
			printf("(Inserire _ al posto dello spazio:\n)");
			printf("Nome:\n");
			scanf("%s", val.nome);
			printf("Cognome:\n");
			scanf("%s", val.cognome);
			printf("Indirizzo:\n");
			scanf("%s", val.indirizzo);
			printf("Numero di telefono:\n");
			scanf("%d", &val.num);
			printf("Note:\n");
			scanf("%s", val.nota);
			head=push(head, val);
			rewind(fp);
		}
		else if(c==3)
		{
			printf("(Inserire _ al posto dello spazio:\n)");
			printf("Cognome:\n");
			scanf("%s", t_cogn);
			printf("Nome:\n");
			scanf("%s", t_nom);
			while(!feof && ((strcmp(t_cogn, val.cognome)==0) && (strcmp(t_nom, val.nome)==0)))
				fscanf(fp, "%s %s %s %d %s", val.nome, val.cognome, val.indirizzo, &val.num, val.nota);
			head=pop(head);
			rewind(fp);
		}
		else if(c==4)
		{
			printf("(Inserire _ al posto dello spazio:\n)");
			printf("Cognome:\n");
			scanf("%s", t_cogn);
			while(!feof && (strcmp(t_cogn, val.cognome)==0))
				fscanf(fp, "%s %s %s %d %s", val.nome, val.cognome, val.indirizzo, &val.num, val.nota);
			printf("%s %s %s %d %s", val.nome, val.cognome, val.indirizzo, val.num, val.nota);
			rewind(fp);
		}
	}
	if (c>4)
		printf("Parametro non valido");
	return EXIT_SUCCESS;
}

agendaPtr push(agendaPtr head, agenda val)
{
	agendaPtr tmp;
	
	tmp=(agendaPtr)malloc(sizeof(agenda));
	if(tmp==NULL)
	{
		printf("Allocazione fallita!");
		exit (1);
	}
	
	tmp->nome=val.nome;
	tmp->cognome=val.cognome;
	tmp->indirizzo=val.indirizzo;
	tmp->num=val.num;
	tmp->nota=val.nota;
	tmp->next=head;
	head=tmp;
	return head;
}

agendaPtr pop(agendaPtr head)
{
	agendaPtr tmp;
	tmp->next=head;
	head=NULL;
	return head;
}
compilando mi da un errore nella push...

Codice: Seleziona tutto

Agenda.c:124: error: incompatible types in assignment
Agenda.c:125: error: incompatible types in assignment
Agenda.c:126: error: incompatible types in assignment
Agenda.c:128: error: incompatible types in assignment

Re: Agenda in c (riprovo con liste e dynall)

Inviato: mar 7 lug 2009, 17:59
da Vito
Se vuoi io ho fatto una tesina su una lista dove implementavo anche il salvataggio e caricamento da file...
te la posso passare :-)
però è un progetto diviso in 3 file.

Re: Agenda in c (riprovo con liste e dynall)

Inviato: mar 7 lug 2009, 18:36
da 414N
Prova a togliere il cast dalla malloc.

Re: Agenda in c (riprovo con liste e dynall)

Inviato: mar 7 lug 2009, 18:41
da FireEater
Stai copiando indirizzi, come nel post precedente.
Se noti per la variabile intera non ti da problemi.

Per i vettori di caratteri si usano strcpy & co.

Ciao

PS: quel cast dovrebbe andar bene, IMHO usare typedef per definire un puntatore ad agenda non è bello.

Re: Agenda in c (riprovo con liste e dynall)

Inviato: mar 7 lug 2009, 20:45
da Blallo
@vito: se puoi mi farebbe molto piacere grazie:)

Re: Agenda in c (riprovo con liste e dynall)

Inviato: mar 7 lug 2009, 20:50
da Vito
jimmy_page_89 ha scritto:@vito: se puoi mi farebbe molto piacere grazie:)
Ti mando tutto a breve ;-)


Se mi dai la mail via pm faccio prima :-D

Re: Agenda in c (riprovo con liste e dynall)

Inviato: mer 8 lug 2009, 21:03
da kreen
Ciao.
Se non ti offendi ad accettare un consiglio, utile in tutti i campi, non solo con il C, quando fai una operazione, certa di pensare perche' la fai e cosa ci sta dietro.

Cosa vuoi fare con
tmp->nome=val.nome;

Ricordati che gli array non sono puntatori.

Inoltre, malloc e realloc non devono vivere senza free. Non ne vedo nel tuo codice. Non liberi la memoria.
Prendi certe abitudini (non so se stai studiando a scuola o se programmi per "hobby"), ma in ogni caso ti risparmi ore di debug per nulla.

***IMHO***
Userei un switch invece degli if.

L'else dopo l'if(0==c) e' inutile.

while(!feof) <--- ??? man feof
{

*** Sicuro di questo?
while(!feof && ((strcmp(t_cogn, val.cognome)==0) && (strcmp(t_nom, val.nome)==0)))
fscanf(fp, "%s %s %s %d %s", val.nome, val.cognome, val.indirizzo, &val.num, val.nota);
head=pop(head);

e se tizio avvia il programma e sceglie per prima cosa l'opzione 3, cosa succede?

etc...