Передача структуры из 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';
}

, 👍0

Обсуждение

у вас есть 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 знал, чего ожидать. Очевидно, это не сработало. Я не уверен, что мне не хватает., @zaraku27

motor_params L_motor_params создает переменную типа motor_params1 с именем L_motor_params, @Juraj


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);
,