1 //一维 2 #include<iostream> 3 #include<vector> 4 using namespace std; 5 6 int main() 7 { 8 int len; 9 cin>>len; 10 vector<int> array(len);//声明变长数组 11 12 for(int i=0;i<len;i++) 13 { 14 array[i]=i; 15 cout<<array[i]<<" "; 16 } 17 return 0; 18 } 19 //二维 20 #include <iostream> 21 #include <iomanip> 22 using namespace std; 23 24 int main() 25 { 26 int num1,//行数 27 num2;//列数 28 29 cout<<"Please enter the number for row and column: "<<endl; 30 cin >> num1 >> num2; 31 32 //为二维数组开辟空间 33 int **p = new int*[num1]; 34 for(int i=0; i<num1; ++i) 35 p[i] = new int[num2]; 36 37 for(int j=0;j<num1;j++) 38 { 39 for(int k=0;k<num2;k++) 40 { 41 p[j][k]=(j+1)*(k+1); 42 cout<<setw(6)<<p[j][k]<<':'<<setw(8)<<&p[j][k]; 43 } 44 cout<<endl; 45 } 46 47 //释放二维数组占用的空间 48 for(int m=0;m<num1;m++) 49 delete[] p[m]; 50 delete[] p; 51 52 return 0; 53 }
调用C++里面的vector 容器,实现变长数组。
why? 因为在用UDP进行数据通信的时候,我不可能把所有的点都发给决策组,那我就需要截取结构体里面的东西,该怎么截取,情况下面函数:
方法一:(通过声明常量数组实现,截取部分)
此种方法从理论上来讲与方法二有异曲同工之妙之妙,我们也也可以获得
uint len = obs*sizeof(Point) + 2; 也就是matrix里面的大小。这样我们就没必要用sizeof(str);多此一举。
但相比较方法二,此方法浪费空间比方法二要多,没有方法二灵活。
1 char str[MAXSIZE+1];
uint len = obs*sizeof(Point) + 2;
2 memset(&str,0,sizeof(str));
3 memcpy(&str,(char*)&matrix,len);//将matrix里面的值,赋值给str,长度sizeof。与上面刚好相反。
方法二:
1 /***************************UDP发送之前,将结构体转换为字符数组******************************/ 2 uint len = obs*sizeof(Point) + 2; 3 vector<char> str(len); //声明可变数组 ,对于vector来说,vector本身就已经初始化了。不用在用memset()在初始化一遍了。 4 // memset(&str,0,sizeof(str)); //初始化,赋值为0 5 memcpy(&str,(char*)&matrix,len);//从结构体matrix里面截取部分长度,并赋值给str数组。
1 iSend=sendto(sClient,(char*)&str,len,0,(struct sockaddr*)&ser,iLen);//udp发送端函数
至此,通过稀疏矩阵,将前方一个大的地图中有障碍物的坐标以及类型,通过稀疏矩阵编码,实际上就是一个结构体数组,然后将此结构体数组截取部分字段变为字符数组,并通过UDP传送过去。(注意:UPD通信,无所谓结构体或者结构体数组,其实直接强制类型转换即可。你可以结构体里面套结构体,但,最好标识非零点的个数,这样容易解包。然后,我们就可以通过所谓的强制类型转换即可。(char *)&buffer,buffer为一个字节数组,或者结构体,或者二维数组名,一维数组名都可以。