极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23075|回复: 12

【BUG】Arduino编译器有一个极其严重的问题

[复制链接]
发表于 2016-4-17 12:43:16 | 显示全部楼层 |阅读模式
Arduino不支持自定义类型的函数参数!
Arduino不支持自定义类型的函数参数!
Arduino不支持自定义类型的函数参数!
重要的事情说三遍

一般人写Arduino代码的时候用的都是现成的Arduino函数,拼拼凑凑实现了想要的功能,更不会有人写自己的程序库了,所以几乎没人发现这个Bug。
以前安装一个陀螺仪函数库的时候,看到里面有几个计算向量内积和外积的小函数,当时就很奇怪:为什么它参数要分成x,y和z传递,而不是直接把结构体传进去。昨晚决定自己来写一个向量计算类,有各种构造方式,有各种运算符重载,还有几何变换的算法,想着以后就可以用自己的类方便计算向量了。先在Visual Studio里调试好,然而一放到Arduino的库里就晕了:找不到匹配Vector::Vector(Vector)的构造函数。
什么?!不是明明有这个函数吗?!
于是上百度搜原因,最后得到一个线索:有人发现Arduino的函数参数传递是不能用自定义数据类型的,也就是说像Vector::Vector(Vector)这样的函数放到里边就判别为语法错误!
半信半疑之下,自己做试验:

果然如此。看来Arduino并不真正支持C++啊。










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-4-21 01:32:05 | 显示全部楼层
感谢 @zjz5717 的帮忙,受其启发我终于把程序调出来了——虽然真正的问题只是拷贝构造函数没写const(但是VC++并不需要这个关键字啊)
为答谢各位网友的关心和支持,我把已经写好的“向量与几何变换”程序库发布出来(Arduino适用)。个人觉得这个小工具在进行四轴姿态解算的时候会有帮助。另外我觉得与其使用难以理解而且需要转来转去的四元数,还不如直接用直角坐标向量,高等代数就够用了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2016-4-17 13:33:46 | 显示全部楼层
估计不是Arduino的问题,是你写的格式不对罢了。若【不支持自定义类型的函数参数】,那他们程序里的函数怎么会可用呢?把你要用的函数写成库文件,再调用该函数试试看。
回复 支持 反对

使用道具 举报

发表于 2016-4-17 14:01:29 | 显示全部楼层
编译器就是一个AVR GCC,你要看所使用版本的GCC规范是怎么样的,GCC每次升级都会有不小改动。
回复 支持 反对

使用道具 举报

发表于 2016-4-17 20:33:11 | 显示全部楼层
本帖最后由 lovezypj 于 2016-4-17 20:37 编辑

struct ABC {
  String T;

} _params;


你可以这么定义一个结构体,ABC,_params是名字随便命名
然后_params.T 就可以直接用

这只是语言规范,不是什么bug,arduino并没有说100%就支持C++的全部语法规范和格式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-18 01:37:41 | 显示全部楼层
xinhoujue 发表于 2016-4-17 13:33
估计不是Arduino的问题,是你写的格式不对罢了。若【不支持自定义类型的函数参数】,那他们程序里的函数怎么 ...

要知道,我发这个帖子的背后,包含了多少行代码多少个库文件的实践操作。想当然解决不了现实问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-18 12:37:55 | 显示全部楼层
lovezypj 发表于 2016-4-17 20:33
struct ABC {
  String T;

关于语法标准,Arduino官网上是这么说的(在Learning/Reference下):

就是不知道他所说的“based on”是什么意思。
另外,你的方法也不行,把结构体变量传递给函数参数时仍然编译不通过。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2016-4-18 21:20:08 | 显示全部楼层
GDHack 发表于 2016-4-18 12:37
关于语法标准,Arduino官网上是这么说的(在Learning/Reference下):

就是不知道他所说的“based on” ...

based on应该是以C++为依据,可能会发生一下自己的改动,比如说在定义函数的时候,Arduino只需要void(int...) ABC(){写代码}就可以了,而C++另外要求再写一行void ABC(){};,这就是based on的意思

正类似于Java代码,如果你研究一下Java代码你会发现代码有很多分支种类,都是基于Java,但都有各自的特色,你还都看得懂
回复 支持 反对

使用道具 举报

发表于 2016-4-18 21:21:13 | 显示全部楼层
GDHack 发表于 2016-4-18 12:37
关于语法标准,Arduino官网上是这么说的(在Learning/Reference下):

就是不知道他所说的“based on” ...

Arduino可能会根据自己的需要改写c++的语法格式
回复 支持 反对

使用道具 举报

发表于 2016-4-18 21:23:22 | 显示全部楼层
GDHack 发表于 2016-4-18 12:37
关于语法标准,Arduino官网上是这么说的(在Learning/Reference下):

就是不知道他所说的“based on” ...

类似的关于【自定义函数参数】,你可以参加极客工坊13年的一篇帖子
http://www.geek-workshop.com/thread-5711-1-1.html
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-19 16:35:17 来自手机 | 显示全部楼层
zjz5717 发表于 2016-4-18 21:23
类似的关于【自定义函数参数】,你可以参加极客工坊13年的一篇帖子
http://www.geek-workshop.com/threa ...

好的,回头我再试试
回复 支持 反对

使用道具 举报

发表于 2016-4-21 13:56:32 | 显示全部楼层
你真的肯定是 Arduino 编译器 的問題嗎?

我把你的例子測試了, 完全沒有問題.  
Compile 沒問題:


Execute 也沒問題:


為什麼你會出 error 的?  難道是 1.6.7 的新功能?

我不相信這種沒有人寫庫, 這類會寫庫的人多的是.  
先把問題攪清楚吧.  把你出錯的程式放上來, 讓大家研究一下吧.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-21 15:06:16 | 显示全部楼层
Super169 发表于 2016-4-21 13:56
你真的肯定是 Arduino 编译器 的問題嗎?

我把你的例子測試了, 完全沒有問題.  

截图的代码主要是vabs函数的参数有问题,vabs(struct T t)没事,vabs(T t)编译不通过。我用的是1.6.5,这么说应该是编译器版本的问题了。另外我的问题已经自行解决,是因为类的拷贝构造函数没加const(以前一直在用MS的VC++,不知道这种事情)。
我在上一条回帖里加了附件Vector.zip,是改好的代码,你可以下载回去看看的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 04:47 , Processed in 0.043416 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表