#include <ros/ros.h>
#include <zhang/Bigint_Sum.h>//使用了自己创建的Bigint_Sum.srv
#include <iostream>//使用string
/*
*本来是想实现真正的大数加法运算的,然后发现如果我把Bigsum定义成string类型,按照c++的逻辑,
*应该是可以直接转换的,但是在这里string a=argv[1]好像是不合法的,查了半天没解决,就用了int64的整数,但是我的结果表达
*是可以计算出两个最大int64整数之和的string类型,可这样的话,传递的时候既然失效了,只能在服务端显示,不能在
*客户端显示,这个好失败。重新查看了编译srv这一节,实在找不到了
*/
bool add(zhang::Bigint_Sum::Request &req,zhang::Bigint_Sum::Response &rep)
{
//设置最大位数1000位,肯定比2的63次方大了,就是没啥用,不过以后可以扩展,在实现乘法的时候估计可以用上
int number1[1000];
int number2[1000];
//初始化数组
memset(number1,0,sizeof(number1));
memset(number2,0,sizeof(number2));
int temp=0;//temp临时存储此次加法
int carry=0;//carry表示进位
int len1=0;//len1记录number1的数组长度,本来是想调用strlen的,但是感觉这样快一点。
int len2=0;//number2
//存储a到number1,且反向存储
for(int i=0;req.a!=0;i++)
{
number1[i]=req.a%10;//取最后一位,反向存储实现
req.a/=10;//舍掉最后一位
len1++;//number1长度加一
}
//存储b到number2
for(int i=0;req.b!=0;i++)
{
number2[i]=req.b%10;
req.b/=10;
len2++;
}
int lenmax = ((len1 > len2) ? len1 : len2);//找到最“长”的一个数,不是最大,方便下面计算结果
int len=0;
//计算sum
for(int i=lenmax-1;i>=0;i--)
{
temp=number1[i]+number2[i];
rep.sum[len]=temp%10+'0';
carry=temp/10;
len++;
}
//最后一位处理
if(carry!=0)
{
rep.sum[len++]=carry;
}
//这里好奇怪,为什么服务端会显示两个数的和在b的位置
ROS_INFO("request: x=%ld, y=%ld",(long int)req.a,(long int)req.b);
//调用c_str输出字符串sum
ROS_INFO("sending back response: [%s]",rep.sum.c_str());
//返回正常
return true;
}
int main(int argc,char** argv)
{
//初始化节点
ros::init(argc,argv,"add_two_bigint_server");
//创建节点句柄
ros::NodeHandle n;
//发布服务,等到客户端消息
ros::ServiceServer service=n.advertiseService("add_two_bigint",add);
//表示程序运行正常
ROS_INFO("Ready to add two bigints.");
//暂停
ros::spin();
//退出
return 0;
}
ROS编程示例---加法服务端
最新推荐文章于 2021-07-10 00:28:58 发布