📄 signal.cpp
字号:
#include "StdAfx.h"
LinkList * ReadInputSignal(char * inputfile,int & inputnum)
{
char temp[255];
string str,lastTimeBuf;
bool signal[255];
int signal_Num,i,lastTime[255];
LinkList *input;
input=new LinkList[255];
inputnum = 0;
ifstream inputFile_Value;
inputFile_Value.open(inputfile,ios_base::binary);
while(inputFile_Value.good())
{
inputFile_Value.getline(temp,255,'\n'); //用temp保存其中的一行
if (temp[0] == '#'||temp[0] == 13) //除去无用信息
{
temp[0] = '\0';
}
else
{
str = temp;
if (!str.find("system")) //找到有输入信息的一行
{
inputnum++;
signal_Num = 0;
int j = 0;
for(i = 0;temp[i] != '\0';i++)
{
if(temp[0] == ',')
i = 0;
if(temp[i] == ':'||temp[i] == ',')
{
signal_Num++;
for (int k = str.find('(')+1;k<str.find(')');k++) //找到括号中的持续时间
{
lastTimeBuf+=temp[k];
}
if(temp[i+1] == '1')
signal[j] = true;
else if(temp[i+1] == '0')
signal[j] = false;
else
{
cout<<"INPUT SIGNAL ERROR!"<<endl<<"Press any button to exit."<<endl;
getche();
exit(1);
}
lastTime[j] = atoi(lastTimeBuf.c_str());
j++;
lastTimeBuf.resize(0); //清空持续时间
str.assign(str,str.find_first_of(')')+1,str.length());
strcpy(temp,str.c_str());
} //end of if
} //end of for
input[inputnum-1] = ListCreate(signal,lastTime,signal_Num); //每一行建一个链表
continue;
} //end of if
} //end of else
} //end of while
return input;
}
/*---------------------------------查找Map文件中的有用信息----------------------------*/
LinkList * DealInputSignal(char * mapfile,LinkList * inputsignal,int & outputnum)
{
string device[6] = {"AND","OR","NOT","NAND","XOR","NXOR"};
string str;
char temp[255];
int pin;//是哪个管脚
int isfind;
int i;
outputnum = 0;
ifstream inputfile_Map;
/*-------------------------------------Element-------------------------------------*/
int device_no;//记录器件种类
DeviceAND and[20]; DeviceOR or[20]; DeviceNOT not[20];
DeviceNAND nand[20]; DeviceXOR xor[20]; DeviceNXOR nxor[20];
string devicename;
int devicenumber = 0; //记录器件的总个数
int devicenum[6]={0,0,0,0,0,0};
// int n = 0;
inputfile_Map.open(mapfile,ios_base::in);
while (inputfile_Map.good())
{
inputfile_Map.getline(temp,255,'\n'); //用temp保存其中的一行
str = temp;
isfind = str.find("EndElement");
if (temp[0] == '#'||str.length()==0||(str.find("Element")==0)) //除去无用信息
{
temp[0] = '\0';
}
else if(isfind!=string::npos)
{
inputfile_Map.close();
break;
}
else
{
devicenumber++;
}
}
// cout<<devicenumber<<endl;
if(inputfile_Map.is_open())
inputfile_Map.close();
inputfile_Map.clear();
inputfile_Map.open(mapfile,ios_base::in);
while (inputfile_Map.good())
{
inputfile_Map.getline(temp,255,'\n'); //用temp保存其中的一行
str = temp;
isfind = str.find("EndElement");
if (temp[0] == '#'||str.length()==0||(str.find("Element"))==0) //除去无用信息
{
temp[0] = '\0';
}
else if(isfind!=string::npos)
{
inputfile_Map.close();
break;
}
else
{
device_no = 0;
i = str.find(":");
devicename.resize(0);
if(i!=string::npos)
{
for (i=str.find(":")+1;temp[i]!='\0';i++)
{
devicename+=temp[i];
}
}
// cout<<n<<devicename[n]<<endl;
// n++;
str.resize(0); //str清空
for (i=0;temp[i]!='\0';i++)//寻找冒号
{
if(temp[i]==':')
break;
}
if(temp[i]!='\0')
{
for(int j=0;j<i;j++)
str += temp[j];//str存储器件名
// cout<<str<<endl;
}
for(i=0;i<6;i++)
{
if(str == device[i]) //具体为什么器件
{
device_no = i+1;
break;
}
}
switch (device_no) //确定器件类型
{
case 1:
// cout<<devicename.c_str()<<endl;
strcpy(and[devicenum[0]].name, devicename.c_str());
// cout<<devicenum[0]<<endl<<and[devicenum[0]].name<<endl;
devicenum[0]++;
// cout<<devicenum[0]<<endl;
break;
case 2:
strcpy(or[devicenum[1]].name, devicename.c_str());
// cout<<devicenum[1]<<endl<<or[devicenum[1]].name<<endl<<and[0].name<<endl;
devicenum[1]++;
// cout<<devicenum[1]<<endl;
break;
case 3:
strcpy(not[devicenum[2]].name, devicename.c_str());
devicenum[2]++;
// cout<<devicenum[3]<<endl;
break;
case 4:
strcpy(nand[devicenum[3]].name, devicename.c_str());
devicenum[3]++;
// cout<<devicenum[4]<<endl;
break;
case 5:
strcpy(xor[devicenum[4]].name, devicename.c_str());
devicenum[4]++;
// cout<<devicenum[4]<<endl;
break;
case 6:
strcpy(nxor[devicenum[5]].name, devicename.c_str());
devicenum[5]++;
break;
default:
break;
}
for (i = 0; i < 6; i++)
{
if (devicenum[i]>19)
{
cout<<"每种器件最多19个,按任意键退出\n"<<endl;
getch();
exit(1);
}
}
}
}
/*---------------------------------Element END-----------------------------------*/
/*------------------------------------Input--------------------------------------*/
string devicetemp;
int signalstep;
if(inputfile_Map.is_open())
inputfile_Map.close();
inputfile_Map.clear();
inputfile_Map.open(mapfile,ios_base::in);
while (inputfile_Map.good())
{
inputfile_Map.getline(temp,255,'\n'); //用temp保存其中的一行
str = temp;
if(!str.find("EndMap"))
{
inputfile_Map.close();
break;
}
isfind = str.find("Input");
if (isfind!=string::npos)
{
devicetemp.resize(0);
signalstep = (int)temp[str.find(",")-1]-49;//判断是第几个输入
// cout<<"signalstep"<<signalstep<<endl;
for (i=str.find(",")+1;i<str.find_last_of(".");i++)//判断接受输入信号的器件
{
if(temp[i]!=' ')
devicetemp+=temp[i];
}
for (i=i+1;temp[i]!='\0';i++) ;//判断器件的管脚
if(temp[i-1]=='1')
pin = 1;
else if(temp[i-1]=='2')
pin = 2;
else
{
cout<<"器件管脚有误,请检查"<<endl<<"按任意键退出";
getch();
exit(1);
}
for (i=0;i<6;i++)
{
for (int j=0;j<devicenum[i];j++)
{
switch (i)
{
case 0:
// cout<<j<<endl<<and[j].name<<endl<<devicetemp.c_str()<<endl;
if(strcmp(and[j].name, devicetemp.c_str()) == 0)
{
if (pin == 1)
{
and[j].SetInput1(inputsignal[signalstep]);
and[j].SetInputTag1();
}
else
{
and[j].SetInput2(inputsignal[signalstep]);
and[j].SetInputTag2();
}
}
break;
case 1 :
if(strcmp(or[j].name, devicetemp.c_str()) == 0)
{
if (pin == 1)
{
or[j].SetInput1(inputsignal[signalstep]);
or[j].SetInputTag1();
}
else
{
or[j].SetInput2(inputsignal[signalstep]);
or[j].SetInputTag2();
}
}
break;
case 2:
if(strcmp(not[j].name, devicetemp.c_str()) == 0)
{
if(pin == 1)
{
not[j].SetInput(inputsignal[signalstep]);
not[j].SetInputTag();
}
else
{
cout<<"非门有误,请更正\n按任意键退出";
getch();
exit(1);
}
}
break;
case 3:
if(strcmp(nand[j].name, devicetemp.c_str()) == 0)
{
if(pin == 1)
{
nand[j].SetInput1(inputsignal[signalstep]);
nand[j].SetInputTag1();
}
else
{
nand[j].SetInput2(inputsignal[signalstep]);
nand[j].SetInputTag2();
}
}
break;
case 4:
if(strcmp(xor[j].name, devicetemp.c_str()) == 0)
{
if(pin ==1)
{
xor[j].SetInput1(inputsignal[signalstep]);
xor[j].SetInputTag1();
}
else
{
xor[j].SetInput2(inputsignal[signalstep]);
xor[j].SetInputTag2();
}
}
break;
case 5:
if(strcmp(nxor[j].name, devicetemp.c_str()) == 0)
{
if(pin == 1)
{
nxor[j].SetInput1(inputsignal[signalstep]);
nxor[j].SetInputTag1();
}
else
{
nxor[j].SetInput2(inputsignal[signalstep]);
nxor[j].SetInputTag2();
}
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -