我正在编写我的第一个c程序,使用pigpio创建波形的覆盆子pi和一个Adafruit_1015 ADC,以便在触发pigpio回调时从接收器捕获数据。代码工作正常,我可以将ADC数据输出到屏幕。现在我需要做的是将这些数据读数捕获到矢量中,以便我可以对其进行平均,然后捕获总读数的标准偏差,总读数可能在100到1000个元素之间。
我在主要功能之前有以下适用的行:
#include <vector>
#define datavector
std::vector <int16_t> datavector;`
然后在pigpio回调(命名边)内向向量添加数据,我正在使用
`std::vector<datavector>.push_back(adc2);`
adc2是从int16_t类型的ADC的通道2读取的数据。
我遇到的问题是,当我尝试编译(gcc)时,我收到以下错误消息:
main.cpp:46:6: error: declaration does not declare anything [-fpermissive]
std::vector <int16_t> datavector;
^
main.cpp: In function ‘void edges(int, int, uint32_t)’:
main.cpp:148:15: error: expected primary-expression before ‘.’ token
datavector.push_back(adc2);
似乎我已经正确地完成了所有事情,但显然有些事情是错误的。有人能指出我在向量的实现上正确的方向吗?
编辑: 如果我按照Jean的建议删除#define数据向量,我会得到更多的编译器错误,如下所示:
/tmp/ccMOBzge.o: In function `std::_Vector_base<short, std::allocator<short> >::~_Vector_base()':
main.cpp: (.text._ZNSt12_Vector_baseIsSaIsEED2Ev[_ZNSt12_Vector_baseIsSaIsEED5Ev]+0x64): undefined reference to `__cxa_end_cleanup'
/tmp/ccMOBzge.o:(.ARM.extab.text._ZNSt12_Vector_baseIsSaIsEED2Ev[_ZNSt12_Vector_baseIsSaIsEED5Ev]+0x0): undefined reference to `__gxx_personality_v0'
/tmp/ccMOBzge.o: In function `std::vector<short, std::allocator<short> >::_M_insert_aux(__gnu_cxx::__normal_iterator<short*, std::vector<short, std::allocator<short> > >, short const&)':
main.cpp:(.text._ZNSt6vectorIsSaIsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPsS1_EERKs[_ZNSt6vectorIsSaIsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPsS1_EERKs]+0x290): undefined reference to `__cxa_end_catch'
main.cpp:(.text._ZNSt6vectorIsSaIsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPsS1_EERKs[_ZNSt6vectorIsSaIsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPsS1_EERKs]+0x294): undefined reference to `__cxa_end_cleanup'
main.cpp:(.text._ZNSt6vectorIsSaIsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPsS1_EERKs[_ZNSt6vectorIsSaIsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPsS1_EERKs]+0x2a0): undefined reference to `__cxa_begin_catch'
main.cpp:(.text._ZNSt6vectorIsSaIsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPsS1_EERKs[_ZNSt6vectorIsSaIsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPsS1_EERKs]+0x308): undefined reference to `__cxa_rethrow'
/tmp/ccMOBzge.o:(.ARM.extab.text._ZNSt6vectorIsSaIsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPsS1_EERKs[_ZNSt6vectorIsSaIsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPsS1_EERKs]+0x0): undefined reference to `__gxx_personality_v0'
/tmp/ccMOBzge.o: In function `std::vector<short, std::allocator<short> >::_M_check_len(unsigned int, char const*) const':
main.cpp:(.text._ZNKSt6vectorIsSaIsEE12_M_check_lenEjPKc[_ZNKSt6vectorIsSaIsEE12_M_check_lenEjPKc]+0x54): undefined reference to `std::__throw_length_error(char const*)'
/tmp/ccMOBzge.o: In function `__gnu_cxx::new_allocator<short>::deallocate(short*, unsigned int)':
main.cpp:(.text._ZN9__gnu_cxx13new_allocatorIsE10deallocateEPsj[_ZN9__gnu_cxx13new_allocatorIsE10deallocateEPsj]+0x1c): undefined reference to `operator delete(void*)'
/tmp/ccMOBzge.o: In function `__gnu_cxx::new_allocator<short>::allocate(unsigned int, void const*)':
main.cpp:(.text._ZN9__gnu_cxx13new_allocatorIsE8allocateEjPKv[_ZN9__gnu_cxx13new_allocatorIsE8allocateEjPKv]+0x40): undefined reference to `std::__throw_bad_alloc()'
main.cpp:(.text._ZN9__gnu_cxx13new_allocatorIsE8allocateEjPKv[_ZN9__gnu_cxx13new_allocatorIsE8allocateEjPKv]+0x50): undefined reference to `operator new(unsigned int)'
/tmp/ccMOBzge.o: In function `std::vector<short, std::allocator<short> >::~vector()':
main.cpp:(.text._ZNSt6vectorIsSaIsEED2Ev[_ZNSt6vectorIsSaIsEED5Ev]+0x60): undefined reference to `__cxa_end_cleanup'
/tmp/ccMOBzge.o:(.ARM.extab.text._ZNSt6vectorIsSaIsEED2Ev[_ZNSt6vectorIsSaIsEED5Ev]+0x0): undefined reference to `__gxx_personality_v0'
collect2: error: ld returned 1 exit status
所以我相当肯定这不是正确的答案。
答案 0 :(得分:2)
#define datavector
std::vector <int16_t> datavector;
被看作(在预处理之后)
std::vector <int16_t>;
因此您遇到的错误(也解释了那里的错误:datavector.push_back(adc2);
)。只需删除无用的#define
行。
另请注意,这不是C程序而是C ++程序,因此您必须使用g++
构建它(这解释了编辑的链接器错误)