PDA

View Full Version : [C] Errore casuale, non esce sempre (urgente)


leadergl
15-01-2006, 22:50
raga il compilatore Dev-C++ qualche volta mi fa uscire un errore e non so perchè....vi posto il codice ed il tipo di errore:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Inclusioni Gestione Struttura Dati
#include "struttura.h"


// Riempie la lista delle proprietà di ogni nodo
void RiempiListaProprieta(ListaProprieta *list, char *proprieta)
{
int loop;
char *array[50];

// si posiziona sull'inizio delle proprietà
proprieta=strchr(proprieta, '|')+1;

array[0]=strtok(proprieta,"|");
if(array[0]==NULL)
{
exit(0);
}

for(loop=1;loop<50;loop++)
{
// isolo la proprieta e la memorizzo in ARRAY[LOOP]
array[loop]=strtok(NULL,"|");
if(array[loop]==NULL)
break;
printf("Proprieta %d: %s\n",loop,array[loop]);
// inserisco il valore della varie proprietà
PushLista(list, array[loop]);
}
printf("\n");
}


// Genera l'Albero della Tassonomia
AlberoTassonomia *GeneraAlbero(AlberoTassonomia *tree, char *dati, int figli, FILE *stream)
{
int temp; // serve a memorizzare il numero di figli di un nodo

if (tree==NULL)
{
// creo nodo radice
AlberoTassonomia *tree=(AlberoTassonomia *)malloc(sizeof(AlberoTassonomia));
// inserisco dati nodo
tree->categoria=separa(dati,0);
//tree->categoria=strtok(dati,"|");
printf("Inserisco Nodo: %s\n", tree->categoria);
printf("Numero figli: %d\n", figli);

// genera lista proprieta
RiempiListaProprieta(tree->proprieta,dati);

if (figli>0) //in realtà è IF (FIGLI>NULL)
{
// Aggiungo il primo figlio
AlberoTassonomia *nuovo=(AlberoTassonomia *)malloc(sizeof(AlberoTassonomia));
nuovo=NULL;
// Decremento il numero di figli rimanenti per questo nodo
figli=figli-1;
// Leggo le relative informazioni dal file
dati=freadline(stream);
// Richiamo la procedura collegando il figlio
temp=dati[strcspn(dati,"|")+1]-48;
tree->figlio=GeneraAlbero(nuovo, dati, temp, stream);
} else {
// Aggiungo il primo fratello
if (dati=freadline(stream))
{
AlberoTassonomia *nuovo=(AlberoTassonomia *)malloc(sizeof(AlberoTassonomia));
nuovo=NULL;

temp=dati[strcspn(dati,"|")+1]-48;
tree->fratelli=GeneraAlbero(nuovo, dati, temp, stream);
}
}
}
}


// Pulisce lo schermo
void clrscr()
{
system("cls");
}


// Main del progetto
int main()
{
char *dest;
int numeroletti, figliradice, scelta;
FILE *file;
AlberoTassonomia *albero=NULL;


/*
DEFINIZIONE MENU:
1) intestazione: Gestione Tassonomia
2) menu 1: Caricare tassonomia da file input
3) menu 2: Salvare tassonomia su file input
*/
clrscr();
printf("\t\t\tGestione Albero Tassonomia\n\n");
printf("\n1 - Inversione di una lista");
printf("\n2 - Uscita");
printf("\n\nInserire scelta: ");
scanf("%d",&scelta);

switch(scelta)
{
case 1:
{
/*
COME PROCEDERE:
1) Scrivere il menu
2) Leggere riga
3) Generare albero
*/
clrscr();
file=fopen("infile.txt","r");
if (file==NULL)
printf("Errore duranre l'apertura del file!");
else
{
// Legge il primo rigo del file
if(dest=freadline(file))
{
figliradice=dest[strcspn(dest,"|")+1]-48;

albero=GeneraAlbero(albero, dest, figliradice, file);
}
}
}
break; // fine CASE 1
default:
break;
} // fine SWITCH

printf("\n\n");
system("PAUSE");
return 0;
}


l'errore viene chiamato su queste righe (che sfruttano tutte la stessa funzione):

1) dest=freadline(file)
2) dati=freadline(stream)

questo è il tipo di errore:

C:\Documents and Settings\LeaderGL\Desktop\Progetto 1 LASD - Gruppo 18\main.c [Warning] assignment makes pointer from integer without a cast



questo è il codice della funzione in esame:

// Legge sempre un rigo intero dal file e ritorna il rigo letto
char *freadline (FILE *f)
{
char *row = NULL, *row_t = NULL;
int ch, rowlen = 0, buflen = 0;
int READLINE_EXTEND=128;

while ((ch = fgetc (f)) != EOF)
{
if (rowlen >= buflen)
{
buflen = rowlen+READLINE_EXTEND;
row_t = (char *) realloc (row, buflen);

if (row_t == NULL)
break;
}

row = row_t;

if (ch != '\n')
row[rowlen++] = (char) ch;
else
break;
}

if (row_t != NULL)
{
row[rowlen] = '\0';
}
else
{
free (row);
row = NULL;
}

return row;
}



perchè quest'errore esce solo ogni tanto?
come lo risolvo? che sto sbagliando?
sicuro qualcosa coi puntatori...........

help me............

andbin
16-01-2006, 10:05
l'errore viene chiamato su queste righe (che sfruttano tutte la stessa funzione):

1) dest=freadline(file)
2) dati=freadline(stream)

questo è il tipo di errore:
C:\Documents and Settings\LeaderGL\Desktop\Progetto 1 LASD - Gruppo 18\main.c [Warning] assignment makes pointer from integer without a cast

Dove hai dichiarato la freadline???? Se nel momento in cui il compilatore trova una chiamata a freadline e non conosce ancora il suo prototipo, può avvenire il warning indicato sopra. Se una funzione non è dichiarata, il compilatore "pensa" che ritorni, per default, un int. Da qui il warning perché dest e dati sono char*.

leadergl
16-01-2006, 14:34
sei un genio, grazie mille ;)