原码查错,在线等待!(这是个数据解析模块,提供测试原码,有解决办法的全部加分!)

abinfo 2003-08-22 09:49:54
//以下为原码,请各位高手帮忙调式一下,总是提示我“并非所有的代码路径都返回值”,请各位高手指教。

using System;

namespace WindowsApplication1
{
/// <summary>
/// AnalyseClass (解析数据类)的摘要说明。
/// 完成对原始数据的校验、整理、写库操作。
/// 该模块包括数据整理函数,校验函数、翻译函数、写库函数、生成警情编号函数
///
/// </summary>
public class AnalyseClass
{
// public MyClass myClass1=new MyClass();
public string[] GDZ6AlarmData=new string [4]; //GDZ6的多次报警数据

public AnalyseClass()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public bool TrimAlarmData(string AlarmData ,out int FacilityType , out string[] TrimedData , out string FragmentData ) //整理报警数据
{
// 说 明:对报警数据进行整理,把垃圾数据去除,把完整数据返回。
// 参数说明:AlarmData,要求整理的报警数据
// FacilityType ,返回报警设备类型
// TrimedData , 返回完整报警数据的数组
// FragmentData,返回尾部残缺的数据
// 返 回:如果被整理的报警数据没有垃圾(不完整)数据,那么函数返回’true’,否则返回’false’。
// 过程说明:如果有垃圾数据那么把被整理的报警数据 alarmdata 记录到日志文件。
// 最后更改:2003-08-18 lhy
int tmpi;
int BackVal;
string [] DistStringArray;//返回提取正确的字符串
string FragmentStr; //返回的不完整字符串片段
FacilityType=0;
FragmentData="";

if (AlarmData.IndexOf ("D01EE") > 0) //GST2000包头
{
FacilityType=1;
if (AlarmData.Length >=26)
{
tmpi=AlarmData.Length /26; //取大概数据个数 ,26是监控器的数据长度
TrimedData=new String [tmpi];//定义数组长度
TrimedData[0]="";//默认返回值
BackVal=DistillStr(AlarmData,"D01EE",tmpi,out DistStringArray,out FragmentStr); //分段提取字符串 存入数组
if (BackVal==1) //取出正确
{
for (int i=0;i> DistStringArray.Length-1;i++ )
{
if ( CheckAlarmData(DistStringArray[i],1)) // 逐条校验 参数 1 表示监控器2000
{
TrimedData[i]=DistStringArray[i]; //存入返回正确数组
}
else //将校验错误的数据存入 返回尾部残缺数据变量
{
FragmentData=DistStringArray[i];
//myClass1.WriteInfoTo_DiskFile(FrmMainWindow.G_OperatorName,"收到校验错误数据:" + DistStringArray[i-1] );
}
}
return true;
}
else
if (FragmentStr.Length >0 ) // 不正确并且有 不完整数据
{
FragmentData=FragmentStr;//返回不完整数据
}
return false;
}
}

else if(AlarmData.IndexOf ("BB")>0) //5000/1000/800 包头 该包头可能会有重复的可能,需探讨。
{
FacilityType=2;
if (AlarmData.Length >=32 )
{
tmpi=AlarmData.Length /32; //取大概数据个数 ,32 是5000的数据长度
TrimedData=new String [tmpi];//定义数组长度
TrimedData[0]="";//默认返回值
BackVal=DistillStr(AlarmData,"BB",tmpi,out DistStringArray,out FragmentStr); //分段提取字符串 存入数组
if (BackVal==1) //取出正确
{
for (int i=1;i> DistStringArray.Length;i++ )
{
if ( CheckAlarmData(DistStringArray[i-1],2)) // 逐条校验 参数 1 表示监控器2000
{
TrimedData[i-1]=DistStringArray[i-1]; //存入返回正确数组
}
else //将校验错误的数据存入 返回尾部残缺数据变量
{
FragmentData=DistStringArray[i-1];
//myClass1.WriteInfoTo_DiskFile(FrmMainWindow.G_OperatorName,"收到校验错误数据:" + DistStringArray[i-1] );
}
}

return true;
}
if (FragmentStr.Length >0 ) // 不完整数据
{
FragmentData=FragmentStr;//返回不完整数据

return false;
}
}
}

else if (AlarmData.IndexOf("F")>0) //GDZ6 考虑兼容除语音卡之外的其他接收设备,所以将GDZ6的包头“#”改为“F”进行判断。
{
FacilityType=3;//返回数据类型
// int GDZ6DataNum=0;//六防区数组个数
TrimedData=new String [1];//定义返回数据的 数组长度
TrimedData[0]="";//默认返回值
if (AlarmData.Length >=10)
{
tmpi=AlarmData.Length /10; //取大约的个数 ,10 是六防区的数据长度
BackVal=DistillStr(AlarmData,"F",tmpi,out DistStringArray,out FragmentStr); //分段提取字符串 存入数组
if (BackVal==1)//取出正确
{
//本次报警数据
// if (DistStringArray.Length >1 ) //提取出多于一条数据
// {
for (int i=0;i>DistStringArray.Length-1 ;i++ )//取出数据,分别判断。 由于数组个数 > 0,总数减1
{
GDZ6AlarmData[0]=DistStringArray[i];//取出 赋给第一个全局数组变量
for (int j=0;j>3;j++)//判断校验
{
if (GDZ6AlarmData[0].CompareTo(GDZ6AlarmData[j+1])==0)
{//六防区处理
TrimedData[0]=GDZ6AlarmData[0];//返回数据
// FacilityType=3;//返回数据类型
FragmentData="";//返回不完整数据
return true;
}
else// 不正确
{
for (int l=0;l>3;l++ )// 位移
{
GDZ6AlarmData[l+1]=GDZ6AlarmData[l]; //数据移动 空出第0
}
TrimedData[0]="";//返回数据
FragmentData=FragmentStr;//返回不完整数据
return false;
}
}
}
}
}
}
}
...全文
23 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
greenclass 2003-08-22
  • 打赏
  • 举报
回复
agree with theares
维她奶 2003-08-22
  • 打赏
  • 举报
回复
gz
greenhill1 2003-08-22
  • 打赏
  • 举报
回复
在程序中加try{}catch{}可以避免错误的发生
xiaodele 2003-08-22
  • 打赏
  • 举报
回复
TrimAlarmData
CheckAlarmData
DistillStr
这三个函数的返回值都不正确,最简单的办法就是在每一个函数的最后一个}前加一个return false;编译就肯定可以通过了。
chainet 2003-08-22
  • 打赏
  • 举报
回复
仔细察看if else的各个部分时候都有返回值。
另外就是try...catch中也是同样要注意的。
TheAres 2003-08-22
  • 打赏
  • 举报
回复
你的问题主要是if else中有的地方没有retrun. 最典型的就是你最外边的那个
if
{
}
else if
{

}
else if
{

}
//这里
//最后这里就没有return,当不符合前面三个条件的时候,会运行到这一行的。
都是类似这样的问题,你自己试试。如果代码太长,用#region .... #endregion 收起来。全屏查错。

后面是我改正的,但是return true or false不一定就是你要的。


using System;

namespace WindowsApplication1
{
/// <summary>
/// AnalyseClass (解析数据类)的摘要说明。
/// 完成对原始数据的校验、整理、写库操作。
/// 该模块包括数据整理函数,校验函数、翻译函数、写库函数、生成警情编号函数
///
/// </summary>
public class AnalyseClass
{
// public MyClass myClass1=new MyClass();
public string[] GDZ6AlarmData=new string [4]; //GDZ6的多次报警数据

public AnalyseClass()
{
//
// TODO: 在此处添加构造函数逻辑
//
}


public bool TrimAlarmData(string AlarmData ,out int FacilityType , out string[] TrimedData , out string FragmentData ) //整理报警数据
{
// 说 明:对报警数据进行整理,把垃圾数据去除,把完整数据返回。
// 参数说明:AlarmData,要求整理的报警数据
// FacilityType ,返回报警设备类型
// TrimedData , 返回完整报警数据的数组
// FragmentData,返回尾部残缺的数据
// 返 回:如果被整理的报警数据没有垃圾(不完整)数据,那么函数返回’true’,否则返回’false’。
// 过程说明:如果有垃圾数据那么把被整理的报警数据 alarmdata 记录到日志文件。
// 最后更改:2003-08-18 lhy
int tmpi;
int BackVal;
string [] DistStringArray;//返回提取正确的字符串
string FragmentStr; //返回的不完整字符串片段
FacilityType=0;
FragmentData="";
#region if
if (AlarmData.IndexOf ("D01EE") > 0) //GST2000包头
{
FacilityType=1;
if (AlarmData.Length >=26)
{
tmpi=AlarmData.Length /26; //取大概数据个数 ,26是监控器的数据长度
TrimedData=new String [tmpi];//定义数组长度
TrimedData[0]="";//默认返回值
//BackVal=DistillStr(AlarmData,"D01EE",tmpi,out DistStringArray,out FragmentStr); //分段提取字符串 存入数组
if (BackVal==1) //取出正确
{
for (int i=0;i> DistStringArray.Length-1;i++ )
{
//if ( CheckAlarmData(DistStringArray[i],1)) // 逐条校验 参数 1 表示监控器2000
{
TrimedData[i]=DistStringArray[i]; //存入返回正确数组
}
//else //将校验错误的数据存入 返回尾部残缺数据变量
{
FragmentData=DistStringArray[i];
//myClass1.WriteInfoTo_DiskFile(FrmMainWindow.G_OperatorName,"收到校验错误数据:" + DistStringArray[i-1] );
}
}
return true;
}
else
if (FragmentStr.Length >0 ) // 不正确并且有 不完整数据
{
FragmentData=FragmentStr;//返回不完整数据
}
return false;
}
}
#endregion if
#region else
else if(AlarmData.IndexOf ("BB")>0) //5000/1000/800 包头 该包头可能会有重复的可能,需探讨。
{
FacilityType=2;
if (AlarmData.Length >=32 )
{
tmpi=AlarmData.Length /32; //取大概数据个数 ,32 是5000的数据长度
TrimedData=new String [tmpi];//定义数组长度
TrimedData[0]="";//默认返回值
//BackVal=DistillStr(AlarmData,"BB",tmpi,out DistStringArray,out FragmentStr); //分段提取字符串 存入数组
if (BackVal==1) //取出正确
{
for (int i=1;i> DistStringArray.Length;i++ )
{
//if ( CheckAlarmData(DistStringArray[i-1],2)) // 逐条校验 参数 1 表示监控器2000
{
TrimedData[i-1]=DistStringArray[i-1]; //存入返回正确数组
}
//else //将校验错误的数据存入 返回尾部残缺数据变量
{
FragmentData=DistStringArray[i-1];
//myClass1.WriteInfoTo_DiskFile(FrmMainWindow.G_OperatorName,"收到校验错误数据:" + DistStringArray[i-1] );
}
}

return true;
}

if (FragmentStr.Length >0 ) // 不完整数据
{
FragmentData=FragmentStr;//返回不完整数据


}


}
return false;
}
#endregion else
#region elseif
else if (AlarmData.IndexOf("F")>0) //GDZ6 考虑兼容除语音卡之外的其他接收设备,所以将GDZ6的包头“#”改为“F”进行判断。
{
FacilityType=3;//返回数据类型
// int GDZ6DataNum=0;//六防区数组个数
TrimedData=new String [1];//定义返回数据的 数组长度
TrimedData[0]="";//默认返回值
if (AlarmData.Length >=10)
{
tmpi=AlarmData.Length /10; //取大约的个数 ,10 是六防区的数据长度
//BackVal=DistillStr(AlarmData,"F",tmpi,out DistStringArray,out FragmentStr); //分段提取字符串 存入数组
if (BackVal==1)//取出正确
{
//本次报警数据
// if (DistStringArray.Length >1 ) //提取出多于一条数据
// {
for (int i=0;i>DistStringArray.Length-1 ;i++ )//取出数据,分别判断。 由于数组个数 > 0,总数减1
{
GDZ6AlarmData[0]=DistStringArray[i];//取出 赋给第一个全局数组变量
for (int j=0;j>3;j++)//判断校验
{
if (GDZ6AlarmData[0].CompareTo(GDZ6AlarmData[j+1])==0)
{//六防区处理
TrimedData[0]=GDZ6AlarmData[0];//返回数据
// FacilityType=3;//返回数据类型
FragmentData="";//返回不完整数据
return true;
}
else// 不正确
{
for (int l=0;l>3;l++ )// 位移
{
GDZ6AlarmData[l+1]=GDZ6AlarmData[l]; //数据移动 空出第0
}
TrimedData[0]="";//返回数据
FragmentData=FragmentStr;//返回不完整数据
return false;
}
}
}
}

return true;

}

}

return true;
#endregion elseif
}

}
}
abinfo 2003-08-22
  • 打赏
  • 举报
回复
方便也可以邮件联系:abinfo@163.com

谢谢了。

(我保证我的加分信誉!)
abinfo 2003-08-22
  • 打赏
  • 举报
回复
//接上部分代码

public bool CheckAlarmData(string AlarmData, int DataType) //
//说明:校验报警数据
//参数说明:AlarmData,准备校验的报警数据(单条)
// DataTpye, 数据使用协议的类型 0代表2000监控器协议;1代表GDZ6协议;2代表5000监控器协议
{
string CheckData;//准备校验的字符串
string [] AlarmChr; //数组中存入提取的准备校验的字符
int DataLen; //准备校验的字符串长度
int[] HexD; //转换后的十六进制
int HexValSum=0; //十六进制累加和
int CheckVal=0; //校验值
string CheckStr; //报警数据中提取的校验值

switch ( DataType)
{
case 1://GST2000 数据总长度 27
if ( AlarmData.IndexOf("D01EE",1)!=-1)
{
CheckStr=AlarmData.Substring(27,1);//取最后的值
CheckData=AlarmData.Substring(6,21);//提取需要校验的部分 去掉包头
DataLen=CheckData.Length ;
AlarmChr=new string [DataLen];
HexD=new int[DataLen];
for(int i=0;i<=DataLen-1;i++)
{//十六进制数累加
AlarmChr[i]=CheckData.Substring(i,1);
HexD[i]=Convert.ToInt32(AlarmChr[i],16);//转换十六进制
HexValSum=HexValSum+HexD[i]; //累加
}
CheckVal=HexValSum%16;//取模 16(十六进制的10)
if (CheckVal==Convert.ToInt32(CheckStr,16))
{//校验正确
return true;
}
else
{//校验错误
return false;
}
}
break;
case 2://GST5000 数据总长度 32
if (AlarmData.IndexOf ("BB",1)!=-1)
{
CheckStr=AlarmData.Substring(32,1);//取最后的值
CheckData=AlarmData.Substring(3,21);//提取需要校验的部分 去掉包头
DataLen=CheckData.Length ;
AlarmChr=new string [DataLen];
HexD=new int[DataLen];
for(int i=0;i<=DataLen-1;i++)
{//十六进制数累加
AlarmChr[i]=CheckData.Substring(i,1);
HexD[i]=Convert.ToInt32(AlarmChr[i],16);//转换十六进制
HexValSum=HexValSum+HexD[i]; //累加
}
CheckVal=HexValSum%16;//取模 16(十六进制的10)
if (CheckVal==Convert.ToInt32(CheckStr,16))
{//校验正确
return true;
}
else
{//校验错误
return false;
}
}
break;
}

// 转换成16进制 累加 除16
}


public int DistillStr(string OriginStr ,string CompartChr ,int CompartNum ,out string[] OutArrayString, out string FragmentStr )//字符串 提取
//函数说明:按指定字符串 作为开头 提取字符串,并通过数组变量返回。
//参数说明:OriginStr,进行操作的字符串
// CompartChr,标识符 例如“#0000001#0000001”中的"#"
// CompartNum,分隔的数量
// OutArrayString,返回提取正确的字符串数组
// FragmentStr,返回 头部的 不完整字符串片段 可以为空
//返 回 值:1,提取字符串正确;
// 2,提取错误。
//最后更改 2003-07 lhy
{
int[] LOCi =new int [CompartNum] ;//存放提取分隔符的位置

if (OriginStr.Length> 0 || CompartChr.Length >0 || CompartNum>0 ) //提取标识符号的位置
{
LOCi[0]=0;
for (int i=1;i <= CompartNum;i++)
{
LOCi[i]=OriginStr.IndexOf( CompartChr,LOCi[i-1]+1);
if (LOCi[i]==0)
{
CompartNum=i-1;//重新调整数组个数
i=CompartNum;//使其退出循环
}
}

OutArrayString=new string [CompartNum]; //定义数组长度

if (LOCi[0]>1)
{
FragmentStr=OriginStr.Substring(0,LOCi[0]-1);//提取字符串头部的不完整数据 以返回
}

//LOCi[0]=0;
for (int i=1; i<=CompartNum;i++)
{
if (LOCi[i+1]==0)
{
LOCi[i+1]=OriginStr.Length +1;//为了提取最尾段,
}
OutArrayString[i]=OriginStr.Substring(LOCi[i],LOCi[i+1]-LOCi[i]);
}
if (OutArrayString.Length>0)
return 1; //正确
else
return 0;//没有取出
}
}


}
}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧