Ciao a tutti!
Ho fatto una funzione all'interno di un programma ma evidentemente ho sbagliato qualcosa perché non riesco a farla andare..solitamente non ho mai avuto problemi a farne mentre questa qualche problema me lo crea ..riuscite a darmi una mano?!?
E' una cosa che impiega pochi minuti!
Grazie mille..vi allego il codice e segnalo in maiuscolo dove è la chiamata alla funzione e cosa deve fare!
codice:
#include <stdio.h> //Direttive al pre processore che ci permettono di includere
#include <string.h> //gli haeder file,relativi a librerie standar.
#include <stdlib.h>
#include <limits.h>
#include <assert.h>
//#include "utils.h" //Viene incluso l'header file da me creato, le "" indicano al
//compilatore di cercare prima nella directory corrente.
// definizione della funzione ASSERT() con stampa di un messaggio di errore
#define ASSERT( condizionedaverificare, cosafare ) { if ( !(condizionedaverificare) ) { printf cosafare; printf("\n"); assert( condizionedaverificare ); } }
struct lista{ //Dichiarazione della lista usata dalla funzione aggiuntiva
char parola[257]; //Dichiarazione di un array di lunghezza massima 1024 adibito a contenere la parola
int frequenza; //Dichiarazione di una varibile adibita a contenere la frequenza della parola
struct lista *next; //Dichiarazione di un puntatore per lo spostamento all'interno della lista
};
/* LA FUNZIONE!!
void inserisci_in_lista(struct lista *ptr,char buffer[],int conta)
{
//inserisci in lista
prev = NULL;
temp = testa;
while(temp != NULL && strcmp(bufferLettura,temp->parola) != 0)
{
prev = temp;
temp = temp->next; //Incremento il puntatore per avanzare nella scansione della lista
}
if (temp == NULL)
{
nuovo=(struct lista*)malloc(sizeof(struct lista)); //Allocazione dinamica della memoria di una nuova cella della lista tramite la funzione malloc
strncpy(nuovo->parola,bufferLettura,contaLettere);
nuovo->frequenza=1; //Impostazione della frequenza della parola a 1
nuovo->next = NULL;
if (testa != NULL)
prev->next = nuovo;
else
testa = nuovo;
}
else
temp->frequenza++;
}
*/
void funzioneAusiliaria( unsigned char *nomeDelFile)
{
/**
*Il primo passo dell'algoritmo della funzione conteggio_cento prevede la dichiarazione di tutte le variabili che occorrono per il suo svolgimento e infine la creazione del nuovo
*file dove successivamente verranno inserite le parole con le successive frequenze.
*/
FILE *fileTesto=NULL,*fpw=NULL ;
char *centoParole;
char bufferLettura[257];
char lettera;
int contaLettere = 0;
int contaParole=0;
struct lista *nuovo;
struct lista *testa;
struct lista *temp, *temp2, *prev;
testa=NULL;
centoParole = (char*)malloc(sizeof(char)*(strlen(nomeDelFile)+7));
strcpy(centoParole,nomeDelFile);
strcat(centoParole,".world");
printf("\nIl nome del file creato dalla funzione ausiliaria e': %s\n",centoParole);
fflush(stdout);
fileTesto=fopen(nomeDelFile,"r"); //apertura del file di testo in modalità lettura
ASSERT((fileTesto!=NULL),("\nErrore nell'apertura del file di testo!\n"));
//controllo se il fileTesto è vuoto
lettera=fgetc(fileTesto);
if(feof(fileTesto))
{
printf("\nFile vuoto!");
fclose(fileTesto);
exit(1);
}
while(lettera != EOF)
{
if (lettera!=' ') {
if (contaLettere < 256) {
bufferLettura[contaLettere]=lettera;
}
contaLettere++;
}
else {
if (contaLettere > 0 && contaLettere <= 256)
{
// * CHIAMATA DELLA FUNZIONE *
// * FUNZIONE:
//inserisci_in_lista(struct lista *testa,char bufferLettura[],int contaLettere);
//INIZIO DI CIò CHE DEVE FARE LA FUNZIONE:
bufferLettura[contaLettere]='\0';
prev = NULL;
temp = testa;
while(temp != NULL && strcmp(bufferLettura,temp->parola) != 0)
{
prev = temp;
temp = temp->next; //Incremento il puntatore per avanzare nella scansione della lista
}
if (temp == NULL)
{
nuovo=(struct lista*)malloc(sizeof(struct lista)); //Allocazione dinamica della memoria di una nuova cella della lista tramite la funzione malloc
strncpy(nuovo->parola,bufferLettura,contaLettere);
nuovo->frequenza=1; //Impostazione della frequenza della parola a 1
nuovo->next = NULL;
if (testa != NULL)
prev->next = nuovo;
else
testa = nuovo;
}
else
temp->frequenza++;
} //FINE DI CIò CHE DEVE FARE LA FUNZIONE
bufferLettura[0]='\0';
contaLettere=0;
}
lettera=fgetc(fileTesto);
}
if (contaLettere > 0 && contaLettere <= 256) //inserisci in lista
{
// * CHIAMATA DELLA FUNZIONE *
// * FUNZIONE:
//inserisci_in_lista(struct lista *testa,char bufferLettura[],int contaLettere);
//INIZIO DI CIò CHE DEVE FARE LA FUNZIONE:
prev = NULL;
temp = testa;
while(temp != NULL && strcmp(bufferLettura,temp->parola) != 0)
{
prev = temp;
temp = temp->next; //Incremento il puntatore per avanzare nella scansione della lista
}
if (temp == NULL)
{
nuovo=(struct lista*)malloc(sizeof(struct lista)); //Allocazione dinamica della memoria di una nuova cella della lista tramite la funzione malloc
strncpy(nuovo->parola,bufferLettura,contaLettere);
nuovo->frequenza=1; //Impostazione della frequenza della parola a 1
nuovo->next = NULL;
if (testa != NULL)
prev->next = nuovo;
else
testa = nuovo;
}
else
temp->frequenza++;
}
//FINE DI CIò CHE DEVE FARE LA FUNZIONE
//ordinamento lista
printf("\n ordinamento lista");
temp = testa;
testa = NULL;
while (temp != NULL)
{
temp2 = testa;
prev = NULL;
while (temp2 != NULL && temp->frequenza < temp2->frequenza)
{
prev = temp2;
temp2 = temp2->next;
}
if (prev != NULL)
prev->next = temp;
else
testa = temp;
prev = temp->next;
temp->next = temp2;
temp = prev;
}
printf("\n Stampa su file");
//scrittura file 100 parole
fpw=fopen(centoParole,"w");
//utilizziamo prev per poter controllare la frequenza della centesima parola e delle successive.se hanno la stessa frequenza le stampiamo
temp = testa;
prev=temp;
while (temp != NULL && contaParole<100)
{
fprintf(fpw,"%d %s\n", temp->frequenza, temp->parola);
contaParole++;
prev=temp;
temp = temp->next;
}
//fare controllo su temp
if(temp == NULL)
{
fclose(fpw);
fclose(fileTesto);
exit(0);
}
while (prev->frequenza == temp->frequenza)
{
fprintf(fpw,"%d %s\n", temp->frequenza, temp->parola);
prev=temp;
temp = temp->next;
}
fclose(fpw);
fclose(fileTesto);
}