2016-12-16 2 views
0

Also in meinem Ich habe folgende Snippet-CodeLLVM IR: find_if, var erfasst nicht

for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I){ 
    Instruction *Inst = &*I; 
    if (isa<LoadInst>(Inst)) { 
     LoadInst *LI = dyn_cast<LoadInst>(Inst); 
     Value * LoadOperand = LI -> getPointerOperand(); 
     auto it = std::find_if(DataStructureForTrace.begin(), DataStructureForTrace.end(), [](const std::tuple<Value*, unsigned, unsigned, Value* >& e) {return *(std::get<3>(e)) == *(LoadOperand);}); 
     std::get<2>(*it) = 1; 
    } 
} 

In der Leitung 6, erhalte ich Fehler wie: LoadOperand nicht erfasst.

Ich hatte versucht, eine Dummy-Implementierung (nicht von LLVM Typ, nur normalen C++ - Code) zu sehen, ob so etwas funktioniert, und es hat richtig funktioniert. Jetzt bin ich nicht sicher, ob der Fehler LLVM oder generisches C++ zugeordnet ist.

Irgendwelche Vorschläge?

Antwort

2

Der Fehler bezieht sich auf die Tatsache, dass Sie LoadOperand im Lambda-Ausdruck in dem Aufruf std::find_if nicht erfassen. Sie können es durch Referenz mit [&LoadOperand] wie in diesem Ausdruck erfassen:

std::find_if(DataStructureForTrace.begin(), DataStructureForTrace.end(), [&LoadOperand](const std::tuple<Value*, unsigned, unsigned, Value* >& e) {return *(std::get<3>(e)) == *(LoadOperand);}); 
+0

Hallo danke für die Antwort. Also sollte das da gewesen sein: '[& LoadOperand]'? Kannst du bitte etwas mehr Erklärung hinzufügen? Im Dummy-Code, als ich nur 'int pointer' benutzte, funktionierte es mit '[]'. Wieso nicht jetzt? – algoProg

+1

Variablen im Körper des Lambda, die nicht als Funktionsargumente übergeben werden, müssen in den Klammern festgehalten werden. Ich bin mir nicht sicher, warum Ihr anderes Beispiel funktioniert hat, es sei denn, es hat sich einfach nicht auf solche Variablen bezogen. –

+0

Okay, verstanden. Mein anderes Beispiel funktionierte, weil ich mit einem int-Wert und nicht mit einer Variablen verglichen habe. Es tut mir leid für die Verwirrung. – algoProg

Verwandte Themen