注:稀疏矩阵其实就是结构体数组。
.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 //稀疏矩阵声明
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 }; //存储非零元素的个数及一个表示矩阵行数、列数三元组,这个三元组主要是为了存储结构体数组而建立的。
1 #include "StdAfx.h"
2 #include "SparseMatrix.h"
5 /********************************************************************/
7 SparseMatrix ::SparseMatrix() //构造函数 生存
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;
4 typedef struct Point //定义稀疏矩阵的结点
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个字节。