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

     

     

  • 相关阅读:
    mysql 中文字段排序( UTF8按拼音首字母排序)
    输入输出挂
    HDU 6301 贪心
    HDU1533 最小费用最大流
    POJ 2135 最小费用最大流 入门题
    HDU 6278 主席树(区间第k大)+二分
    HDU3549 最大流 裸题
    2018牛客网暑期ACM多校训练营(第一场)D图同构,J
    POJ 1804 逆序对数量 / 归并排序
    Codeforces Round #489 (Div. 2) B、C
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3516281.html
Copyright © 2020-2023  润新知