Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Try Catch
Forum - C# / VB.NET - Try Catch - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
air (Normal User)
Newbie


Messaggi: 14
Iscritto: 23/04/2011

Segnala al moderatore
Postato alle 21:38
Domenica, 24/04/2011
Purtroppo ho provato come dici ma non va nemmeno!

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 12:20
Lunedì, 25/04/2011
Un'eccezione di quel tipo viene generata quando lo stack si riempie oltre i limiti consentiti a causa della chiamata nidificata senza controllo di metodi. Tuttavia in questo codice non c'è nessuna chiamata a funzione di questo tipo, a meno che vet non sia una matrice ma una funzione (e in quel caso comunque dovrebbe segnalare l'eccezione su una riga diversa). Cionondimeno, l'uso di "Fdix =", ancorché compilato esattamente allo stesso modo di una Return, mi lascia un po' di amaro in bocca.
Te lo hanno suggerito più volte, ma non mi sembra che tu abbia modificato il codice con una Return.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:59
Lunedì, 25/04/2011
StackOverflowException può essere lanciata anche in seguito all'assegnazione a una variabile di un valore troppo grande.
Il problema potrebbe incorrere perchè il valore sommatoria è troppo grande, probabilmente perchè non dichiari il tipo della funzione
Codice sorgente - presumibilmente VB.NET

  1. Function Fdix(ByVal x As Single)
  2.         Dim sommatoria As Single
  3.         Dim cont As Integer
  4.         For cont = 0 To grado
  5.             sommatoria = sommatoria + (vet(cont, 0) * (x ^ (vet(cont, 1))))
  6.         Next
  7.         acu += 1
  8.         Try
  9.             Fdix = sommatoria
  10.         Catch ex As System.StackOverflowException
  11.             MsgBox(ex.Message)
  12.         End Try
  13.     End Function


la variabile sommatoria rischia di diventare enormemente grande!
Quindi ti dò un paio di consigli:
1. Dichiara sempre il tipo della funzione
2. Utilizza Double invece di Single (supporta numeri più grandi)
3. Usa Return invece di Fdix =

L'unico dubbio rimane perchè non ti gestisca l'eccezione... forse per la natura stessa dell'eccezione? Non saprei :pat:

Codice sorgente - presumibilmente VB.NET

  1. Function Fdix(ByVal x As Double) as Double
  2.         Dim sommatoria As Double
  3.         Dim cont As Integer
  4.         Try
  5.             For cont = 0 To grado
  6.                 sommatoria += (vet(cont, 0) * (x ^ (vet(cont, 1))))
  7.             Next
  8.             acu += 1
  9.             Fdix = sommatoria
  10.         Catch ex As System.StackOverflowException
  11.             MsgBox(ex.Message)
  12.         End Try
  13.     End Function



PM Quote
Avatar
air (Normal User)
Newbie


Messaggi: 14
Iscritto: 23/04/2011

Segnala al moderatore
Postato alle 22:52
Lunedì, 25/04/2011
Seguendo i vostri consigli (o con il return o senza) mi da questo errore adesso:

An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll

Codice sorgente - presumibilmente VB.NET

  1. Function Fdix(ByVal x As Double) As Double
  2.         Dim sommatoria As Double
  3.         Dim cont As Integer
  4.         Try
  5.             For cont = 0 To grado
  6.                 sommatoria = sommatoria + (vet(cont, 0) * (x ^ (vet(cont, 1))))
  7.             Next
  8.  
  9.             Return sommatoria
  10.  
  11.         Catch ex As System.StackOverflowException
  12.             MsgBox("Si è verificato un errore: " & ex.Message)
  13.         End Try
  14.     End Function


PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:27
Martedì, 26/04/2011
Testo quotato

Postato originariamente da Qwertj:

StackOverflowException può essere lanciata anche in seguito all'assegnazione a una variabile di un valore troppo grande.
Il problema potrebbe incorrere perchè il valore sommatoria è troppo grande, probabilmente perchè non dichiari il tipo della funzione



No, quella è OverflowException. StackOverflowException si riferisce solo a un numero eccessivo di chiamate a funzione.

A proposito, perché non ci dai anche il resto del codice? Così possiamo simulare l'eccezione con i valori esatti di vect e x...

PM Quote
Avatar
air (Normal User)
Newbie


Messaggi: 14
Iscritto: 23/04/2011

Segnala al moderatore
Postato alle 12:59
Martedì, 26/04/2011
postare tutto il codice è un pò un casino, xkè ho tante funzioni e i valori di vet di x arrivano da una procedura che fa in parcing della stringa per acquisire la funzione...

La funzione Fdix calcola il valore della funzione acquisita nel punto x che riceve come parametro. Vet di x è una matrice che contiene esponente e coeff di tutti i termini della funzione.
Penso sia difficile ch l'errore sia causato da vet di x perchè contiene numeri interi e anche piccoli perchè non usiamo grandi coefficienti.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 15:09
Martedì, 26/04/2011
Testo quotato

Postato originariamente da Il Totem:

Testo quotato

Postato originariamente da Qwertj:

StackOverflowException può essere lanciata anche in seguito all'assegnazione a una variabile di un valore troppo grande.
Il problema potrebbe incorrere perchè il valore sommatoria è troppo grande, probabilmente perchè non dichiari il tipo della funzione



No, quella è OverflowException. StackOverflowException si riferisce solo a un numero eccessivo di chiamate a funzione.



Ah ok... è che lo stack overflow si verifica anche in quel caso no?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:11
Mercoledì, 27/04/2011
Testo quotato

Postato originariamente da Qwertj:
Ah ok... è che lo stack overflow si verifica anche in quel caso no?



No, l'overflow di un'operazione aritmetica è generato dalla presenza di un bit settato in uno dei registri di stato della ALU. La memoria non prende parte nel calcolo.

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo