帖子
题目
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct member
{
string type,name;
ll begin_addr;
};
struct Type
{
ll duiqi,space;
vector<member>members;
};
map<string,Type>type_memory;
ll next_addr=0;
vector<member>memory;
void caozuo1()
{
ll k=0,max_duiqi=0;
ll next_addr=0;
string s,t,n;
vector<member>zzz(0);
cin>>s>>k;
for(int i=1;i<=k;i++)
{
cin>>t>>n;
if(!type_memory.count(t))
{
cout<<"undefined type name "<<t<<"\n";
continue;
}
const auto zzz2=type_memory[t];
while(zzz2.duiqi!=0&&next_addr%zzz2.duiqi!=0)++next_addr;
zzz.push_back(member{t,n,next_addr});
next_addr+=zzz2.space;
max_duiqi=max(max_duiqi,zzz2.duiqi);
}
type_memory[s]=Type{max_duiqi,next_addr,zzz};
cout<<next_addr<<' '<<max_duiqi<<'\n';
return;
}
void caozuo2()
{
string t="\0",n="\0";
cin>>t>>n;
if(!type_memory.count(t))
{
cout<<"undefined type name "<<t<<"\n";
return;
}
const auto zzz2=type_memory[t];
while(zzz2.duiqi!=0&&::next_addr%zzz2.duiqi!=0)++::next_addr;
memory.push_back(member{t,n,next_addr});
cout<<::next_addr<<'\n';
::next_addr+=zzz2.space;
return;
}
void caozuo3()
{
string s,zzz;
ll ptr=0;
queue<string>q;
ll k;
member m;
cin>>s;
zzz.clear();
for(int i=0;i<s.size();i++)
{
if(s[i]=='.')
{
q.push(zzz);
zzz.clear();
}
else
zzz+=s[i];
}
if(!zzz.empty())
q.push(zzz);
zzz.clear();
s.clear();
if(q.empty())
{
cout<<'\n';
return;
}
for(k=0;k<memory.size();k++)
{
if(memory[k].name==q.front())
goto success;
}
cout<<"undefined name "<<q.front()<<"\n";
return;
success:
m=memory[k];
ptr+=m.begin_addr;
q.pop();
while(!q.empty())
{
for(k=0;k<type_memory[m.type].members.size();k++)
{
if(type_memory[m.type].members[k].name==q.front())
goto success2;
}
cout<<"undefined name "<<q.front()<<"\n";
return;
success2:
m=type_memory[m.type].members[k];
ptr+=m.begin_addr;
q.pop();
}
cout<<ptr<<'\n';
return;
}
void caozuo4()
{
string wer;
ll addr=0,now_addr=0;
ll k;
member m;
wer.clear();
cin>>addr;
for(k=0;k<memory.size();k++)
{
if(memory[k].begin_addr+now_addr>addr)
break;
}
k-=1;
if(k<0)
{
cout<<"ERR"<<'\n';
return;
}
m=memory[k];
now_addr=m.begin_addr;
wer=m.name;
while(1)
{
for(k=0;k<type_memory[m.type].members.size();k++)
{
if(type_memory[m.type].members[k].begin_addr+now_addr>addr)
break;
}
k-=1;
if(k<0)
{
break;
}
m=type_memory[m.type].members[k];
now_addr+=m.begin_addr;
wer+='.';
wer+=m.name;
}
if(now_addr+type_memory[m.type].space<=addr)
cout<<"ERR";
else
cout<<wer;
cout<<'\n';
return;
}
int main()
{
type_memory["byte"]=Type{1,1,vector<member>(0)};
type_memory["short"]=Type{2,2,vector<member>(0)};
type_memory["int"]=Type{4,4,vector<member>(0)};
type_memory["long"]=Type{8,8,vector<member>(0)};
int n=0;
cin>>n;
for(int op=0;n--;)
{
cin>>op;
switch(op)
{
case 1:
caozuo1();
break;
case 2:
caozuo2();
break;
case 3:
caozuo3();
break;
case 4:
caozuo4();
break;
}
}
return 0;
}