Newsgroup: it.comp.programmare.win32
Titolo: Problema di cacche (forse...=)

Ciao a tutti,
Ho compilato un programmino banale banale sotto WinXp, con Micro$oft
VC++.
Il programma si limita ad acquisire parole da un file e metterle in un
albero.
Tutto ok, il programma funziona. Ma solo entro un certo numero di
parole. Altrimenti esce e basta, interrompendo il processo.
Sapete come posso fare ad ampliare la cache a disposizione sotto Win?
Linux reagirebbe meglio? (Probabilmente la risposta a quest'ultima
domanda sara' si', ma se e' possibile preferirei non dover rinunciare
a Win =)
Vi ringrazio molto,
Byez,
--.
Alfaman, Alf Team
_.-^-._.-^-._.-^-._
|_.-^-._.-^-._.-^-._|


[CUT]
Mi sembra un po' strano... Quantificheresti il "certo numero di parole" ?
No, perchč io qualche mese fa ho scritto un programma piů o meno analogo al
tuo (solo che io ho usato una listview), e non ho avuto problemi nemmeno con
quasi 10k "parole"....
-Tharkas

parole. Altrimenti esce e basta, interrompendo il processo.
Sono d'accordo che i vari Windows siano ben lontani dalla perfezione
ma incolpare il s.o. per il crash di un proprio programma mi sembra un
po' forzato :-)
Nell'ordine:
Usi MFC ? Solo API ?
Hai fatto un minimo di debug ? Magari con BoundChecker che ti fa le
pulci su ogni singolo aspetto del programma ?
Come allochi i vari buffer ? dinamici con new/delete o a dimensione
fissa ?
etc etc.
Stefano "HappyMan" (Lago Maggiore - NO)
--
Personal Web 
http://www.sgr.info
Email happyman69 (at) 
libero.it

 Linux reagirebbe meglio?
DON'T FEED THE TROLL 
-- 
Luc.

-Tharkas
Grazie mille =)


Stefano "HappyMan" (Lago Maggiore - NO)
Byez,


 Linux reagirebbe meglio?
no, la stupidità umana vince sempre
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.3. C, C++ and ASM developers
                               and beta testers are welcome!

 
Incazzato nero questa sera!?! :-)
Un po' se le meritava ma non cosi' dure...
Ciao.
  -Ema-

correttezza
io no, ce lo metti online?
sbirish.

 Un po' se le meritava ma non cosi' dure...
oh, niente di personale. 9 volte su 10 sono pacata e ragionevole. Prega 
di non essere mai la decima persona, però



Non bisogna MAI essere sicuri di ciň che pensiamo essere sicuro!
Sicuramente c'č qualche parola che contiene caratteri speciali o spazi per
cui ti va in crash.
Creai una cosa simile con una treewiev e un database con circa 10MB di dati
e SIGNORI E SIGNORI si trattava di un implementazione in ASP, ed ha
(stranamente nel mondo Microsoft) funzionato benissimo e senza intoppi!
--------------------------------
Inviato via 
http://usenet.libero.it

di non essere mai la decima persona, perņ
Ma vai a ca**re..
Ho chiesto un consiglio, non una serie di insulti.
E la tua risposta non conteneneva nulla di utile.
Basta che la prossima volta ti limiti banalmente a non rispondere.
Preferisco.




Ve lo posto appena arrivo a casa, ma il problema non puo' essere di
caratteri speciali o simili...
Non mi esce con alcun errore...mi si chiude e basta il processo dopo
che gli ho somministrato il dizionario di 2 mega...Carica carica
carica, poi si chiude (solo il mio programma, non il VC++)....
Cmq ve lo mando, ma vi dovrei dare anche il dizionario per provarlo,
su file piccoli e medi funziona....
Tnx&


 per il Microsoft VC++?
Dipende cosa intendi con "cache", cosi` come l'hai scritto non significa
niente. Da Visual C++ puoi decidere quanta memoria allocare e riservare
per lo stack (il default mi sembra che sia 2 MB e 4 MB, ma non ricordo
bene). Ma a meno che tu non abbia fatto la stupidaggine di allocare un
array da quattro MB come variabile locale (o non usi funzioni ricorsive
che ricorrono qualche centinaia di migliaia di volte) non ti interessa,
perche` tutte le altre allocazioni vengono fatte nello heap di default,
che non ha un limite di dimensione (a parte gli ovvii limiti
architetturali di Windows, ossia perlomeno 2 GB).
-- 
Lorenzo

architetturali di Windows, ossia perlomeno 2 GB).
Allora non e' un problema del genere, grazie mille, non ne sapevo
nulla di come Win gestiva la memoria durante la
compilazione&esecuzione di un programma. Forse allora la parola cache
non centrava nulla ^__^
Perfetto =) Grazie


non centrava nulla ^__^
Non *centrava* il bersaglio o non *c'entrava* nell'argomento? ;-)
-- 
ciao, hal


wrote:

Eh, ma noi romani mergiamo le parole=)
Mi stupisco di aver scritto "centrava nulla" e non "uncentrava" =)


 Basta che la prossima volta ti limiti banalmente a non rispondere.
ho un'idea migliore: la prossima volta limitati a non chiedere


ho un'idea migliore: la prossima volta limitati a non chiedere
E allora creati un angolino tutto tuo, dove puoi parlare con i tuoi
animaletti invisibili....
E' uno spazio pubblico e non sono OT. E' un mio diritto chiedere e un
tuo non rispondere.
Ma quantomeno non mi venire a rompere le pa**e con insulti.


Ok...
il programma e' il seguente:
------------------------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct albero
{
	char word[100];
	int freq;
	struct albero *sx;
	struct albero *dx;
};
typedef struct albero *palbero;
void insert(char *parola, palbero *tree);
void stampa(palbero tree, FILE *out);
int main(int argv, char *argc[])
{
	char parola[100],c;
	FILE *in,*out;
	palbero tree=NULL;
	int i=0;
 
	if (argv!=2)
	{
		printf("Syntax error.\n");
		return 1;
	}
 
	in=fopen(argc[1],"r");
	if (in==NULL)
	{
		printf("File error.\n");
		return 1;
	}
 
	while((c=tolower(getc(in)))!=EOF)
	{
		if(isalpha(c))
			parola[i++]=c;
		else
		{
			parola[i]='\0';
			if(i>1)
				insert(parola,&tree);
			i=0;
		}
	}
	fclose(in);
	out=fopen("c:\\out.txt","w");
	stampa(tree,out);
	fclose(out);
	return 0;
}
void insert(char *parola,palbero *tree)
{
	if((*tree)==NULL)
	{
		*tree=malloc(sizeof(struct albero));
		strcpy((*tree)->word,parola);
		(*tree)->freq=1;
		(*tree)->sx=NULL;
		(*tree)->dx=NULL;
	}
	else if(strcmp((*tree)->word,parola)>0)
		insert(parola,&((*tree)->sx));
	else if(strcmp((*tree)->word,parola)<0)
		insert(parola,&((*tree)->dx));
	else if(strcmp((*tree)->word,parola)==0)
		(*tree)->freq++;
}
void stampa(palbero tree,FILE *out)
{
	if(tree!=NULL)
	{
		stampa(tree->sx,out);
		fprintf(out,"%s(%d)\n",tree->word,tree->freq);
		stampa(tree->dx,out);
	}
}
-------------------------------------------------------------------------------------------
Il dizionario che gli ho "dato in pasto ve lo uploado piu' tardi su un
sito, che occupa svariati mega =)
Ringrazio chiunque voglia darmi una mano =)


 
Le modifiche che ho apportato non le ho provato e potrei aver inserito 
qualche errore banale. Il compilatore eventualmente ti avvertira'.
Per il resto non vedo problemi.
Ciao.
  -Ema-
P.S.: Ti assicuro che dal tuo primo post non si capiva quasi nulla. Hai 
usato termini errati che potevano far pensare che tu fossi un troll. Non 
te la prendere troppo pertanto se qualcuno ti ha preso in giro.

		*tree=malloc(sizeof(struct albero));
e la free?
-- 
ciao, hal

te la prendere troppo pertanto se qualcuno ti ha preso in giro.
Mi dispiace. Non posto spesso nei ng e non mi ero reso conto. Staro'
piu' attento.


e la free?
Gia' ^_^ codice in fretta e furia, hai ragione ^_^


Il dizionario ve lo mando in giornata, lo uploado sul sito (sono quasi
4 Mb) Se vi va di provare ho utilizzato microsoft visual C++ 6.0
Grazie


};
Cosi' occupi gia' circa 100K per solo mille parole, io modificherei
cosi', piuttosto:
struct albero
{
	unsigned int 	lenWord;	// lunghezza della parola
	char 		*pWord;		// puntatore alla parola
	int 		freq;
	albero		*sx;
	albero		*dx;		
};
-- 
ciao, hal

};
Perche' utilizzare int lenWord?
Non e' piu' comodo, quando ti serve, utilizzare strlen(.....->pWord)?


 parola[i++]=c;
Sei sicuro che le righe siano sempre inferiori a 100 caratteri? Io
metterei un controllo. Se sfori vai a scrivere in strane, nuove zone di
memoria, la` dove nessun uomo e` mai giunto prima.
-- 
Lorenzo



Beh, la certezza matematica non la ho...cmq visto che di base
somministro al programma libri italiani, cosi' che possa "apprendere"
almeno le parole della lingua, credo sia altamente improbabile che ci
siano "parole" maggiori di 100 caratteri. Cmq un controllo ce lo
mettero', anche se questo e' solo un programma "introduttivo" di
banale fattura =)


Purtroppo nessun sito me lo accetta zippato....
Quindi se lo volete scaricare:
www.geocities.com/nunteodico/Dizionario2.txt
Vi prego fatemi sapere se anche a voi crasha.....


Invece ce l'ho fatta:
www.i.need.only.8k.com


 il programma e' il seguente:
per motivi indipendenti dalla mia volontà, sono affari tuoi. Compilato, 
eseguito con 3.6 MB di input ("1984" di Orwell ripetuto sei volte) e ha 
funzionato perfettamente. Oddio, escludendo i 6 MB di log di CodeGuard, 
che gentilmente fa notare che tutti gli 8879 malloc non hanno mai visto 
una free. Ho provato anche con un grosso (18.1 MB) file Postscript, non 
un lamento. E, dato che CodeGuard sostiene che la funzione getc è stata 
chiamata 19041685 volte (dimensione in byte del file), non si è nemmeno 
interrotto a metà strada. Tanto per andare sul sicuro, ho provato anche 
a limitare il più possibile le dimensioni massime dello stack, ma anche 
così continua a funzionare. Proprio per non lasciare nulla di intentato 
ho provato a ricavare il dizionario di qualche centinaio di migliaia di 
file, tra cui i sorgenti completi di ReactOS, ed ho finalmente ottenuto 
un crash, ma credo si trattasse semplicemente di memoria esaurita. Quel 
che potevo fare l'ho fatto


 principalmente se e' una richiesta di aiuto! Bah....
no, per piacere. Non accetto frasi come "Altrimenti esce e basta" in un 
newsgroup di programmazione. Da' tutto il diritto di sospettare che tu, 
in realtà, non abbia fatto *niente* per capire che succede, e speri che 
qualcuno, magicamente, intuisca il problema e, altrettanto magicamente, 
lo risolva ("Sapete come posso fare ad ampliare la cache...")



si riconosce proprio dappertutto la tua maleducazione
falla finita e torna in cucina e smettila di dare fastidio sui newsgroup

 lo risolva ("Sapete come posso fare ad ampliare la cache...")
no, un newsgroup ti da il diritto di rispondere oppure no,altrimenti stai
zitta e non rompi le scatole a mezzo mondo(quando l'argomento è IT)..
leggi il manifesto prima di sparare tutte queste ca..ate

Sfondi lo stack!
Gli dai in pasto un file gia' ordinato (Dizionario2.txt) e questo 
implica la realizzazione di un albero totalmente sbilanciato:
[ab]
   |-[abc]
       |-[acd]
           |- .....
A questo punto la funzione insert sfonda lo stack.
Dovresti tener conto del numero di iterazioni ed eventualmente scatenare 
un bilanciamento dell'albero.
Potresti anche memorizzare il puntatore all'ultima parola inserita in 
modo da partire da li' con l'inserimento. Ma che albero sarebbe allora? 
Tanto varrebbe fare una lista doppiamente concatenata. Ma non sarebbe 
piu' un dizionario.
Hai bisogno di una funzione di bilanciamento dell'albero altrimenti non 
ha senso.
Ciao.
  -Ema-




che potevo fare l'ho fatto
Ti ringrazio molto =) Scusami se ti ho risposto un po' bruscamente. Mi
e' chiaro che effettivamente ho lasciato intendere con il primo msg
cose che non desideravo...non volevo scatenare flame =)


  -Ema-


 falla finita e torna in cucina
non ti preoccupare, il tuo biberon arriverà sempre in orario


 Vi prego fatemi sapere se anche a voi crasha.....
no, funziona perfettamente. Con uno stack ridotto, però, va in overflow 
e crasha. E' la fregatura degli alberi non bilanciati. Cambia algoritmo 
o cambia implementazione



Capisco...effettivamente e' vero...non ci avevo pensato....


> non ti preoccupare, il tuo biberon arriverà sempre in orario
wow che battute.Ho anche letto quella che hai scritto su it.comp.lang.c++
(da gran signora)...
Sei fantastica... hai una classe che si nota subito :))

 Byez,
Ciao
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 [CUT]
Guarda che il thread era gia' chiuso con una soluzione!
Ciao.
  -Ema-