更新:通过实际用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 1.6.1 for arduino DUE。
使用此库获取std命名空间 ' https://github.com/maniacbug/StandardCplusplus/'
这是我编译时遇到问题的库: ' http://kalman.sourceforge.net/index.php'
我已经将过滤器库移动到这种格式,以便能够使用fr 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 :: namespace,而且在代码库中没有任何我表面上可能错误的实现。
从我看来,_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:错误:在&#39; {&#39;之前预期的类名令牌
struct KalmanError : public std::logic_error { ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:在构造函数&#39; Kalman :: KalmanError :: KalmanError(const string&amp;)&#39;: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:82:9:错误:
class&#39; Kalman :: KalmanError&#39;没有任何名为&#39; logic_error&#39;
的字段: 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:
错误:数字常量
之前的预期unqualified-idmutable 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:在成员函数&#39; void Kalman :: EKFilter :: init(Kalman :: EKFilter :: Vector&amp;,Kalman :: EKFilter :: Matrix&amp; )&#39;:
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:196:8:错误:
请求成员&#39;交换&#39;在&#39; 16&#39;中,这是非类型的&#39; int&#39;
_P.swap(P_); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:在成员函数&#39; const Matrix&amp; Kalman :: EKFilter :: calculateP()const&#39;: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:435:10:错误:请求会员&#39;调整大小&#39;在&#39; 16&#39;中,这是非类型的&#39; int&#39;
_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:在成员函数&#39;虚拟void Kalman :: EKFilter :: sizeUpdate()&#39;: /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:错误:请求会员&#39;调整大小&#39;在&#39; 16&#39;中,这是非类型的&#39; int&#39;
_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:实例化&#39; std :: basic_string :: size_type std :: basic_string :: find_first_not_of(const std :: basic_string&amp;,std :: basic_string :: size_type)const [with Ch = char; Tr = std :: char_traits; A = std :: allocator; std :: basic_string :: size_type = unsigned int]&#39;: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector_impl.h:66:42:从这里要求 / Users / insertnamehere / Documents / Arduino / libraries / StandardCplusplus-master / string:518:64:note:依赖库中的声明&#st; :: vector&gt;&#39;没有资格的查找找不到
if( Tr::eq(str[j], operator[](i)) ){ ^
/ Users / insertnamehere / Documents / Arduino / libraries / StandardCplusplus-master / string:518:64:note:use&#39; this-&gt; operator []&#39;代替 编译错误。
所以这里需要解决很多问题,但这是在我修复了已经格式化库的方式之后的所有问题:
我必须添加-fpermissive到&#34; /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";
答案 0 :(得分:0)
现在已解决所有问题。
通过在编译器标志中包含-fexceptions来解决上一个错误。
感谢帮助人员。