Erreur bad access

Kellog
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014
- Modifié par BunoCS le 10/02/2014 à 11:43
Kellog
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014
- 11 févr. 2014 à 18:25
Bonjour,
Bonsoir,

J'essaie de réaliser un tp et le code que j'ai écrit compile bien (a priori) mais à chaque fois que je veux lancer le programme, il m'affiche cette erreur : thread 1 exc_bad_access (code=1 address=0x0)

Etant débutant sur c++, je ne sais pas comment l'interpréter...quelqu'un pourrait-il m'aider svp ?

Voilà un bout de code ou le message s'affiche : c'est la dernière ligne...

void Test_Avec_Variable_Controle(int N, double K)
{
    Aleatoire A;
    double r=0.05;
    double T = 1;
    int d=10;
    double rho=0.5;
    double sigma=0.3;
    double S=100;
    double RHO[d][d];
    for (int i(0); i<d; i++)
    {
        for (int j(0); j<d; j++)
        {
            if (j!=i) 
            {
                RHO[i][j] = rho;
            }
            else
            {
                RHO[i][j] = 1 ;
            }
        }
    }
    double Gamma [d][d];
    for (int i(0); i<d; i++)
    {
        for (int j(0); j<d; j++)
        {
            Gamma[i][j] = pow(sigma,2)*RHO[i][j];
        }
    }

//fabrication de la matrice Sigma

//Sigma=sqroot(Gamma);

    vector<vector<double> > C(d, vector<double> (d));
    for (int i(0); i<d; i++)
    {
        for (int j(0); j<d; j++)
        {
            C[i][j] = Gamma[i][j];
        }
    }
    vector<vector<double> > Sigma = Cholesky(C);
    double a=(1/d);
    vector<double> I_0 (N);
    vector<vector<double> > MatS_0(d, vector<double> (N));
    for (int i(0); i<d; i++)
    {
        for (int j(0); j<N; j++)
        {
            if (i==j) 
            {
                MatS_0[i][j] = S;
            }
            else
            {
                MatS_0[i][j] = 0;
            }
        }
    }    
    I_0 = A.PrixCallSurIndice(MatS_0,a);
    vector<vector<double> >  S_T(d, vector<double> (N));
    S_T = A.PrixActifs(T, N, Sigma,sigma, S, r);
    vector<double> I_T(N);
    I_T = A.PrixCallSurIndice(S_T, a);
    vector<double> W(N);
    W=A.PayoffCall(S_T,K,a);
    vector<double> payoff(N);
    for (int i(0); i<N; i++) 
    {
        payoff[i]=exp(-r*T)*W[i] - I_T[i];
    }

.....

12 réponses

BunoCS
Messages postés
15256
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
17 mai 2022
103
10 févr. 2014 à 10:41
Hello,
J'ai édité ton message pour mettre les balises code. Plus d'infos ici

Pour ton problème, ça donne quoi en debug?
0
Kellog
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

10 févr. 2014 à 10:57
Merci pour les balises code. Au fait quand je le compile et que je le lance il me sort : "build succeeded" mais il me souligne la dernière ligne du bout que j'ai copié en vert avec le message d'erreur thread 1 exc bad access
0
BunoCS
Messages postés
15256
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
17 mai 2022
103
Modifié par BunoCS le 10/02/2014 à 11:05
Au fait quand je le compile et que je le lance il me sort : "build succeeded"
"Compiler" ne veut pas dire "Fonctionner" jeune Padawan :D

bad access
veut dire que tu essaies d'accéder à quelque chose qui n'existe pas: variable non initialisée, index en dehors d'un tableau/vecteur/liste, etc.
Regardes par exemple si W et /ou I_T ne sont pas NULL.

que j'ai copié en vert
Pas vu...

Quelques conseils:
- utilises des noms de variable parlants
- "abuses" des commentaires, c'est super pratique

@+
Buno, Modo CS-CCM
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
The urgent is done, the impossible is underway. For miracles, envisage a time ...
0
Kellog
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

10 févr. 2014 à 11:30
Je voulais attendre que ça fonctionne pour mettre tous les commentaires ( c'est un projet que je dois rendre )...
Comment verifier qu'ils ne sont pas NULL ? (j'avais vérifier pour les index à cause d'un autre problème similaire que j'ai pu résoudre)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS
Messages postés
15256
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
17 mai 2022
103
Modifié par BunoCS le 10/02/2014 à 11:36
Je voulais attendre que ça fonctionne pour mettre tous les commentaires ( c'est un projet que je dois rendre )...
C'est ce que l'on dit toujours, mais soit on a la flemme, soit on a pas le temps de le faire. Un bon réflexe est de commenter son code au fur et à mesure .

Comment verifier qu'ils ne sont pas NULL
if (W != NULL && W.size() != 0) {
//...
}

Le 1er test va tester la validité de ta variable. Le 2nd vérifie qu'il y a bien des éléments dedans.

@+
Buno, Modo CS-CCM
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
The urgent is done, the impossible is underway. For miracles, envisage a time ...
0
Kellog
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

Modifié par Kellog le 10/02/2014 à 11:58
Merci pour le conseil.
J'ai mis une constante à la place de la formule de payoff (j'ai mis zéro) et là ça m'affiche un résultat ça confirme ce que le problème vient de W...
Pour le premier test de l'instruction que tu m'as donnée, c'est affiché : invalid operands to binary expression ( vector... And long)
Mais la deuxième instruction est confirmée W.size() = 0
0
BunoCS
Messages postés
15256
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
17 mai 2022
103
Modifié par BunoCS le 10/02/2014 à 11:58
Donc voilà. Il faut que tu regardes pourquoi ta méthode
A.PayoffCall(S_T,K,a)
ne retourne rien.

@+
Buno, Modo CS-CCM
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
The urgent is done, the impossible is underway. For miracles, envisage a time ...
0
Kellog
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

10 févr. 2014 à 12:27
Grâce à tes instructions je pense avoir trouvé mon erreur....
Quand je créé vector<vector<double> > A;
Si je fais A.size() ça me retourne le nombre de lignes x le nombre de colonnes ?
0
cptpingu
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
Modifié par cptpingu le 10/02/2014 à 13:38
Bonjour.

Je viens ajouter ici quelques conseils classiques:
- Évite absolument les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- On préfère 0 à NULL (ou mieux nullptr), voir: http://0217021.free.fr/portfolio/axel.berardino/articles/null-en-cpp
- Quand on utilise un std::vector, on préfère utiliser les "iterators" plutôt que d'utiliser des bornes fixes à l'arrache (justement pour éviter les problèmes que tu rencontres en ce moment).
Ceci:
    std::vector<double> tab;
    for (int i = 0; i < d; ++i)
     std::cout << tab[i] << std::endl;

peut être remplacé par:
    std::vector<double> tab;
    for (std::vector<double>::iterator it = tab.begin(); it != tab.end(); ++it)
     std::cout << *it << std::endl;

Néanmoins, ce problème peut aussi être évité en regardant la taille du tableau via le ".size()", comme l'a très justement souligné Buno.

Si je fais A.size() ça me retourne le nombre de lignes x le nombre de colonnes ?
Ça te retourne le nombre d'éléments dans A, donc le nombre de sous tableau que possède A. Ça ne te donne pas la taille des sous tableaux.
Soit tu sais que c'est une matrice carré, et tu fais "A.size() * A.size()", soit tu regardes dans ta boucle, si le sous tableau est de la bonne taille au moment ou tu le parcours. Si on consièdre que chaque sous tableau a une taille égale, alors tu peux faire "A.size() * A[0].size()".

__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
Kellog
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

10 févr. 2014 à 22:57
merci beaucoup pour vos conseils, j'ai pu terminer mon projet...le seul bémol est qu'il prend beaucoup de temps pour les gros calculs (je ne peux même pas attendre un résultat) et pourtant mon pc est assez puissant...peut être un probleme avec Xcode...J'essayerai sur une autre machine pour vérifier.
Merci encore et bonne soirée
0
cptpingu
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
11 févr. 2014 à 10:29
le seul bémol est qu'il prend beaucoup de temps pour les gros calculs (je ne peux même pas attendre un résultat) et pourtant mon pc est assez puissant...peut être un probleme avec Xcode...J'essayerai sur une autre machine pour vérifier.

Ce n'est ni un problème avec Xcode, ni un problème de PC. C'est tout simplement un problème d'algorithmie. Au vu du code posté (on voit clairement que tu débutes), il y a de forte chance que ça vienne de la technique utilisée.
Je ne dis pas ça pour t'embêter, ou te rabaisser, mais pour t'éviter de passer du temps sur des pistes qui ne sont pas bonnes.

__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
Kellog
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

11 févr. 2014 à 18:25
non je ne le prends pas, au contraire toute remarque est là bienvenu ça me permettra d'apprendre plus.
0