Erreur bad access

Signaler
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014
-
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014
-
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

Messages postés
14817
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2020
92
Hello,
J'ai édité ton message pour mettre les balises code. Plus d'infos ici

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

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
Messages postés
14817
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2020
92
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 ...
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

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)
Messages postés
14817
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2020
92
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 ...
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

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
Messages postés
14817
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2020
92
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 ...
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

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 ?
Messages postés
3818
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
23 septembre 2020
112
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
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

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
Messages postés
3818
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
23 septembre 2020
112
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
Messages postés
7
Date d'inscription
lundi 10 février 2014
Statut
Membre
Dernière intervention
11 février 2014

non je ne le prends pas, au contraire toute remarque est là bienvenu ça me permettra d'apprendre plus.