自定义序列化技术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个字节。

 

 

原文地址:https://www.cnblogs.com/zhuxuekui/p/3516281.html