#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編程示例---加法服務端
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.