自定义序列化技术1(稀疏矩阵)
注:稀疏矩阵其实就是结构体数组。
.cpp文件
1 #pragma once 2 /*************************************************************************/ 3 #using <system.dll> 4 #using <system.messaging.dll> 5 #using <System.Runtime.Serialization.Formatters.Soap.dll>//这个里面包含二进制流序列化 6 using namespace System; 7 using namespace System::IO; 8 using namespace System::Runtime::Serialization::Formatters::Binary; 9 typedef unsigned short int uint; 10 /************************************************************************/ 11 //三元组 12 typedef struct Point 13 { 14 uint x;//行号 x坐标 15 uint y;//列号 y坐标 16 Byte value; 17 //Byte val; //type类型,T的类型可变。模板函数指的是函数模板的一种实例化,具体化(函数模板的实例化)。 18 } Point; 19 //稀疏矩阵声明 20 21 [Serializable] //用于序列化的标志之一 22 ref class SparseMatrix //稀疏矩阵类 模板类 是一种具体的、实实在在的函数的定义(类模板的实例化)。 23 { 24 public: 25 SparseMatrix(); //初始化,最大结构体的长度,注:这个是可变的。用一个全局变量来表示即可。初始化为非零元素的最大个数。 26 ~SparseMatrix(); //析构函数。释放资源 27 public: 28 Point* point ; 29 uint rows; //稀疏矩阵的行号 可以不需要 30 uint cols; //稀疏矩阵的列号 31 uint terms; //稀疏矩阵中非零元素的个数 32 }; //存储非零元素的个数及一个表示矩阵行数、列数三元组,这个三元组主要是为了存储结构体数组而建立的。
.h文件
1 #include "StdAfx.h" 2 #include "SparseMatrix.h" 3 4 5 /********************************************************************/ 6 7 SparseMatrix ::SparseMatrix() //构造函数 生存 8 { 9 terms = 0; 10 rows = 0; 11 cols = 0; 12 point = new Point[2]; 13 } 14 SparseMatrix ::~SparseMatrix() //析构函数 毁灭 15 { 16 if (point!=NULL) 17 { 18 delete[] point; 19 } 20 } 21 /*********************************************************************/
以上程序出现的问题:假如你在不要求通信的情况下,是完全符号要求的。当你涉及到通信,就会出问题。因为在sizeof(sparsematrix)的时候,你的结构体数组它是没有全部算进去的,而是算了一个结构体类型的指针。这点需要特别注意。当然,从理论上讲我们可以人为的算出点的个数,然后在udp通信的时候,可以人为指定。当然,这么做比较麻烦。
为了解决跳变的问题。 补充一个小知识:在调试的时候,加上ctrl + F5,就是只开始执行但并不调试。注意,先要按下F5,在按完F5的情况下,按ctrl+F5,这样就不用每次都敲<conio.h> 然后加上 getch()进行调试了。
C++里面用到string类型数据,需要加上两个东西:include <String> using namespace std; 不加命名空间,程序就不知道该到哪个文件夹下面找某个函数了。
调试技巧: 快速监视,可以查看指向数组的指针,即这个这个数组的首地址。然后,还有那个小针的使用。可以让其保留在某一个位置。
我们还可以改变字符的显示方式,数值显示还是二进制显示。
1 typedef unsigned short int uint; 2 typedef unsigned char uchar; 3 4 typedef struct Point //定义稀疏矩阵的结点 5 { 6 uint x; //坐标 7 uint y; 8 uchar value; //值 9 uchar U; //保留的值 10 } Point; 11 typedef struct Matrix //定义稀疏矩阵 12 { 13 uint Num; //非零点的个数 14 Point *point; //这点很重要,此处我们在算长度的时候,根本算不上长度,经常会出错。我们可以用 Point point[100] 来替代。 15 ??此处很重要,一般情况下,我们需要直接定义数组,然后开辟空间。 16 } Matrix;
接着上面的分析,我们假如不做数据传输,只是做一般的应用程序,按上面的Point *point; 然后在动态开辟空间完全可以,比如 point = new Point[100];
开辟100个数组,然后我们完全可以引用它。但是,在做UDP传输是,这样的做法会出现问题。我们无法sizeof(matrix);的实际长度,而是把指针的长度返回给你。
注意:
strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
与这个需要区分开来。
但是,当我们做udp传输的时候,必须是固定的字节长度。所以,不能用Point *point来定义。一般情况下,指针大小就是4个字节。