Передача структуры из main.cpp в класс
Извините, если этот вопрос был опубликован, но я не смог найти тот, который соответствует моей проблеме. Я не мог передать свои значения структуры из основного файла в класс. Есть идеи? Я получил это:
error: no matching function for call to 'ODriveArduino::SetParam(R_motor_params&)'
Main.cpp:
#include ODriveArduino.h
ODriveArduino odrive(Serial1);
struct L_motor_params{
int axis=1;
float vel_Gain= 2.5f/10000.0f ;
float pos_Gain= 40.0f;
float vel_Int_Gain= 0.0f/10000.0f;
};
struct R_motor_params{
int axis=0;
float vel_Gain= 2.75f/10000.0f ;
float pos_Gain= 40.0f;
float vel_Int_Gain= 0.0f/10000.0f;
};
void setup() {
struct R_motor_params M;
odrive.SetParam(M);
}
ODriveArduino.h:
class ODriveArduino {
private:
struct motor_Params{
int axis;
float vel_Gain;
float pos_Gain;
float vel_Int_Gain;
};
public:
ODriveArduino(Stream& serial);
// Команды
void SetParam(struct motor_Params M);
}
ODriveArduino.cpp:
#include "ODriveArduino.h"
template<class T> inline Print& operator <<(Print &obj, T arg) { obj.print(arg); return obj; }
template<> inline Print& operator <<(Print &obj, float arg) { obj.print(arg, 4); return obj; }
ODriveArduino::ODriveArduino(Stream& serial)
: serial_(serial) {}
void ODriveArduino::SetParam(struct motor_Params M){
Serial1 << "w axis" << M.axis << ".motor.config.pos_gain " << M.pos_Gain << '\n';
Serial1 << "w axis" << M.axis << ".motor.config.vel_gain " << M.vel_Gain << '\n';
Serial1 << "w axis" << M.axis << ".motor.config.vel_integrator_gain " << M.vel_Int_Gain << '\n';
}
@zaraku27, 👍0
Обсуждение1 ответ
Лучший ответ:
▲ 1
Похоже, вы пытаетесь реализовать полиморфизм без реализации полиморфизма.
Что вы сделали, так это создали три полностью независимые структуры и предположили, что все они будут работать вместе только потому, что они одинакового размера, с похожими именами и полями с одинаковыми именами. Это не так. Все они совершенно разные.
Вместо этого вам нужна только одна структура, но использовать ее несколько раз для создания разных переменных:
// из ODriveArduino.h, но переместить *вне* класса
struct motor_Params{
int axis;
float vel_Gain;
float pos_Gain;
float vel_Int_Gain;
};
// в вашем коде
struct motor_Params left_params = {
1, 2.5f/10000.0f, 40.0f, 0.0f/10000.0f
};
struct motor_Params right_params = {
0, 2.75f/10000.0f, 40.0f, 0.0f/10000.0f
};
// позже
odrive.SetParam(left_params);
,
@Majenko
Смотрите также:
- устаревшее преобразование из строковой константы в 'char*'
- Как запрограммировать ардуино на чистом C/C++?
- Количество элементов в массиве char
- Регистры ввода-вывода SAM3X8E (Arduino Due)
- как быстро loop() работает в Arduino
- Arduino: как получить тип платы в коде
- Как вызвать функции C из скетча ардуино?
- Как преобразовать полезную нагрузку byte* в строку
у вас есть 3 структуры **типа**
motor_Params
,R_motor_Params
,L_motor_Params
, но вы хотите, чтобы L и R были переменными типаmotor_Params
, @Juraj@Juraj
R_motor_Params
иL_motor_Params
имеют немного разные значения. Я хочу передать их вSetParam
. Я подумал, что для этого мне нужно иметь идентичную структуру в ODriveArduino.h, чтобыSetParam
знал, чего ожидать. Очевидно, это не сработало. Я не уверен, что мне не хватает., @zaraku27motor_params L_motor_params
создает переменную типаmotor_params1
с именемL_motor_params
, @Juraj