Oppure

Loading
01/02/08 19:32
AcId-SiMo88
Ciao a tutti, ho un problema che mi sta un po logorando con una semplice stampa di una lista!
Non riesco proprio a risolverlo nonstante l'aiuto di altri 2 ragazzi con un po + esperienza di me :d
invece che stampare ciò che vorrei, si vedono caratteri incomprensibili come se il puntatore fosse sbagliato, inoltre ho un segmentation fault, ma non riesco tuttavia a risolvere, ecco il codice:

listone.c
#include "listone.h"
/*Aggiunta di un nuovo elemento alla lista*/
/*===================================================*/
void nuovo_elemento(LISTA *pLista)
{
	int i;
	char NomE[LUNGH_MAX_NOME];
	char CognomE[LUNGH_MAX_NOME];
	int EtA;
	LISTA *puntante;
	LISTA *prec=NULL;
	LISTA *corr=pLista;
	puntante=(LISTA *)malloc(sizeof(LISTA));
	
	if(puntante==NULL)
	{
		printf("C'è un problema con la memoria\n");
		exit (-1);
	}
	printf("Inserire nome\n");
	fflush(stdin);
	scanf("%s", &NomE);
	printf("Inserire cognome\n");
	scanf("%s", &CognomE);
	printf("Inserire età\n");
	scanf("%d", &EtA);
/*===== Controlli sull'inserimento di campi corretti =====*/
for(i=0; NomE[i]=='Ciao a tutti, ho un problema che mi sta un po logorando con una semplice stampa di una lista!

Non riesco proprio a risolverlo nonstante l'aiuto di altri 2 ragazzi con un po + esperienza di me :d
invece che stampare ciò che vorrei, si vedono caratteri incomprensibili come se il puntatore fosse sbagliato, inoltre ho un segmentation fault, ma non riesco tuttavia a risolvere, ecco il codice:

listone.c
#include "listone.h"
/*Aggiunta di un nuovo elemento alla lista*/
/*===================================================*/
void nuovo_elemento(LISTA *pLista)
{
	int i;
	char NomE[LUNGH_MAX_NOME];
	char CognomE[LUNGH_MAX_NOME];
	int EtA;
	LISTA *puntante;
	LISTA *prec=NULL;
	LISTA *corr=pLista;
	puntante=(LISTA *)malloc(sizeof(LISTA));
	
	if(puntante==NULL)
	{
		printf("C'è un problema con la memoria\n");
		exit (-1);
	}
	printf("Inserire nome\n");
	fflush(stdin);
	scanf("%s", &NomE);
	printf("Inserire cognome\n");
	scanf("%s", &CognomE);
	printf("Inserire età\n");
	scanf("%d", &EtA);
/*===== Controlli sull'inserimento di campi corretti =====*/
for(i=0; NomE[i]=='{parsed_message}';i++)
	if((NomE[i]>'a' && NomE[i]<'z')||(NomE[i]>'A' && NomE[i]<'Z'));
		strcpy(puntante->nome,NomE);
for(i=0; CognomE[i]=='{parsed_message}';i++)
	if((CognomE[i]>'a' && CognomE[i]<'z')||(CognomE[i]>'A' && CognomE[i]<'Z'));
		strcpy(puntante->cognome,CognomE);
		
if (EtA>0 && EtA<130)
puntante->eta=EtA;
/*=====  =====*/
		puntante->id++;
	puntante->succ=NULL;
	
	while((corr!=NULL)&&(puntante->id>corr->id))
	{
		prec=corr;
		corr=corr->succ;
	}
	if(prec==NULL)
	{
		puntante->succ=pLista;				pLista=puntante;			
	}
	else
	{
		prec->succ=puntante;
		puntante->succ=corr;
	}
	
}
/*========================================================*/

void stampaLista(LISTA *pLista)
{
	printf("\n");
	prov=pLista;
	while (pLista->succ!=NULL)
	{
		printf("\nNome: %s \t\tCognome:%s \t\tEta: %d \n", pLista->nome, pLista->cognome,pLista->eta);
		pLista = pLista->succ;
	}
	printf("\n");
}
/*============================================================*/
void pause(){
	printf("Premere INVIO per continuare\n");
	getchar();
}


listone.h
#ifndef libc
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define LUNGH_MAX_NOME 100
#define DIM_LISTA 50

typedef struct lst
{
	char nome[LUNGH_MAX_NOME];
	char cognome[LUNGH_MAX_NOME];
	int eta;
	int id;
	struct lst *succ;
} LISTA;

void inizializzaLISTA();
void nuovo_elemento(LISTA *);
void stampa_listone();
void stampaLista(LISTA *);
void pause();
#endif


main.c
/*Programma di sintesi sull'utilizzo di liste ordinate*/
#include <stdio.h>
#include "listone.h"

int main()
{
	int scelta;
	LISTA array;
	LISTA *pLista;
	pLista=&array;
	do
	{
		printf("Benvenuto, premi uno dei seguenti tasti:\n");
		printf("[0] Esci senza salvare\n");
		printf("[1] Inserisci un nuovo elemento nella lista\n");
		printf("[2] Modifica un elemento della lista\n");
		printf("[3] Elimina un elemento della lista\n");
		printf("[4] Salva il contenuto della lista\n");
		printf("[5] Carica una lista preesistente\n");
		printf("[6] Stampa la lista\n");
		scanf("%d", &scelta);
		printf("\nHai scelto %d\n", scelta);
		switch(scelta)
		{
			case 0: printf("Ciao, a presto\n");
					return 0;
			case 1: 
				{
					nuovo_elemento(pLista);
				}
					break;
			case 6: 
				{
					stampaLista(pLista);
					pause();
					break;
				}
			default: 
				{
					printf("Scelta non consentita, riprova\n");
					break;
				}
		}
	}
		while(scelta);
	return 0;
}


scusate la prolissità, mi servirebbe conoscere il porblema entro domenica sera....lunedì ho l'esame su queste cose e un chiarimento mi farebbe molto bene...grazie in anticipo in ogni caso';i++) if((NomE[i]>'a' && NomE[i]<'z')||(NomE[i]>'A' && NomE[i]<'Z')); strcpy(puntante->nome,NomE); for(i=0; CognomE[i]=='Ciao a tutti, ho un problema che mi sta un po logorando con una semplice stampa di una lista!
Non riesco proprio a risolverlo nonstante l'aiuto di altri 2 ragazzi con un po + esperienza di me :d
invece che stampare ciò che vorrei, si vedono caratteri incomprensibili come se il puntatore fosse sbagliato, inoltre ho un segmentation fault, ma non riesco tuttavia a risolvere, ecco il codice:

listone.c
#include "listone.h"
/*Aggiunta di un nuovo elemento alla lista*/
/*===================================================*/
void nuovo_elemento(LISTA *pLista)
{
	int i;
	char NomE[LUNGH_MAX_NOME];
	char CognomE[LUNGH_MAX_NOME];
	int EtA;
	LISTA *puntante;
	LISTA *prec=NULL;
	LISTA *corr=pLista;
	puntante=(LISTA *)malloc(sizeof(LISTA));
	
	if(puntante==NULL)
	{
		printf("C'è un problema con la memoria\n");
		exit (-1);
	}
	printf("Inserire nome\n");
	fflush(stdin);
	scanf("%s", &NomE);
	printf("Inserire cognome\n");
	scanf("%s", &CognomE);
	printf("Inserire età\n");
	scanf("%d", &EtA);
/*===== Controlli sull'inserimento di campi corretti =====*/
for(i=0; NomE[i]=='{parsed_message}';i++)
	if((NomE[i]>'a' && NomE[i]<'z')||(NomE[i]>'A' && NomE[i]<'Z'));
		strcpy(puntante->nome,NomE);
for(i=0; CognomE[i]=='{parsed_message}';i++)
	if((CognomE[i]>'a' && CognomE[i]<'z')||(CognomE[i]>'A' && CognomE[i]<'Z'));
		strcpy(puntante->cognome,CognomE);
		
if (EtA>0 && EtA<130)
puntante->eta=EtA;
/*=====  =====*/
		puntante->id++;
	puntante->succ=NULL;
	
	while((corr!=NULL)&&(puntante->id>corr->id))
	{
		prec=corr;
		corr=corr->succ;
	}
	if(prec==NULL)
	{
		puntante->succ=pLista;				pLista=puntante;			
	}
	else
	{
		prec->succ=puntante;
		puntante->succ=corr;
	}
	
}
/*========================================================*/

void stampaLista(LISTA *pLista)
{
	printf("\n");
	prov=pLista;
	while (pLista->succ!=NULL)
	{
		printf("\nNome: %s \t\tCognome:%s \t\tEta: %d \n", pLista->nome, pLista->cognome,pLista->eta);
		pLista = pLista->succ;
	}
	printf("\n");
}
/*============================================================*/
void pause(){
	printf("Premere INVIO per continuare\n");
	getchar();
}


listone.h
#ifndef libc
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define LUNGH_MAX_NOME 100
#define DIM_LISTA 50

typedef struct lst
{
	char nome[LUNGH_MAX_NOME];
	char cognome[LUNGH_MAX_NOME];
	int eta;
	int id;
	struct lst *succ;
} LISTA;

void inizializzaLISTA();
void nuovo_elemento(LISTA *);
void stampa_listone();
void stampaLista(LISTA *);
void pause();
#endif


main.c
/*Programma di sintesi sull'utilizzo di liste ordinate*/
#include <stdio.h>
#include "listone.h"

int main()
{
	int scelta;
	LISTA array;
	LISTA *pLista;
	pLista=&array;
	do
	{
		printf("Benvenuto, premi uno dei seguenti tasti:\n");
		printf("[0] Esci senza salvare\n");
		printf("[1] Inserisci un nuovo elemento nella lista\n");
		printf("[2] Modifica un elemento della lista\n");
		printf("[3] Elimina un elemento della lista\n");
		printf("[4] Salva il contenuto della lista\n");
		printf("[5] Carica una lista preesistente\n");
		printf("[6] Stampa la lista\n");
		scanf("%d", &scelta);
		printf("\nHai scelto %d\n", scelta);
		switch(scelta)
		{
			case 0: printf("Ciao, a presto\n");
					return 0;
			case 1: 
				{
					nuovo_elemento(pLista);
				}
					break;
			case 6: 
				{
					stampaLista(pLista);
					pause();
					break;
				}
			default: 
				{
					printf("Scelta non consentita, riprova\n");
					break;
				}
		}
	}
		while(scelta);
	return 0;
}


scusate la prolissità, mi servirebbe conoscere il porblema entro domenica sera....lunedì ho l'esame su queste cose e un chiarimento mi farebbe molto bene...grazie in anticipo in ogni caso';i++) if((CognomE[i]>'a' && CognomE[i]<'z')||(CognomE[i]>'A' && CognomE[i]<'Z')); strcpy(puntante->cognome,CognomE); if (EtA>0 && EtA<130) puntante->eta=EtA; /*===== =====*/ puntante->id++; puntante->succ=NULL; while((corr!=NULL)&&(puntante->id>corr->id)) { prec=corr; corr=corr->succ; } if(prec==NULL) { puntante->succ=pLista; pLista=puntante; } else { prec->succ=puntante; puntante->succ=corr; } } /*========================================================*/ void stampaLista(LISTA *pLista) { printf("\n"); prov=pLista; while (pLista->succ!=NULL) { printf("\nNome: %s \t\tCognome:%s \t\tEta: %d \n", pLista->nome, pLista->cognome,pLista->eta); pLista = pLista->succ; } printf("\n"); } /*============================================================*/ void pause(){ printf("Premere INVIO per continuare\n"); getchar(); }


listone.h
#ifndef libc
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define LUNGH_MAX_NOME 100
#define DIM_LISTA 50

typedef struct lst
{
	char nome[LUNGH_MAX_NOME];
	char cognome[LUNGH_MAX_NOME];
	int eta;
	int id;
	struct lst *succ;
} LISTA;

void inizializzaLISTA();
void nuovo_elemento(LISTA *);
void stampa_listone();
void stampaLista(LISTA *);
void pause();
#endif


main.c
/*Programma di sintesi sull'utilizzo di liste ordinate*/
#include <stdio.h>
#include "listone.h"

int main()
{
	int scelta;
	LISTA array;
	LISTA *pLista;
	pLista=&array;
	do
	{
		printf("Benvenuto, premi uno dei seguenti tasti:\n");
		printf("[0] Esci senza salvare\n");
		printf("[1] Inserisci un nuovo elemento nella lista\n");
		printf("[2] Modifica un elemento della lista\n");
		printf("[3] Elimina un elemento della lista\n");
		printf("[4] Salva il contenuto della lista\n");
		printf("[5] Carica una lista preesistente\n");
		printf("[6] Stampa la lista\n");
		scanf("%d", &scelta);
		printf("\nHai scelto %d\n", scelta);
		switch(scelta)
		{
			case 0: printf("Ciao, a presto\n");
					return 0;
			case 1: 
				{
					nuovo_elemento(pLista);
				}
					break;
			case 6: 
				{
					stampaLista(pLista);
					pause();
					break;
				}
			default: 
				{
					printf("Scelta non consentita, riprova\n");
					break;
				}
		}
	}
		while(scelta);
	return 0;
}


scusate la prolissità, mi servirebbe conoscere il porblema entro domenica sera....lunedì ho l'esame su queste cose e un chiarimento mi farebbe molto bene...grazie in anticipo in ogni caso
aaa
02/02/08 1:20
bangirasu
Secondo me, e data la tarda ora non sono totalmente sicuro, l'errore è qui:
pLista=puntante;
nella funzione nuovo_elemento
xke da quello ke vedo pLista è un puntatore ad un elemento della lista e nn è l'indirizzo in cui risiede il puntatore alla lista...
Cioè tu con il typedef hai chiamato un elemento ( detto anche nodo della lista) LISTA, xò quello nn è una lista ma è solo un elemento...
quindi tu hai chiamato un elemento con il nome LISTA, quindi la lista avrà il tipo LISTA* quindi in questa funzione
void nuovo_elemento(LISTA *pLista)
tu stai passando pLista che è un puntatore a LISTA (che è un elemento), cioè pLista è un puntatore ad un singolo elemento (che hai kiamato LISTA), cioè pLista, essendo un puntatore ad un elemento ad un elemento, è una lista. invece quello ke devi fare è passare alla funzione un puntatore a lista, cioè un puntatore ad un puntatore a elemento... Passando pLista come hai fatto tu quando esegui
pLista=puntante;
pLista viene modificato solo nell'ambiente della funzione.

Un'alra cosa:
puntante->id++;
questo id non viene mai inizializzato e la malloc non imposta le variabili ne a 0 ne a NULL quindi stai incrementando un numero a caso...

Anche nella funzione di stampa fai un'assegnazione a pLista
pLista = pLista->succ;
questa assegnazione modifica pLista SOLO nell'ambiente della funzione; e in questo caso è giusto farlo poichè la stampa non deve modificare la lista.

PS: mi sembra ke l'errore sia quello e sottolineo il "mi sembra"
aaa