Bonjour A tous

J'ai ces trois programmes pour un projet.
le fichier QUESTIO2.cpp est le main.
En exécutant les fichier j'ai les erreurs suivants

"Gravité Code Description Projet Fichier Ligne État de la suppression
Erreur LNK2005 "public: void __thiscall dsys_fixpt::Init(short const * const)" (?Init@dsys_fixpt@@QAEXQBF@Z) déjà défini(e) dans pend_dsys_fixpt.obj Pendul E:\Code Cplus\Pendul\Pendul\QUESTIO2.obj"
Je n'arrive pas à comprendre ces erreurs alors je demande des avis pour m'aider.

Les trois fichier du projet "Pendul" :

pend_dsys_fixpt.cpp
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
// Model: dsys_fixpt 
// Sampling period = 0.010000 seconds
//
// Input scaling:  [4    2 1000]
// State scaling:  [2   1 100  20]
// Output scaling: [1000]
// Generated at 15:55:30 on 30-Dec-2019
 
 
class dsys_fixpt
{
public:
    // n = #states, m = #outputs, r = #inputs
    enum { n = 4, m = 1, r = 3 };
 
    void Init(const short x0[n]);
    void Upd(const short u[r]);
    const short* Out(void) const { return yy; }
    const short* Sta(void) const { return xx; }
 
private:
    static const short aa[n * n], bb[n * r], cc[m * n], dd[m * r];
    short xx[n], yy[m];
};
 
 
const short dsys_fixpt::aa[n*n] =
{
      1417,      0,   2257,      0,
         0,   4811,      0,   1327,
     -5025,      0,   7140,      0,
         0,  -2447,      0,   8464
};
 
const short dsys_fixpt::bb[n*r] =
{
      9284,      0,  -4783,
        -6,   6365,   1962,
      4291,      0, -16311,
       -38,   3634,  12988
};
 
const short dsys_fixpt::cc[m*n] =
{
      1367,   1564,   7940,   9145
};
 
const short dsys_fixpt::dd[m*r] =
{
      7233,   3566,  -1951
};
 
void dsys_fixpt::Init(const short x0[n])
{
    int i;
 
    // Initialize x
    for (i=0; i<n; i++)
        xx[i] = x0[i];
}
 
void dsys_fixpt::Upd(const short u[r])
{
    int i, j, n_offset = 0, r_offset = 0;
    short x_next[n];
    long accum;
 
    // Evaluate x_next = A*x + B*u
    for (i=0; i<n; i++)
    {
        accum = 0;
 
        for (j=0; j<n; j++)
            accum += (long) aa[n_offset+j]*xx[j];
 
        for (j=0; j<r; j++)
            accum += (long) bb[r_offset+j]*u[j];
 
        accum = (accum >> 15) * 122955;
        x_next[i] = (short) (accum >> 15);
 
        n_offset += n;
        r_offset += r;
    }
 
    n_offset = 0;
    r_offset = 0;
 
    // Evaluate y = C*x + D*u
    for (i=0; i<m; i++)
    {
        accum = 0;
 
        for (j=0; j<n; j++)
            accum += (long) cc[n_offset+j]*xx[j];
 
        for (j=0; j<r; j++)
            accum += (long) dd[r_offset+j]*u[j];
 
        accum = (accum >> 15) * 153480;
        yy[i] = (short) (accum >> 15);
 
        n_offset += n;
        r_offset += r;
    }
 
    // Update x to its next value
    for (i=0; i<n; i++)
        xx[i] = x_next[i];
}
pend_model.cpp
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
// Model: pend_model 
// Sampling period = 0.010000 seconds
// Generated at 15:53:37 on 30-Dec-2019
 
 
class pend_model
{
public:
    // n = #states, m = #outputs, r = #inputs
    enum { n = 4, m = 3, r = 1 };
 
    void Initialize(const double x0[n]);
    void Update(const double u[r]);
    const double* Output(void) { return y; }
    const double* State(void) { return x; }
 
private:
    static const double a[n * n], b[n * r], c[m * n], d[m * r];
    double x[n], y[m];
};
 
const double pend_model::a[n*n] =
{
      1.004530917e+00,   0.000000000e+00,   1.001509850e-02,   0.000000000e+00,
     -1.130852937e-04,   1.000000000e+00,  -3.768372393e-07,   1.000000000e-02,
      9.068671693e-01,   0.000000000e+00,   1.004530917e+00,   0.000000000e+00,
     -2.263412261e-02,   0.000000000e+00,  -1.130852937e-04,   1.000000000e+00
};
 
const double pend_model::b[n*r] =
{
     -2.313229468e-03,
      3.081305201e-04,
     -2.320207355e-01,
      3.083046783e-02
};
 
const double pend_model::c[m*n] =
{
      1.000000000e+00,   0.000000000e+00,   0.000000000e+00,   0.000000000e+00,
      0.000000000e+00,   1.000000000e+00,   0.000000000e+00,   0.000000000e+00,
      0.000000000e+00,   0.000000000e+00,   0.000000000e+00,   0.000000000e+00
};
 
const double pend_model::d[m*r] =
{
     -3.848408621e-04,
      5.133768100e-05,
      1.000000000e+00
};
 
void pend_model::Initialize(const double x0[n])
{
    int i;
 
    // Initialize x
    for (i=0; i<n; i++)
        x[i] = x0[i];
 
}
 
void pend_model::Update(const double u[r])
{
    int i, j;
    double x_next[n];
 
    // Evaluate x_next = A*x + B*u
    for (i=0; i<n; i++)
    {
        x_next[i] = 0;
        for (j=0; j<n; j++)
            x_next[i] += a[i*n+j]*x[j];
 
        for (j=0; j<r; j++)
            x_next[i] += b[i*r+j]*u[j];
    }
 
    // Evaluate y = C*x + D*u
    for (i=0; i<m; i++)
    {
        y[i] = 0;
        for (j=0; j<n; j++)
            y[i] += c[i*n+j]*x[j];
 
        for (j=0; j<r; j++)
            y[i] += d[i*r+j]*u[j];
    }
 
    // Update x to its next value
    for (i=0; i<n; i++)
        x[i] = x_next[i];
 
}
QUESTIO2.cpp
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
#include <cstdio>
#include <cassert>
#include <cstring>
#include <iostream>
 
#include "pend_model.cpp"
#include "pend_dsys_fixpt.cpp"
 
 
using namespace std;
 
int main()
{
    // Declare the plant and controller objects
    dsys_fixpt controller;
    pend_model plant;
 
    // Specify the initial states
    short controller_x0[4] = {0, 0, 0, 0};
    double plant_x0[4] = {0, 0, 0, 0};
 
    // Call the plant and controller intialization functions
    controller.Init(controller_x0);
    plant.Initialize(plant_x0);
 
    // Set up for the dynamic loop
    const short *controller_output = controller.Out();
    const double *plant_output = plant.Output();
 
    int n = 0;               // Loop counter
    double h = 0.01;         // Sampling interval, seconds
    const double r = 0.9;    // Reference input
    const double N = -223.6; // Feedforward gain
    const double short_max = 32768;
 
    const double us[dsys_fixpt::r] = {4, 2, 1000};
    const double ys[dsys_fixpt::m] = {1000};
 
    // Start the real time clock counting from zero
 
    // Open the data logging output file
 
   // FILE *iov = fopen("pend.txt", "w");
   // assert(iov);
 
    FILE* iov;
    fopen_s(&iov, "pend.txt", "w");
    assert(iov);
 
    while (n < 71)
    {
        // Set up the controller inputs U
        short controller_u[3];
        for (int i=0; i<dsys_fixpt::r; i++)
            controller_u[i] = short(short_max * plant_output[i] /
                us[i]);
 
        // Call the controller's Update function
        controller.Upd(controller_u);
 
        // Combine the controller output and the reference input
        double pend_u = (ys[0]*controller_output[0])/short_max +
            r*N;
 
        // Call the plant's Update function
        plant.Update(&pend_u);
 
        // Log the current plant and controller outputs
        fprintf(iov, "%lf %lf %lf %lf\n", n*h, 
            plant_output[0], plant_output[1], plant_output[2]);
 
        ++n;
        // Delay until time = n * h
    }
 
    fclose(iov);
}
Cordialement