IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

ArgumentOutOfRangeException was unhandeled


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut ArgumentOutOfRangeException was unhandeled
    Bonjour à tous,

    J'aurais besoin d'aide pour ce bout de code en C#. le code compile mais lors de l'execution le code s'arrete à la ligne avec comme message d'erreur "ArgumentOutOfRangeException was unhandeled". Pourriez-vous me dire pourquoi?

    Merci par avance!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static double BinomialTree(double S0, double K, double r, double Vol, double T, int nbrPeriods)
            {
                double Price = 0.0;
                double dt = T / nbrPeriods;
                double u = Math.Exp(Vol * dt);
                double d = 1 / u;
                double P = (Math.Exp(r * dt) - d) / (u - d);
                List<double> nodeVec = new List<double>();
                List<double> TempVec = new List<double>();
     
                for (int i = 0; i <= nbrPeriods; i++)
                {
                    double S = S0 * Math.Pow(u, i) * Math.Pow(d, nbrPeriods - i);
                    double tempPayOff = Math.Max(S - K, 0);
                    nodeVec.Add(tempPayOff);
                }
     
                for (int i = nbrPeriods; i >= 1; i--)
                {
                    for (int j = 0; j < i; j++)
                    {
                        double node = Math.Exp(-r * dt) * (P * nodeVec[j] + (1 - P) * nodeVec[j + 1]);
                        TempVec.Add(node);
                    }
                    nodeVec.Clear();
                    nodeVec = TempVec;
                    TempVec.Clear();
                }
     
                Price = nodeVec[0];
                return Price;
            }
            static void Main(string[] args)
            {
                double r = BinomialTree(100, 80, 0.03, 0.3, 1, 1);
                Console.WriteLine(r);
            }
        }
    }

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Ton problème est ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    nodeVec = TempVec;
                    TempVec.Clear();
    nodeVec référence la même zone mémoire que TempVec.
    Puis tu clear TempVec, donc tu clear nodeVec puisqu'ils référencent la même zone mémoire.

    Regarde le lien dans ma signature sur "la mémoire en .net - ...
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par rv26t Voir le message
    Bonjour,

    Ton problème est ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    nodeVec = TempVec;
                    TempVec.Clear();
    nodeVec référence la même zone mémoire que TempVec.
    Puis tu clear TempVec, donc tu clear nodeVec puisqu'ils référencent la même zone mémoire.

    Regarde le lien dans ma signature sur "la mémoire en .net - ...
    Bonjour,

    Merci pour ta réponse. donc ce n'est plus comme en C++, je pensais que chaque vecteur avait une adresse distincte dans la mémoire lors des déclarations. Quelle serait la solution dans ce cas?

    Merci encore!

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Ben, il y a bien une référence (d'adresse) distincte à ta déclaration, mais tu fais
    donc tu donnes l'adresse de TempVec à nodeVec. Après cette affectation, TempVec et nodeVec référence la même adresse mémoire. (suit en debug en mettant les 2 variables liste en espion)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // ...
                for (int i = nbrPeriods; i >= 1; i--)
                {
                    for (int j = 0; j < i; j++)
                    {
                        double node = Math.Exp(-r * dt) * (P * nodeVec[j] + (1 - P) * nodeVec[j + 1]);
                        TempVec.Add(node);
                    }
                }
                return TempVec[0];
            }
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par JasBeckC Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                for (int i = nbrPeriods; i >= 1; i--)
                {
                    for (int j = 0; j < i; j++)
                    {
                        double node = Math.Exp(-r * dt) * (P * nodeVec[j] + (1 - P) * nodeVec[j + 1]);
                        TempVec.Add(node);
                    }
                    nodeVec.Clear();
                    nodeVec = TempVec;
                    TempVec.Clear();
                }
                Price = nodeVec[0];
                return Price;
    Je n'ai pas analysé ton algo, mais d'après moi il y a un souci.
    1 - au premier passage tu clear une variable à la fin de ta boucle 1 (avant de repartir pour un tour), variable que tu utiliseras dans les tours de boucle suivant dans la deuxième boucle imbriquée (s'il y a plusieurs tours ; dans le cas ou "nbrPeriods > 1") donc plantage.
    2 - à la fin tu ne récupéres que le premier élément - pour quoi faire une boucle ?
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

Discussions similaires

  1. DataGridView: ArgumentOutOfRangeException was caught
    Par Jinkas dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/07/2013, 11h09
  2. Réponses: 4
    Dernier message: 19/07/2004, 14h52
  3. Réponses: 8
    Dernier message: 19/07/2004, 14h34
  4. [Génération] The dialect was not set
    Par sylvain_neus dans le forum Hibernate
    Réponses: 8
    Dernier message: 17/03/2004, 10h57
  5. requested URL /forms90/f90servlet was not found
    Par Aeternus dans le forum Oracle
    Réponses: 11
    Dernier message: 03/02/2004, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo