Bonjour,
J'ai une classe Coefficient d'une part. Elle possède des tenseurs (<vector <vector< vetor double>>> C,S et V, et des méthodes:
- constructeur-> initialise C et S
- readfile-> rempli C et S
- calcul_potentiel-> initialise et rempli V à l'aide de C et S
- calcul_potentiel_paire-> initialise et rempli V à l'aide de C et S
- calcul_potentiel_impaire-> initialise et rempli V à l'aide de C et S
- draw()

D'autre part j'ai ma classe mainwindow avec différents onglets, boutons et
des slots. Et il y a certain slots que j'arrive pas à faire marcher
Ce que j'ai fait:
-chargement()-> appelle le constructeur de Coefficient et redfile()
- potentiel()-> appelle calcul_potentiel() et draw()
- potentiel_paire()-> appelle calcul_potentiel_paire() et draw()
de même pour potentiel impaire.

J'ai défini 2 pointeurs CoefficientEGM * egm_model; etCoefficientGRACE * grace_model pour pouvoir utiliser les attributs et méthodes de CoefficientXXX dans mainwindow. Mais lorsque j'execute mon script, j'ai une fermeture prématurée de mon application.
Avec ceci comme message (extrait):
"*** Error in `/home/marie/qt_project/build-essai-Desktop-Debug/essai': free(): invalid pointer: 0x000000000042feca ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x80a46)[0x7f2a6d203a46]
...
/home/marie/qt_project/build-essai-Desktop-Debug/essai[0x4166a4]
/home/marie/qt_project/build-essai-Desktop-Debug/essai[0x4154c4]
var/cache/fontconfig/e0aa53bcfa504e64f87823c16bc01eb6-le64.cache-3
7f4486774000-7f4486777000 r--p 00000000 08:05 4990437
/usr/share/locale-langpack/fr/LC_MESSAGES/atk10.mo
7f4486777000-7f4486786000 r--p 00000000 08:05 4990326
/usr/share/locale-langpack/fr/LC_MESSAGES/gtk20.mo
7f4486786000-7f448678d000 r--s 00000000 08:05 4855962
/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7f448678d000-7f4486790000 rw-p 00000000 00:00 0
7f4486790000-7f4486791000 r--p 00022000 08:05 131602
/lib/x86_64-linux-gnu/ld-2.17.so
7f4486791000-7f4486793000 rw-p 00023000 08:05 131602
/lib/x86_64-linux-gnu/ld-2.17.so
7fffa1b2d000-7fffa1b4e000 rw-p 00000000 00:00 0
[stack]
7fffa1bfe000-7fffa1c00000 r-xp 00000000 00:00 0
[vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0
[vsyscall]
The program has unexpectedly finished."


Voici le code de ma classe MainWindow:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
 
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "glwidget.h"
//#include "myogldraw.h"
#include "coefficientegm.h"
#include "coefficientgrace.h"
 
#include <iostream>
#include <QString>
#include <QFileDialog>
#include <QKeyEvent>
 
//--------------------------------------- Initialisation de Mainwindow -----------------------------------
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QObject::connect(ui->comboBox,SIGNAL(activated(QString)),this,SLOT(on_comboBox_activated(QString)));
    QObject::connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(on_sliderChanged(int)));
    QObject::connect(ui->degre_min,SIGNAL(valueChanged(int)),this,SLOT(on_degreeMax()));
 
    glWidget = new myogldraw(ui->dessin);
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::keyPressEvent(QKeyEvent *e)
{
    if (e->key() == Qt::Key_Escape)
        close();
    else
        QWidget::keyPressEvent(e);
}
 
//--------------------------------------- SLOTS -----------------------------------
//------------ Chargement des donnees
 
CoefficientEGM MainWindow::on_actionChargement_EGM_triggered()
{
    egm_mode = new CoefficientEGM l;
    // Recuperer nom d'un fichier par une fenetre
    QString fileName = QFileDialog::getOpenFileName(this, "Open File",
                                                    "/home/marie/Geoide/data/EGM/EGM2008_to2190_TideFree.txt",
                                                    "Text (*.txt)");
 
    egm_model->readFile(fileName);
    std::cout<<"chargement termine "<< std::endl;
}
 
CoefficientGRACE MainWindow::on_actionChargement_GRACE_triggered()
{
    grace_mode0 = new CoefficientGRACE l;
 
    // Recuperer nom d'un repertoire par une fenetre
    QString dir_name = QFileDialog::getExistingDirectory(this, "Open Directory",
                                                "/home/marie/Geoide/data/GRGS/SH_models",
                                                QFileDialog::ShowDirsOnly
                                                | QFileDialog::DontResolveSymlinks);
 
    // On fait une liste avec le nom de tous les fichiers
    QDir dir(dir_name);
    QFileInfoList list = dir.entryInfoList(QDir::Files);
    // Pour chaque fichier, on remplit C et S
    for (int i = 0; i < list.size(); ++i) {
        QFileInfo fileInfo = list.at(i);
        std::cout<<fileInfo.filePath().toStdString()<<std::endl;
        grace_model->readFile(fileInfo.filePath(), i);
     }
    std::cout<<"chargement effectue"<< std::endl;
}
 
 
// --------------- Action des boutons (parametres)
 
// Redimensionnement du choix du degre maximal en fonction des donnees choisies
void MainWindow::on_comboBox_activated(const QString &arg1)
{
    int degreeMax=0;
    if (arg1=="EGM"){
        degreeMax=2190;
    }else if (arg1=="GRACE"){
        degreeMax=50;
   }
    ui->degre_max->setMaximum(degreeMax);
}
 
// Redimensionnement du choix du degre minimal en fonction des donnees choisies
void MainWindow::on_degreeMax()
{
    int degreeLimit=ui->degre_max->value();
    ui->degre_min->setMaximum(degreeLimit);
}
 
// Affichage du facteur d'echelle
void MainWindow::on_sliderChanged(const int &arg1)
{
    ui->facteur->setText(QString("%1").arg(ui->horizontalSlider->value()));
}
 
 
 
// --------------   Calcul du geoide et affichage
 
void MainWindow::on_actionGeoide_triggered()
{
    int degreeMin = ui->degre_min->value();
    int degreeMax = ui->degre_max->value();
    QString model = ui->comboBox->currentText();
 
    if (model=="EGM")
        egm_model->potentiel(degreeMin,degreeMax);
    else if (model=="GRACE")
        grace_model->potentiel(degreeMin,degreeMax);
 
}
 
void MainWindow::on_actionHarmoniques_paires_triggered()
{
    int degreeMin = ui->degre_min->value();
    int degreeMax = ui->degre_max->value();
    QString model = ui->comboBox->currentText();
 
    if (model=="EGM")
        egm_model->potentiel_paire(degreeMin,degreeMax);
    else if (model=="GRACE")
        grace_model->potentiel_paire(degreeMin,degreeMax);
 
}
 
void MainWindow::on_actionHarmoniques_impaires_triggered()
{
    int degreeMin = ui->degre_min->value();
    int degreeMax = ui->degre_max->value();
    QString model = ui->comboBox->currentText();
 
    if (model=="EGM")
        egm_model->potentiel_impaire(degreeMin,degreeMax);
    else if (model=="GRACE")
        grace_model->potentiel_impaire(degreeMin,degreeMax);
}