总还是要面对这破代码的。
#include<bits/stdc++.h>
using namespace std;
struct Member{
string TypeName;
string MemberName;
int MemberDistance;
Member(string TypeName,string MemberName,int MemberDistance)
{
this->TypeName=TypeName;
this->MemberName=MemberName;
this->MemberDistance=MemberDistance;
}
};
int TypeMemory(string TypeName);
int TypeLimit(string TypeName);
struct Struct{
string StructName;
vector<Member> vM;
int StructMemory;
int StructLimit;
Struct(string StructName,int MemberNumber)
{
this->StructName=StructName;
this->StructMemory=0;
this->StructLimit=0;
for(int i=1;i<=MemberNumber;i++)
{
string TypeName,MemberName;
cin>>TypeName>>MemberName;
Member NewMember(TypeName,MemberName,this->StructMemory);
this->vM.push_back(NewMember);
int MemberMemory=TypeMemory(TypeName);
int MemberLimit=TypeLimit(TypeName);
this->StructMemory+=MemberMemory;
if(this->StructMemory%MemberLimit)
this->StructMemory=(this->StructMemory/MemberLimit+1)*MemberLimit;
this->StructLimit=max(this->StructLimit,MemberLimit);
}
if(this->StructMemory%StructLimit)
this->StructMemory=(this->StructMemory/StructLimit+1)*StructLimit;
}
};
vector<Struct> vS;
map<string,int> StructNameToId;
map<string,int> ObjectToAddress;
map<int,string> AddressToBasicObject;
int TypeMemory(string TypeName)
{
if(TypeName=="byte") return 1;else
if(TypeName=="short") return 2;else
if(TypeName=="int") return 4;else
if(TypeName=="long") return 8;else
return vS[StructNameToId[TypeName]].StructMemory;
}
int TypeLimit(string TypeName)
{
if(TypeName=="byte") return 1;else
if(TypeName=="short") return 2;else
if(TypeName=="int") return 4;else
if(TypeName=="long") return 8;else
return vS[StructNameToId[TypeName]].StructLimit;
}
int CurrentAddress=0;
void WorkTheObject(string TypeName,string ObjectName);
struct Object{
string TypeName;
string ObjectName;
int ObjectAddress;
Object(string TypeName,string ObjectName)
{
this->TypeName=TypeName;
this->ObjectName=ObjectName;
this->ObjectAddress=CurrentAddress;
WorkTheObject(TypeName,ObjectName);
}
};
void WorkTheObject(string TypeName,string ObjectName)
{
if(TypeName=="byte"||TypeName=="short"||TypeName=="int"||TypeName=="long")
{
int MemberMemory=TypeMemory(TypeName);
int MemberLimit=TypeLimit(TypeName);
CurrentAddress+=MemberMemory;
if(CurrentAddress%MemberLimit)
CurrentAddress=(CurrentAddress/MemberLimit)*MemberLimit;
ObjectToAddress[ObjectName]=CurrentAddress;
for(int i=0;i<MemberMemory;i++)
AddressToBasicObject[CurrentAddress+i]=ObjectName;
return;
}
for(Member _:(vS[StructNameToId[TypeName]].vM))
{
ObjectToAddress[ObjectName]=CurrentAddress;
WorkTheObject(_.TypeName,ObjectName+"."+_.MemberName);
}
}
int main()
{
//freopen("struct.in","r",stdin);
//freopen("struct.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,op;
cin>>n;
while(n--)
{
cin>>op;
if(op==1)
{
string s;int k;cin>>s>>k;
Struct NewStruct(s,k);
StructNameToId[NewStruct.StructName]=vS.size();
vS.push_back(NewStruct);
printf("%lld %lld\n",NewStruct.StructMemory,NewStruct.StructLimit);
}
else
if(op==2)
{
string t,n;cin>>t>>n;
Object NewObject(t,n);
printf("%lld\n",NewObject.ObjectAddress);
}
else
if(op==3)
{
string s;cin>>s;
printf("%lld\n",ObjectToAddress[s]);
}
else
if(op==4)
{
int addr;cin>>addr;
printf("%s\n",AddressToBasicObject[addr].size()?AddressToBasicObject[addr].c_str():"ERR");
}
else assert(false);
}
return 0;
}