📄 signal.cpp
字号:
default :
break;
}
}
}
}
}
/*-------------------------------Input END ---------------------------*/
/*--------------------------------Connect----------------------------*/
int connum = 0,flag = 0; //connum记录Connect个数,flag记录已经运行了的Connect语句
bool isconnect[6][20]={true}; //记录本器件是否已经计算过了
for (i = 0; i < 6; i++)
for (int j = 0; j < 20; j++)
{
isconnect[i][j] = true;
}
string con_out,con_in;
LinkList outtemp;
if(inputfile_Map.is_open())
inputfile_Map.close();
inputfile_Map.clear();
inputfile_Map.open(mapfile,ios_base::binary);
//判断共有多少个输出
while (inputfile_Map.good())
{
str.resize(0);
inputfile_Map.getline(temp,255,'\n');
str = temp;
isfind = str.find("Connect");
if (isfind!=string::npos)
connum++;
}
// cout<<"connum="<<connum<<endl;
//建立连接
if(inputfile_Map.is_open())
inputfile_Map.close();
inputfile_Map.clear();
inputfile_Map.open(mapfile,ios_base::binary);
while(flag < connum)
{
str.resize(0);
inputfile_Map.getline(temp,255,'\n');
str = temp;
isfind = str.find("Connect");
if (isfind!=string::npos)//本行包含"Connect"
{
con_out.resize(0); con_in.resize(0);
for (i=str.find(":")+1;i<str.find(".");i++)//con_out记录输出信号的器件名字
con_out+=temp[i];
for(i=str.find(",")+1;i<str.find_last_of(".");i++)//con_in记录接收信号的器件名字
con_in+=temp[i];
// cout<<"输入名字"<<con_in<<endl;
for (i=i+1;temp[i]!='\0';i++);//判断接收信号器件的管脚
if(temp[i-2]=='1')
pin = 1;
else if(temp[i-2]=='2')
pin = 2;
else
{
cout<<"器件管脚有误,请检查"<<endl<<"按任意键退出";
getch();
exit(1);
}
outtemp = NULL;//临时输出缓冲计算前为空
//--------------------读取输出--------------------
for (i=0;i<6;i++)
{
for (int j=0;j<devicenum[i];j++)
{
switch (i)
{
case 0:
if(strcmp(and[j].name, con_out.c_str()) == 0)
if(and[j].Ifinput()&&isconnect[0][j])
{
and[j].GetResponse();
outtemp = and[j].GetOutput();
flag++; isconnect[0][j]=false;
}
break;
case 1 :
if(strcmp(or[j].name, con_out.c_str()) == 0)
if(or[j].Ifinput()&&isconnect[1][j])
{
or[j].GetResponse();
outtemp = or[j].GetOutput();
flag++; isconnect[1][j]=false;
}
break;
case 2:
if(strcmp(not[j].name, con_out.c_str()) == 0)
if (not[j].Ifinput()&&isconnect[2][j])
{
not[j].GetResponse();
outtemp = not[j].GetOutput();
flag++; isconnect[2][j]=false;
}
break;
case 3:
if(strcmp(nand[j].name, con_out.c_str()) == 0)
if (nand[j].Ifinput()&&isconnect[3][j])
{
nand[j].GetResponse();
outtemp = nand[j].GetOutput();
flag++; isconnect[3][j]=false;
}
break;
case 4:
if(strcmp(xor[j].name, con_out.c_str()) == 0)
if (not[j].Ifinput()&&isconnect[4][j])
{
xor[j].GetResponse();
outtemp = xor[j].GetOutput();
flag++; isconnect[4][j]=false;
}
break;
case 5:
if(strcmp(nxor[j].name, con_out.c_str()) == 0)
if (not[j].Ifinput()&&isconnect[5][j])
{
nxor[j].GetResponse();
outtemp = nxor[j].GetOutput();
flag++; isconnect[5][j]=false;
}
break;
default :
break;
}//end of switch(i)
}//end of for(j)
}//end of for(i)
//-----------------------将输出赋给相应的器件-------------
if (outtemp!=NULL)//本行已经计算输出
{
for (i=0;i<6;i++)
{
for (int j=0;j<devicenum[i];j++)
{
switch (i)
{
case 0:
if(strcmp(and[j].name, con_in.c_str()) == 0)
{
if (pin == 1)
{
and[j].SetInput1(outtemp);
and[j].SetInputTag1();
}
else
{
and[j].SetInput2(outtemp);
and[j].SetInputTag2();
}
}
break;
case 1 :
if(strcmp(or[j].name, con_in.c_str()) == 0)
{
if (pin == 1)
{
or[j].SetInput1(outtemp);
or[j].SetInputTag1();
}
else
{
or[j].SetInput2(outtemp);
or[j].SetInputTag2();
}
}
break;
case 2:
if(strcmp(not[j].name, con_in.c_str()) == 0)
{
if(pin == 1)
{
not[j].SetInput(outtemp);
not[j].SetInputTag();
}
else
{
cout<<"非门有误,请更正\n按任意键退出……";
getch();
exit(1);
}
}
break;
case 3:
if(strcmp(nand[j].name, con_in.c_str()) == 0)
{
if(pin == 1)
{
nand[j].SetInput1(outtemp);
nand[j].SetInputTag1();
}
else
{
nand[j].SetInput2(outtemp);
nand[j].SetInputTag2();
}
}
break;
case 4:
if(strcmp(xor[j].name, con_in.c_str()) == 0)
{
if(pin ==1)
{
xor[j].SetInput1(outtemp);
xor[j].SetInputTag1();
}
else
{
xor[j].SetInput2(outtemp);
xor[j].SetInputTag2();
}
}
break;
case 5:
if(strcmp(nxor[j].name, con_in.c_str()) == 0)
{
if(pin == 1)
{
nxor[j].SetInput1(outtemp);
nxor[j].SetInputTag1();
}
else
{
nxor[j].SetInput2(outtemp);
nxor[j].SetInputTag2();
}
}
break;
default :
break;
}//end of switch(i)
}//end of for(j)
}//end of for(i)
}//end of if(outtemp!=NULL)
}//end of if(isfind!=string::npos)
if (str.find("EndMap")!=string::npos)//文件到了最后一行但Connecet未完成
{
if (flag < connum)
{
inputfile_Map.close();//关闭输入流
inputfile_Map.clear();//清空
inputfile_Map.open(mapfile,ios_base::binary);//重新打开,在扫描一遍
}
}
}//end of while(flag<connum)
/*------------------------------Connect END-------------------------------------*/
/*----------------------------------Output----------------------------------------*/
LinkList * output;
string deviceout;//记录输出器件名称
if(inputfile_Map.is_open())
inputfile_Map.close();
inputfile_Map.clear();
inputfile_Map.open(mapfile,ios_base::binary);
while (inputfile_Map.good())//查看有多少个输出信号
{
str.resize(0);
inputfile_Map.getline(temp,255,'\n');
str = temp;
isfind = str.find("Output");
if (isfind!=string::npos)
outputnum++;
}
output = new LinkList[outputnum];
if(inputfile_Map.is_open())
inputfile_Map.close();
inputfile_Map.clear();
inputfile_Map.open(mapfile,ios_base::binary);
while (inputfile_Map.good())
{
str.resize(0);
inputfile_Map.getline(temp,255,'\n');
str = temp;
isfind = str.find("Output");
if (isfind!=string::npos)
{
deviceout.resize(0);
for (i=str.find(":")+1;i<str.find_first_of(".");i++)
{
deviceout+=temp[i];//deviceout记录输出信号的器件的名字
}
for(i=0;temp[i]!='\0';i++);
int m = (int)temp[i-2]-49;//本行的输出是第几个输出信号
for (i=0;i<6;i++)
{
for (int j=0;j<devicenum[i];j++)
{
switch (i)
{
case 0:
if(strcmp(and[j].name, deviceout.c_str()) == 0)
{
and[j].GetResponse();
*(output+m) = and[j].GetOutput();
}
break;
case 1:
if(strcmp(or[j].name, deviceout.c_str()) == 0)
{
or[j].GetResponse();
*(output+m) = or[j].GetOutput();
}
break;
case 2:
if(strcmp(not[j].name, deviceout.c_str()) == 0)
{
not[j].GetResponse();
*(output+m) = not[j].GetOutput();
}
break;
case 3:
if(strcmp(nand[j].name, deviceout.c_str()) == 0)
{
nand[j].GetResponse();
*(output+m) = nand[j].GetOutput();
}
break;
case 4:
if(strcmp(xor[j].name, deviceout.c_str()) == 0)
{
xor[j].GetResponse();
*(output+m) = xor[j].GetOutput();
}
break;
case 5:
if(strcmp(nxor[j].name, deviceout.c_str()) == 0)
{
nxor[j].GetResponse();
*(output+m) = nxor[j].GetOutput();
}
break;
default:
break;
}
}//end of for(j)
}//end of for(i)
}//end of if (isfind!=string::npos)
}
/*----------------------------Output END----------------------------*/
return output;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -