PDA

View Full Version : [C]passaggio di parametri ad una funzione


tenbota87
10-06-2011, 10:28
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 :muro: ..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!



#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);
}