PDA

View Full Version : [c]=problema funzione


mercury841
05-07-2006, 14:11
Ragazzi ho un problema con questo algoritmo:


/*-----------------------------------------------------------------------------------------------------
* Routine che crea, dalla lettura di un file
* un array di puntatori a carattere in cui
* l'ultimo puntatore punta a NULL.
* ---------------------------------------------------------------------------------------------------*/
char **crea_vet_stringhe(int file)
{

char **stringhe;
char *parola=NULL;
int size=1, //grandezza dell'array di stringhe
j=0; //contatore per scorrere la posizione in una parola
char c;
int nread;
int i;

if ((stringhe=(char **)malloc(size*sizeof(char *))) == NULL)
return(NULL);//errore allocazione

while ( read(file,&c,1) > 0 ) {//leggo carattere per carattere

if ( (c != ' ') && (c != '\0') && (c != '\n') && (c != EOF) ){
//costruisco la parola

if ( (parola=(char *)realloc(parola,(j+2)*sizeof(char ))) == NULL )
return(NULL);//errore di allocazione
parola[j]=c;
j=j+1;
}else{
if (parola != NULL){//parola trovata
parola[j]='\0';//carattere di fine stringa
printf("parola= %s\n",parola);
if ( (stringhe=(char **)realloc(stringhe,((size+1)*sizeof(char *)))) == NULL )
return(NULL);//errore di allocazione
if ( (stringhe[size-1]=(char *)malloc(strlen(parola))) == NULL)
return(NULL);//errore allocazione
strcpy(stringhe[size-1],parola);
size=size+1;
}
parola=NULL;
j=0;
}
}
stringhe[size-1]=NULL;//fine dell array di stringhe
return(stringhe);
}




la funzione legge un file, e crea, dalla lettura del file, un array di stringhe contenenti tutte le parole del file. Come ultimo elemento dell'array viene memorizzato NULL per indicarne la fine.
Andando a compilare ottengo questo Warning:
" warning: cast to pointer from integer of different size"
sulle seguenti righe:


if ( (parola=(char *)realloc(parola,(j+2)*sizeof(char ))) == NULL )
return(NULL);//errore di allocazione



if ( (stringhe=(char **)realloc(stringhe,((size+1)*sizeof(char *)))) == NULL )
return(NULL);//errore di allocazione



Da che dipende? Mi aiutate? ciao e grazie

trallallero
05-07-2006, 15:06
A me non lo da il warning ma dipende dal compilatore.
Penso sia il confronto tra il valore restituito
dalla realloc (puntatore) e il NULL che é 0 (intero)

stdio.h:
#define NULL 0

puoi anche ignorarlo, per me
Sennó casti il NULL a (char *)NULL
Ciao

mercury841
05-07-2006, 15:15
si infatti anche a me un compilatore mi da il warning e l'altro no, cmq grazie ciao

mercury841
05-07-2006, 15:22
Sennó casti il NULL a (char *)NULL


ho provato a castare il NULL e mi da sempre quei warning

trallallero
05-07-2006, 15:30
ho provato a castare il NULL e mi da sempre quei warning

guarda a me linux cosa da allora se attivo tutti i warnings ;)

linux: gcc -Wall prova.c -o p
prova.c: In function `crea_vet_stringhe':
prova.c:23: warning: unused variable `i'
prova.c:22: warning: unused variable `nread'
prova.c: At top level:
prova.c:70: warning: return type defaults to `int'
prova.c: In function `main':
prova.c:71: warning: control reaches end of non-void function

sottovento
06-07-2006, 06:11
if ( (parola=(char *)realloc(parola,(j+2)*sizeof(char ))) == NULL )
return(NULL);//errore di allocazione



if ( (stringhe=(char **)realloc(stringhe,((size+1)*sizeof(char *)))) == NULL )
return(NULL);//errore di allocazione




Non ho sottomano manuali o compilatori per fare le prove. Cmq controllerei il manuale della realloc(). Se fail il cast a (char *) e (char **) sul valore ritornato, probabilmente lo fai perche':
1 - e' una buona regola di programmazione;
2 - la realloc() ti restituisce un altro tipo, presumibilmente (void *).

E' quindi probabile che voglia lo stesso tipo in ingresso. Prova a fare il cast allo stesso tipo sul primo parametro. (cioe' realloc ((void *)parola, ......, ammesso che sia possibile)

High Flying
Sottovento