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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章