gpt4 book ai didi

C++ vector 问题

转载 作者:行者123 更新时间:2023-11-30 03:08:19 25 4
gpt4 key购买 nike

我在使用 C++ 中的 vector 时遇到了一些奇怪的行为,我希望有人能帮助我。我有一个像这样的 vector :

vector<Instruction*> allInstrs; 

指令结构如下:

struct Instruction : simple_instr
{
InstrType type;
Instruction(const simple_instr& simple) : simple_instr(simple)
{
type = Simple;
loopHeader = false;
loopTail = false;
}
int Id;
bool loopHeader;
bool loopTail;
};

我遇到的问题是:

我需要遍历每条指令并提取特定字段并使用它们对 vector 中的指令进行一些分析。为此,我基本上是在做

VariableList Variables;

void GenerateVariableList()
{
for (int i = 0; i < allInstrs.size(); i++)
{
Variables.Add(allInstrs[i]);
}
Variables.RemoveDuplicates();
}

变量列表定义为

struct VariableList
{
void Add(simple_instr* instr)
{
PrintOpcode(instr);
switch(instr->opcode)
{
case STR_OP:
case MCPY_OP:
Add(instr->u.base.src1);
Add(instr->u.base.src2);
break;
case LDC_OP:
Add(instr->u.ldc.dst);
break;
case BTRUE_OP:
case BFALSE_OP:
Add(instr->u.bj.src);
break;

case CALL_OP:
cout << "CALL OP" <<endl;
break;

case MBR_OP:
Add(instr->u.mbr.src);
break;

case RET_OP:
if (instr->u.base.src1 != NO_REGISTER)
Add(instr->u.base.src1);
break;

case CVT_OP:
case CPY_OP:
case NEG_OP:
case NOT_OP:
case LOAD_OP:
Add(instr->u.base.dst);
Add(instr->u.base.src1);
break;

case LABEL_OP:
case JMP_OP:
break;

default:
Add(instr->u.base.dst);
Add(instr->u.base.src1);
Add(instr->u.base.src2);
break;

}
}

void Add(Variable var)
{
variableList.push_back(var);
}

void RemoveDuplicates()
{
if (variableList.size() > 0)
{
variableList.erase(unique(variableList.begin(), variableList.end()), variableList.end());
currentID = variableList.size();
}
}

VariableList()
{
currentID = 0;
}

VariableList(VariableList& varList, bool setLiveness = false, bool LiveVal = false)
{
currentID = 0;
for (int i = 0; i < varList.size(); i++)
{
Variable var(varList[i]);
if (setLiveness)
{
var.isLive = LiveVal;
}
variableList.push_back(var);
}
}

Variable& operator[] (int i)
{
return variableList[i];
}

int size()
{
return variableList.size();
}

vector<Variable>::iterator begin()
{
return variableList.begin();
}

vector<Variable>::iterator end()
{
return variableList.end();
}

protected:
int currentID;
vector<Variable> variableList;

void Add(simple_reg* reg, bool checkForDuplicates = false)
{ cout << "Register Check" <<endl;
if (reg == null)
{
cout << "null detected" << endl;
return;
}
if (reg->kind == PSEUDO_REG)
{

if (!checkForDuplicates || (checkForDuplicates && find(variableList.begin(), variableList.end(), reg->num) != variableList.end()))
{
cout << "Adding... Reg " << reg->num << endl;
Variable var(reg->num, currentID);

variableList.push_back(var);
currentID++;
}
}
}

};

不过,当我这样做时,每条指令都会转到默认的 case 语句,尽管我知道有些指令不应该这样做。如果我将 GenerateVariableList 更改为

void GenerateVariableList()
{
for (int i = 0; i < allInstrs.size(); i++)
{
PrintOpcode(allInstrs[i]);
Variables.Add(allInstrs[i]);
}
Variables.RemoveDuplicates();
}

因此,除了 Variables.Add 中的那个之外,现在还有第二个 PrintOpCode,程序运行正确。我不明白为什么添加第二个 PrintOpcode 可以使其正常工作。所有打印操作码都是一个带有 switch 语句的函数,它根据 simple_instr 字段之一的值打印出特定的字符串。

VariableList 变量包含在一个名为 CFG 的单独结构中

如果您需要更多信息/代码,我可以提供。如果答案很明显,我道歉,我不经常用 C++ 编程

编辑:

留下的其中一个答案(虽然现在已删除)让我找到了答案。

之前我在做

static vector<Instruction*> ConvertLinkedListToVector(simple_instr* instructionList)
{
vector<Instruction*> convertedInstructions;
int count = 0;
for (simple_instr* current = instructionList; current; count++, current = current->next)
{
//Instruction* inst = new Instruction(*current);
Instruction inst = Instruction(*current);
inst.Id = count;
convertedInstructions.push_back(&inst);
}
return convertedInstructions;
}

制作 vector ,但在阅读该答案后,我将其改回使用“new”,现在它可以正常工作了。感谢您的帮助,抱歉这个愚蠢的问题嘿嘿

最佳答案

很可能传递给您的构造函数的 const simple_instr& simple 超出了范围,并且您保留了对 simple_instr 的无效引用/指针。

关于C++ vector 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5140261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com