Errore di compilazione

di il
4 risposte

Errore di compilazione

Salve , ho un problema di compilazione per una tabella dei simboli di un esercizio per un esame.
Quando compilo mi da questo errore e non riesco a capire il perché, qualcuno può aiutarmi??
Questo è l'errore che mi da il compilatore
Questo è l'errore che mi da il compilatore

Questo è il codice (spero si capisca)
#include <stdlib.h>
#include <stdio.h>


/*************************************************/
/*   Definisco la dimensione della simbol table  */
/*   con un numero primo  che servirà poi        */
/*   per la funzione di hashing.                 */                           
/*************************************************/
#define HASHSIZE 101


/****************************/
/* STRUTTURA PER I PRELIEVI */
/****************************/
typedef struct p{
	int cifra;
	struct p *next;
}prelievo;
typedef prelievo *PRELIEVO;



/******************************/
/* STRUTTURA PER I VERSAMENTI */
/******************************/
typedef struct v{
	int cifra;
	struct v *next;
}versamento;
typedef versamento *VERSAMENTO;



/*****************/
/* SYMBOL TABLE  */
/*****************/
typedef struct s{
	char		*nome;
	char 		*cf;
	int		sommePrelevate;
	int		sommeVersate;
	VERSAMENTO 	sv; 
	PRELIEVO   	sp;
	struct s *next;
}symbol;
typedef symbol *SYMBOL;




SYMBOL      hashtable[HASHSIZE];
PRELIEVO    sommaPrelevata=NULL;
VERSAMENTO  sommaVersata=NULL;


/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *  Funzione hash. Usata per generare un hash che server come              *
 *  accesso diretto alla locazione di memoria dell'elemento.               *
 *  La funzione prende come parametro una stringa e genera un              *
 *  intero senza segno attraverso dei calcoli effettuati su tutte          *
 *  le lettere della stringa in modulo della dimensione della              *
 *  symbol table (che è un numero primo), così facendo si ha la certezza   *
 *  che possono essere utilizzate tutte le celle                           *
 *  di memoria messe a disposizione per la symbol table.                   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 
unsigned int hash(char *nome) {
    unsigned int h = 0;
    for (; *nome != '\0'; nome++) {
        h = (127 * h + *nome) % HASHSIZE;
    }
    return h;
}


/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *  La funzione di lookup prende in ingresso una stringa e ne ricerca l'elemento	   *
 *  corrispondente all'interno della symbol table. Viene generato l'hash		   *
 *  corrispondente alla stringa, si recupera l'elemento memorizzato a quell'indirizzo	   *
 *  e con il ciclo for si scorre la lista degli elementi in quella posizione. Il ciclo 	   *
 *  termina quando l'elemento è NULL o il paramentro "nome" corrisponde con l'elemento 	   *
 *  ricercato. Nel caso in cui la lista in questa posizione non è ancora assegnata si 	   *
 *  esce istantaneamente dal ciclo e viene ritornato l'elemento che in questo caso è NULL. *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
SYMBOL lookupElement(char *nome) {
    unsigned int h = hash(nome);
    SYMBOL ans = hashtable[h];
    for (; ans != NULL && ans->nome == nome; ans = ans->next);
    return ans;
}

/***********************************/
/*      LISTA SOMME PRELEVATE      */
/***********************************/
PRELIEVO cifraPrelevata(int somma){

	PRELIEVO p;
 	p = (PRELIEVO )malloc(sizeof(prelievo));
	if(p==NULL)
		return NULL;
	else
	{
		p->cifra = somma;
		p->next = sommaPrelevata;
		sommaPrelevata = p;
	}	
	return p;
}


/***********************************/
/*      LISTA SOMME VERSATE        */
/***********************************/
VERSAMENTO cifraVersata(int somma){

	VERSAMENTO v;
	v = (VERSAMENTO)malloc(sizeof(versamento));
	if(v==NULL)
		return NULL;
	else
	{
		v->cifra = somma;
		v->next = sommaVersata;
		sommaVersata = v;
	}
	return v;
}


/*******************************************/
/*      INSERIMENTO NELLA HASH TABLE       */
/*******************************************/
SYMBOL insertElement(char *nome , char *cf){
	SYMBOL ans = lookupElement(nome);
	if(ans==NULL){
		unsigned int h = hash(nome);

		

		ans = (SYMBOL)malloc(sizeof(symbol));

		int somma=0;

		if(ans==NULL)
			return NULL;
		else
		{
			ans->nome = nome;
			ans->cf = cf;

			ans->sp = sommaPrelevata;
			ans->sv = sommaVersata;

			sommaPrelevata=NULL;
			sommaVersata=NULL;


			ans->sommePrelevate = sommaCifra(ans->sp);
			ans->sommeVersate = sommaCifra(ans->sv);

			ans->next = hashtable[h];
			hashtable[h] = ans;
		}
	}

	return ans;
}





/*************************************/
/*      FUNZIONE PER SOMMARE         */
/*	    I PRELIEVI               */
/*************************************/

int sommaCifra(PRELIEVO p)
{

	int somma=0;
	if(p==NULL)
		return -1;
	else
	{
		while(p!= NULL)
		{
			somma = somma + p->cifra;
		}

	}

	return somma;

}


/*************************************/
/*      FUNZIONE PER SOMMARE         */
/*	    I VERSAMENTI             */
/*************************************/

int sommaCifra(VERSAMENTO v)
{

	int somma=0;
	if(v==NULL)
		return -1;
	else
	{
		while(v!= NULL)
		{
			somma = somma + v->cifra;
		}

	}

	return somma;

}






/*******************************************/
/*          FUNZIONE PER LIBERARE          */
/*           LA MEMORIA OCCUPATA           */
/*             DALLA TABELLA               */
/*******************************************/
void freeTable() {
    int i;
    SYMBOL s, ans;
    for (i = 0; i < HASHSIZE; i++) {
        if (hashtable[i] != NULL) {
            s = hashtable[i];
            for (; s != NULL; s = s->next) {
                ans = s;
                free(ans);
            }
        }
    }
}



4 Risposte

  • Re: Errore di compilazione

    È un programma c? Hai due funzioni con stesso nome e argomento diverso....
  • Re: Errore di compilazione

    Si , è un programma in C , non mi ero accorta di aver messo lo stesso nome , pensavo di averle differenziate scrivendo le iniziali una in maiuscolo e una in minuscolo. Praticamente è stata solo una svista.
    Grazie
  • Re: Errore di compilazione

    Il "C" NON SUPPORTA l'overloading delle funzioni, QUINDI devi differenziarle mediante il nome.

    Altrimenti devi convertire il file in C++ cambiando l'estensione da ".c" a ".cpp", ".cxx" o ".c++" (dipende dal compilatore)

    Inoltra, stai passando i parametri per VALORE, ma forse ti converrebbe passarli per PUNTATORE o REFERENCE (C++).
  • Re: Errore di compilazione

    Posso solo usare il linguaggio C per questi esercizi , mi servono per un esame , quindi non posso convertire il file. Cambiando il nome ho risolto , per quanto riguarda i parametri ci hanno fatto fare sempre in questo modo , come mai sarebbe meglio passarli per puntatore? A parte l'esame vorrei capire per curiosità mia.
Devi accedere o registrarti per scrivere nel forum
4 risposte