Проблемы с компиляцией библиотеки EKfilter C ++ на Arduino DUE

ОБНОВЛЕНИЕ: исправлена ​​последняя ошибка, просто заменив operator [] на this-> operator [].

ОБНОВЛЕНИЕ 2: ошибка logic_error исправлена! Осталось только _P ошибка! (который отображается только в DUE, а не в UNO или других досках ...)

ОБНОВЛЕНИЕ 3: изменение имени временной матрицы на _Pt сработало, возможно, это был зарезервированный макрос?

НОВАЯ ОШИБКА:

Arduino: 1.6.1 (Mac OS X), Board: "Arduino Due (Programming Port)"

/Users/zackbright/Documents/Arduino/libraries/StandardCplusplus-master/func_exception.cpp: In function 'void std::__throw_bad_alloc()':
/Users/zackbright/Documents/Arduino/libraries/StandardCplusplus-master/func_exception.cpp:30:18: error: exception handling disabled, use -fexceptions to enable
        throw bad_alloc();
                       ^
Error compiling.

Похоже, мне нужно использовать -fexceptions ...

В этом отчете будет больше информации, если в меню «Файл»> «Настройки» включен параметр «Показать подробный вывод во время компиляции».

Здесь много всего, но я надеюсь, что отдать все - это то, что я должен сделать, чтобы получить хороший ответ на этот вопрос.

с использованием Arduino 1.6.1 для arduino DUE на OSX.

используя эту библиотеку для получения пространства имен std 'https://github.com/maniacbug/StandardCplusplus/'

И это библиотека, с которой у меня возникают проблемы при компиляции: 'http://kalman.sourceforge.net/index.php '

Я переместил библиотеку фильтров в этот формат, чтобы иметь возможность использовать ее с Arduino, и теперь я смог, по крайней мере, выполнить включение без поиска файлов заголовков:  скриншот файла

Как вы можете видеть, мне пришлось переименовать файлы в заголовки .h (не знаю, насколько это действительно необходимо) и переименовать папку с тем же названием, что и у моих .cpp и .h, и, конечно, отредактировать все вложенные файлы для ссылки файлы по-разному: пример

#include "kalman/ekfilter.hpp"
//the "kalman/" is because these used to be in a separate include folder

теперь это вместо:

#include "ekfilter.h"

Итак, теперь, когда я просто пытаюсь скомпилировать:

#include <StandardCplusplus.h>
#include <ekfilter.h>

void setup() {
  // put your setup code here, to run once:
}

void loop() {
 // put your main code here, to run repeatedly:
}

Я получаю этот беспорядок ошибок, показанный ниже.

Первая ошибка действительно сводит меня с ума, потому что эта библиотека StandardCplusplus должна обрабатывать пространство имен std ::, и я не могу якобы найти что-то неправильное в реализации в этой кодовой базе.

Из того, что я вижу, большая часть всего, что следует за _P, является проблемой, заключающейся в том, что эта первая ошибка не позволяет преобразовать переменную _P в матрицу, как определено в kmatrix.h. Как ни странно, и это может указывать на решение, эти ошибки НЕ появляются, когда я компилирую для Arduino UNO.

Последняя пара ошибок мне просто непонятно честно, что это вообще значит.

Arduino: 1.6.1 (Mac OS X), Board: "Arduino Due (Programming Port)"

В файле, включенном из /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:37:0, из /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:33, из TestKalmanLibrary.ino: 2:

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:74:48: ошибка: ожидаемое имя класса перед токеном '{'

struct KalmanError : public std::logic_error {
                                            ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h: В конструкторе 'Kalman :: KalmanError :: KalmanError (const string &)': /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h: 82: 9: ошибка:

класс 'Kalman :: KalmanError' не имеет поля с именем 'logic_error'

   : logic_error(message) {}
     ^

В файле, включенном из / Users / insertnamehere / Documents / Arduino / libraries / StandardCplusplus-master / cctype: 19: 0, из / Users / insertnamehere / Documents / Arduino / libraries / StandardCplusplus-master / istream: 21, из / Users / insertnamehere / Documents / Arduino / библиотеки / StandardCplusplus-master / iostream: 27, из /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:35, из / Users / insertnamehere / Documents / Arduino / библиотеки / ekfilter / ekfilter .h: 33, из TestKalmanLibrary.ino: 2: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h: В глобальном масштабе:

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:807:20:

ошибка: ожидаемый неквалифицированный идентификатор перед числовой константой

 mutable Matrix _P;  //!< Temporary matrix.
                ^

В файле, включенном из /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:817:0, из TestKalmanLibrary.ino: 2: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h: In функция-член 'void Kalman :: EKFilter :: init (Kalman :: EKFilter :: Vector &, Kalman :: EKFilter :: Matrix &)':

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:196:8: ошибка:

запрос на замену члена в '16', который не относится к классу типа 'int'

 _P.swap(P_);
    ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h: в функции-члене 'const Matrix & Kalman :: EKFilter :: calculateP () const': / Users / insertnamehere / Documents / Arduino / libraries / ekfilter / ekfilter_impl. h: 435: 10: ошибка: запрос на изменение размера члена в «16», который не относится к типу класса «int»

   _P.resize(n, n);         // keep this resize
      ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:439:15: ошибка: выражение не может использоваться как функция

     _P(i,i) = U(i,i);
           ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:443:17: ошибка: выражение не может использоваться как функция

       _P(i,j)  = U(i,j)*U(j,j);
             ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:444:17: ошибка: выражение не может использоваться как функция

       _P(i,i) += U(i,j)*_P(i,j);
             ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:444:35: ошибка: выражение не может использоваться как функция

       _P(i,i) += U(i,j)*_P(i,j);
                               ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:447:19: ошибка: выражение не может использоваться как функция

         _P(i,j) += U(i,k)*U(j,k)*U(k,k);
               ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:17: ошибка: выражение не может использоваться как функция

       _P(j,i) = _P(i,j);
             ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:27: ошибка: выражение не может использоваться как функция

       _P(j,i) = _P(i,j);
                       ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h: В функции-члене 'virtual void Kalman :: EKFilter :: sizeUpdate ()': /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl : 572: 26: ошибка: выражение нельзя использовать как функцию

       U(i,j) = _P(i,j);
                      ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:583:10: ошибка: запрос на изменение размера члена в «16», который не относится к типу класса «int»

   _P.resize(n, nn);
      ^

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:586:17: ошибка: выражение не может использоваться как функция

       _P(i,j) = U(i,j);
             ^

В файле, включенном из /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:34:0, из /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:33, из TestKalmanLibrary.ino: 2: / Users / insertnamehere / Documents / Arduino / libraries / StandardCplusplus-master / string: При создании экземпляра 'std :: basic_string :: size_type std :: basic_string :: find_first_not_of (const std :: basic_string &, std :: basic_string :: size_type) const [с Ch = char; Тр = std :: char_traits; A = std :: allocator; std :: basic_string :: size_type = unsigned int] ': /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector_impl.h:66:42: требуется отсюда / Users / insertnamehere / Documents / Arduino / libraries / StandardCplusplus- master / string: 518: 64: примечание: объявления в зависимой базе 'std :: vector>' не найдены неквалифицированным поиском

                             if( Tr::eq(str[j], operator[](i)) ){
                                                            ^

/ Users / insertnamehere / Documents / Arduino / libraries / StandardCplusplus-master / string: 518: 64: примечание: используйте this-> operator [] вместо Ошибка компиляции.

Так что здесь есть что исправить, но это все после того, как я исправил некоторые проблемы с тем, как библиотека уже была отформатирована:

Мне пришлось добавить -fpermissive в настройки компиляции "/boards.txt"

в их коде была странная реализация, которая не компилировалась, я изменил это:

// These are explicitly GNU C++ specific.

// This is the exception class we report -- "GNUCC++\0".

const _Unwind_Exception_Class __gxx_exception_class
= ((((((((_Unwind_Exception_Class) 'G' 
  << 8 | (_Unwind_Exception_Class) 'N')
 << 8 | (_Unwind_Exception_Class) 'U')
    << 8 | (_Unwind_Exception_Class) 'C')
   << 8 | (_Unwind_Exception_Class) 'C')
  << 8 | (_Unwind_Exception_Class) '+')
 << 8 | (_Unwind_Exception_Class) '+')
<< 8 | (_Unwind_Exception_Class) '\0');

к этому:

const _Unwind_Exception_Class __gxx_exception_class = "GNUCC++\0";

person Colin McDonnell    schedule 26.04.2015    source источник
comment
похоже, вы должны #include <stdexcept> в ekfilter.h   -  person Lol4t0    schedule 26.04.2015
comment
это include уже находится в ktypes.h, где возникает ошибка.   -  person Colin McDonnell    schedule 26.04.2015
comment
Также стоит отметить, что мне пришлось добавить #include Arduino.h ко всем файлам, чтобы они также компилировались для Arduino.   -  person Colin McDonnell    schedule 26.04.2015
comment
Затем вам может потребоваться перенастроить std-lib с поддержкой исключений (  -  person Lol4t0    schedule 26.04.2015
comment
О, ЧЕЛОВЕК, да, ты совершенно прав. не уверен, как я это пропустил! Изменил конфигурацию системы в этой библиотеке и все хорошо! Огромное спасибо! Остается только ошибка матрицы _P.   -  person Colin McDonnell    schedule 26.04.2015
comment
Изменение имени временной матрицы на _Pt сработало, возможно, это был зарезервированный макрос?   -  person Colin McDonnell    schedule 26.04.2015


Ответы (1)


ВСЕ ВОПРОСЫ РЕШЕНЫ.

Последняя ошибка решена включением -fexceptions в мои флаги компилятора.

Спасибо за помощь, ребята!

person Colin McDonnell    schedule 26.04.2015