0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Arduinoでクラスを使うときに引っ掛かったこと

Last updated at Posted at 2021-11-11

失敗1:unknown type name 'class'

エラー

~.h  , unknown type name 'class'; did you mean 'labs'?
 class EKF_class{
 ^~~~~
 labs

ヘッダファイル

#ifndef EKF
#define EKF
#include "Arduino.h"


class EKF_class{
private:
    static float invSqrt(float x);
    float qw;
    float qx;
    float qy;
    float qz;
    float wx;
    float wy;
    float wz;
    float mgIrap[3][3] = { { 0.       ,  64.4551274, -68.3301152},{-65.2699143,   0.       ,  71.0792784},{56.5946296, -58.1367176,   0.      }} ;

    //正確には、inv_I * alpha  のこと。 T = alpha * V  - beta * dphi
    //dphiを
    float inv_I[3] = {10.396,-10.9436,-7.7065};

public:
    EKF_class(void);
    /*
    void add3_3(float A_pt[3][3],float B_pt[3][3]);
    void eq3_3(float A_pt[3][3],float B_pt[3][3]);
    void mul3_3(float A_pt[3][3],float B_pt[3][3]);
    void disp3_3(float A[3][3]);
    */
};
#endif

原因

ライブラリのCコードの名前を「--.c」にしていた
「--.cpp」にする必要がある。

原因2(2023/12/28 追加)

同様のエラーが再度発生、cppに変更したが解決せず。

  • コンストラクタ追加
  • cpp側にヘッダファイルインクルード追加
  • ヘッダファイルが2つある時に#ifndef 名前で同じ名前にしてるとだめ
  • メンバ変数へのアクセスをClass_name::memberに修正

上記のどれかで解決

クラス作成例

失敗1-2

does not name a type

コンストラクタについたエラー

原因

Classの宣言がうまくいっていないということ。classが宣言できていない

解決

cppファイル内にhファイルをincludeするように変更

(Qiitaの# と ##って違いが弱くて見にくいね・・・###にしたらいいのかな)

失敗2

cannot convert '<brace-enclosed initializer list>' to 'float' in assignment
A_w[3][4] = {{-2*qy,2*qz,-2*qw,2*qx},{2*qx,2*qw,2*qz,2*qy},{2*qw,-2*qx,-2*qy,2*qz}};

原因

すでに、定義した配列に対し{}で代入することはできない。

失敗3

EKF.cpp: In member function 'void EKF_class::make_A()':

どこがエラーかはわかるが、何がよくないかは不明
と思ったが、この文章はmake_A()という関数内でエラーがあるよと言っている
この文章の下に本当のエラー原因があります。

失敗4

exit status 1
expected unqualified-id before ')' token
error: abstract declarator '<unnamed class>' used as declaration

コンストラクタの宣言に発生するエラー

苦痛

ハゲそう。ガチでゴミ
理由がわからない
ChatGPTに全コード渡してもわからず・・・
極限までコードを簡略化しても消えない

解決

#ifndef Th_control
#define Th_control

/*

*/

#endif

はダメ

#ifndef TH
#define TH

/*

*/

#endif

なら通った。

インクルードガードの書き方の問題??

プリプロセッサは大文字しか対応できないとかあるのかな。

とりあえず、辛い。
わからない。時間がかかる・・・
変な落とし穴が嫌い。
誰だこの仕様作ったの!!!!!!!!!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?