Newsgroup: it.comp.java
Titolo: Trovare l'errore

Ho scritto un programma che fa alcune operazioni
ciclando su k.
Ora, per k "piccoli" (diciamo fino a 1000) tutto funziona
bene mentre sopra 1000, ma a volte basta anche 900, dà errore
e ottengo, nella shell del dos, una sfilza interminabile di
  at nomeProg.nomefunz(nomeProg.java:linea)
In questo modo non riesco a capire cosa sia successo, cioè
potrebbe essere un out of memory oppure ho superato la
precisione di macchina o non so cos'altro.
Come potrei fare a trovare l'errore?
Grazie

Direi che postare il codice e l'errore potrebbe essere un buon inizio! :)



la tua funzione e' ricorsiva?
Se si, significa che all'ennesimo richiamo della funzione e' andata in 
errore. Sicuramente non e' una java.lang.StackOverflowError, altrimenti 
  vedresti solo una riga di errore.
Allunga il buffer della shell dos e cerca di trovare la prima riga dello 
StackTrace. Eventualmente quando lanci la classe redirigi l'output su 
file cosi' lo hai tutto a disposizione.
ciao
massimo

 Direi che postare il codice e l'errore potrebbe essere un buon inizio! :)
Beh non pretendo certo che qualcuno si metta a spulciare
500 righe codice che fanno operazioni tra un vettore e una
matrice.
Mi chiedevo solo come poter risalire ad una segnalazione
d'errore utile per capire che cosa succede.
Ciao

"ecciù" <non_...@rico.rdo> ha scritto nel messaggio
news:4360ee48$0$24650$4faf...@reader3.news.tin.it...

Questo è compito tuo, in genere si provano questi formuloni
a pezzi, e poi si mette insieme il tutto, i messaggi di
errore ahime credo siano un po come i messaggi di windows
quando si bloccano i programmi, ossia, privi di quel
significato che ti può portare rapidamente al perchè dello
stesso.

 file cosi' lo hai tutto a disposizione.
Si, è ricorsiva e aumentando il buffer si vede che è proprio un
java.lang.StackOverflowError
Exception in thread "main" java.lang.StackOverflowError
  at sun.nio.cs.SingleByteDecoder.<init>(Unknown Source)
  at sun.nio.cs.MS1252$Decoder.<init>(Unknown Source)
  at sun.nio.cs.newDecoder.<init>(Unknown Source)
  at sun.nio.cs.StreamDecoder$CharsetSD.<init>(Unknown Source)
  at sun.nio.cs.StreamDecoder.forInputStreamReader(Unknown Source)
  at java.io.InputStreamReader.<init>(Unknown Source)
  at javagently.Text.open(Text.java:41)
e poi parte con la sfilza di
  at nomeProg.nomefunz(nomeProg.java:linea)
Se può servire la linea è quasi sempre la stessa, cioè quella in
cui la funzione ricorsiva si richiama.
Soluzioni? (se ci sono... e spero tanto ci siano!!)
Grazie tante

 Soluzioni? (se ci sono... e spero tanto ci siano!!)
In questi casi e' quasi sempre un problema di codice non corretto
che non esce mai dalla ricorsione.
Se invece hai semplicemente troppe chiamate ricorsive che consumano
tutto lo spazio di stack del thread, puoi aumentare il valore di default
utilizzando il parametro della JVM -Xss
Ciao
Roberto

 
se e' uno StackOverflow significa che ha fatto troppe chiamate 
ricorsive; immagino quindi che ci sia un errore nel codice, ma senza 
vederlo e' un po' difficile
massimo



uhm... vedo che verso il top dello stack entra in qualche altra classe
(javagently.Text.open) per poi proseguire verso il runtime standard...
quindi c'è qualche condizione che dovrebbe "sbloccare il tutto" ma non lo fa
correttamente. Non è che per caso hai un loop "while" e che nella verifica
della condizione richiami la tua stessa funzione?
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx/
 - 
http://www.xenu.net/
(per rispondere personalmente leva IlDitoDalCulo)

Visto che propendete quasi tutti per l'errore nel codice
mi armerò di pazienza e lente d'ingrandimento e ricontrollerò
tutto... come se invece finora fosse andato tutto liscio :)
Comunque quasi quasi preferisco così perché se 1000 è già
un valore critico sono messo male: avrei bisogno che arrivasse
_almeno_ a 10000!
Per curiosità: l'opzione -Xss nell'help non viene riportata,
come andrebbe usata? ss sono megabite o cosa?
Grazie a tutti

 Comunque quasi quasi preferisco così perché se 1000 è già
...se 1000 FOSSE... !!!
Scusate ma non si poteva vedere

 come andrebbe usata? ss sono megabite o cosa?
Dipende dal valore che ci imposti:
-Xss64k  (usa 64K)
-Xss2m   (usa 2M)
ecc...
Comunque la documentazione c'e': basta lanciare l'interprete
java con la sola opzione -X (si tratta di opzioni non standard
e dipendenti dalla implementazione del jdk).
E cose si fa a sapere che bisogna usare l'opzione -X?
Basta leggere la documentazione dei tools, che viene distribuita con il JDK!
[Per quello Sun si trova in <jdk docs install dir>/tooldocs/tools.html]
Ciao!
Roberto

 iterazione (operazione sempre possibile!)
Non no, forse mi sono spiagato male.
Il ciclo for deve arrivare a 10000, il numero di iterazioni
č molto minore, anche se cresce al crescere di k.
Con k=10000 mi attendo un centinaio di iterazioni, non di piů.
Grazie ancora e buona serata

 ha scritto nel
messaggio
| news:djr2eg$v87$1...@area.cu.mi.it...
|
| Non no, forse mi sono spiagato male.
| Il ciclo for deve arrivare a 10000, il numero di
iterazioni
| è molto minore, anche se cresce al crescere di k.
| Con k=10000 mi attendo un centinaio di iterazioni, non di
più.
Scusa, ma non puoi pretendere una risposta con delle
indicazioni come quelle che dai, troppo generiche non credi?
Devi postare il codice, o almeno la parte di esso sospetta,
e siccome immagino che qui matematici ingegneri e fisici
non manchino, credo che una rispostina la riceveresti
sicuramente!


Se la funzione è ricorsiva puoi mettere una variabile che viene incrementata
ogni volta che richiami la funzione. Stampi la variabile a video e vedi che
livelli raggiunge. Poi se vuoi fare un po' di calcoli puoi vedere se il
numero di livelli è effettivamente quello che ti aspetti.
Faccio un esempio, se tratti una matrice puoi sapere fin da subito quante
chiamate la funzione farà, dato che dipende dalla dimensione e dalla
funzione richiesta.
Per fare un altro esempio, una funzione fattoriale sarà chiamata esattamente
n volte.

Due domande:
1) k è int? Perchè se non lo è, incrementandolo anche se con interi,
rischi che ad un certo punto invece di avere k == 1000 tu abbia
k==1000,00000000000001
2) Siccome dici che anche se k deve arrivare a 10.000 le iterazioni
sono solo un centinaio, ne deduco che incrementi k dentro al ciclo. Non
è che la condizione di uscita è per == anzichè >?

 è che la condizione di uscita è per == anzichè >?
Il ciclo k è esterno e aggiunge numeri casuali ad un vettore.
In determinate condizioni il vettore va "sistemato" e viene chiamata
la funzione ricorsiva che certamente fa tante più ricorsioni quanto
più è grande k, ma il numero di ricorsioni verosimilmente cresce in
maniera logaritmica, e non lineare, con k.
Grazie dell'interessamento.
Troverò l'errore maledetto... a costo di dover spulciare l'output
riga per riga!!

Se per caso per "sistemare". intendi "sortare", hai pensato di usare la
classe Arrays?

Spero di aver risolto!
Detto "alla Excel" c'era un riferimento circolare tra
due istanze di un oggetto che mandava in loop il programma.
Grazie ancora a tutti
Ciao