ROS编程示例---加法服务端

#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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值