Newsgroup: it.comp.lang.c
Titolo: liste

Ho fatto un piccolo programma che legge un file di testo, e carica i
dati letti in una lista. Ogni nodo della lista e' una struttura
(grande circa 1100 byte), con relativo link al nodo successivo. Il
problema del caricamento e' che quando tento di caricare oltre 50
record, si blocca, questo pero' solo su sistemi Windows 98, mentre su
Windows NT carica correttamente. Tra l'altro questo programma dovra'
girare su un terminale di codici a barre che usa un sistema DOS 6.22,
per cui penso che non riusciro' a farlo girare. Qualcuno ha idea da
cosa possa dipendere? Grazie.
Giuseppe

...

Non specifichi che compilatore usi ma credo che sia a 16 bit...
a prima vista sembra un collasso di memoria che però NT riesce a
correggere in qualche modo,
questo SO non l'ho mai usato ma ho sentito dire che difficilmente da
problemi perciò deduco si corregga da solo i problemi dovuti ad una
cattiva gestione di memoria.
by duido

gge...@numera.it
 (Giuseppe) wrote in 
news:844af827.02091...@posting.google.com
:

A occhio sembra un problema di gestione memoria. In prima istanza, 
verificherei se nell'ambiente finale riesci a lavorare tutto in memoria (ci 
sono limiti che comunque si possono aggirare); in caso positivo ti 
sconsiglio vivamente di allocare le singole strutture in memoria, bensì 
dovresti allocare un unico blocco e giocare con i puntatori. E' buona 
pratica in generale, e dai una mano a quel pirla di win9x a non incartarsi 
:-)

 Se non posti il codice dubito che qualcuno possa aiutarti...
Eccolo... (un po' lungo):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <alloc.h>
#include <ctype.h>
typedef struct {
	char Codice[10];
	char Matricola[31];
	char CBarre[31];
	char DataAtt[11];
	char Indirizzo[61];
	char Numero[11];
	char Ubicazione[1001];
	char UltimaLettura[10];
	char DataUL[11];
	char LetturaAttuale[10];
	char DataLA[11];
	struct Contatore *CLink;
} Contatore;
Contatore * AddItem(Contatore * listpointer, char * cod, char * matr,
char * codb, char * dtatt, char * ind, char * num, char * ubi, char *
ul, char * dtul);
main()
{
   char c;
	char *result;
   	int buffer,counter,i,j = 1;
	char buffer1[1187];
	char codice[10];
	char lettura[10];
	char data[11];
 
	char matricola[31];
	char codice_barre[31];
	char data_attivazione[11];
	char indirizzo[61];
	char numero_civico[11];
   	char ubicazione[1001];
	char ultima_lettura[10];
	char data_ultima_lettura[11];
	char lettura_attuale[10];
	char data_lettura_attuale[11];
   	FILE *filein, *fopen();
	Contatore *listpointer;
	listpointer = NULL;
 		printf("\nImport dati\n");
	 		filein = fopen("ContExp","r");
	 		if (filein == NULL)
	 		{
	    		printf("Errore lettura file\n");
	 		}
	 		else
	 		{
		 		counter = 0;
	    		/* ciclo di lettura del file */
	    		while ((result = fgets (buffer1, 1187, filein)) != NULL)
	    		{
		    		for (i = 0;i <= 8;i++)
			   		codice[i] = buffer1[i]; 	
          			codice[9] = '\0';
		    		for (i = 0;i <= 29;i++)
			   		matricola[i] = buffer1[i+9]; 	
          			matricola[30] = '\0';
		    		for (i = 0;i <= 29;i++)
			   		codice_barre[i] = buffer1[i+39]; 	
          			codice_barre[30] = '\0';
		    		for (i = 0;i <= 9;i++)
			   		data_attivazione[i] = buffer1[i+69]; 	
          			data_attivazione[10] = '\0';
		    		for (i = 0;i <= 59;i++)
			   		indirizzo[i] = buffer1[i+79]; 	
          			indirizzo[60] = '\0';
		    		for (i = 0;i <= 9;i++)
			   		numero_civico[i] = buffer1[i+139]; 	
          			numero_civico[10] = '\0';
		    		for (i = 0;i <= 999;i++)
			   		ubicazione[i] = buffer1[i+149]; 	
          			ubicazione[1000] = '\0';
		    		for (i = 0;i <= 8;i++)
			   		ultima_lettura[i] = buffer1[i+1149]; 	
          			ultima_lettura[9] = '\0';
		    		for (i = 0;i <= 9;i++)
			   		data_ultima_lettura[i] = buffer1[i+1158]; 	
          			data_ultima_lettura[10] = '\0';
			 		listpointer = AddItem(listpointer, codice, matricola,
codice_barre, data_attivazione, indirizzo, numero_civico, ubicazione,
ultima_lettura, data_ultima_lettura);
			 		printf("Record %d caricato\n",j++);
	    		}
		 		printf("Caricamento terminato\n");
	 		}
	 		fclose(filein);
}
Contatore * AddItem(Contatore * listpointer, char * cod, char * matr,
char * codb, char * dtatt, char * ind, char * num, char * ubi, char *
ul, char * dtul)
{
	Contatore * lp = listpointer;
	if (listpointer != NULL)
	{
		while (listpointer -> CLink != NULL )
			(struct Contatore *) listpointer = listpointer -> CLink;
		(struct Contatore *) listpointer -> CLink = (struct Contatore *)
malloc (sizeof(Contatore));
		(struct Contatore *) listpointer = listpointer -> CLink;
		listpointer -> CLink = NULL;
		strcpy(listpointer -> Codice,cod);
		strcpy(listpointer -> Matricola,matr);
		strcpy(listpointer -> CBarre,codb);
		strcpy(listpointer -> DataAtt,dtatt);
		strcpy(listpointer -> Indirizzo,ind);
		strcpy(listpointer -> Numero,num);
		strcpy(listpointer -> Ubicazione,ubi);
		strcpy(listpointer -> UltimaLettura,ul);
		strcpy(listpointer -> DataUL,dtul);
		strcpy(listpointer -> LetturaAttuale,"");
		strcpy(listpointer -> DataLA,"");
		return lp;
	}
	else
	{
		(struct Contatore *) listpointer = (struct Contatore *) malloc
(sizeof(Contatore));
		(struct Contatore *) listpointer -> CLink = NULL;
		strcpy(listpointer -> Codice,cod);
		strcpy(listpointer -> Matricola,matr);
		strcpy(listpointer -> CBarre,codb);
		strcpy(listpointer -> DataAtt,dtatt);
		strcpy(listpointer -> Indirizzo,ind);
		strcpy(listpointer -> Numero,num);
		strcpy(listpointer -> Ubicazione,ubi);
		strcpy(listpointer -> UltimaLettura,ul);
		strcpy(listpointer -> DataUL,dtul);
		strcpy(listpointer -> LetturaAttuale,"");
		strcpy(listpointer -> DataLA,"");
		return listpointer;
	}
}

 correggere in qualche modo,
Non ne ho idea, ed inoltre essendo questa la mia prima vera esperienza
con il C, molte cose mi sfuggono.
Ciao
Giuseppe
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it