0

更新:通过将 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 ...

此报告将在“文件”>“首选项”中启用“在编译期间显示详细输出”的更多信息。

这里有很多,但我希望付出一切是我应该做的,以获得一个好的答案。

在 OSX 上为 arduino DUE 使用 Arduino 1.6.1。

使用这个库来获取 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/libraries/StandardCplusplus-master/iostream:27,来自 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:35,来自 /Users/insertnamehere/Documents/Arduino/libraries/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:

错误:数字常量之前的预期不合格 id

 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: 在成员函数'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”中请求成员“resize”,它是非类类型“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.h :572:26:错误:表达式不能用作函数

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

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:583:10: 错误:在“16”中请求成员“resize”,它是非类类型“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 [with Ch = char; Tr = std::char_traits; A = std::分配器;std::basic_string::size_type = unsigned int]': /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector_impl.h:66:42: 从这里需要 /Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-主/字符串: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";
4

1 回答 1

0

所有问题现已解决。

通过在我的编译器标志中包含 -fexceptions 解决了最后一个错误。

谢谢你们的帮助。

于 2015-04-26T18:19:53.713 回答