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
Je n'arrive pas à comprendre ces erreurs alors je demande des avis pour m'aider."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"
Les trois fichier du projet "Pendul" :
pend_dsys_fixpt.cpp
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
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]; }
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
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]; }
Cordialement
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); }
Partager