C++ 通过引用传递的指针是';更新了吗?
我目前正在开发一个功能,它要求我获取指向结构中某个项的指针,然后保存该项的初始值。我曾尝试用一小段代码来复制这个问题,这些代码做了完全相同的事情,但每次都能正常工作。该方法在本地更新指针,但不在结构中更新C++ 通过引用传递的指针是';更新了吗?,c++,C++,我目前正在开发一个功能,它要求我获取指向结构中某个项的指针,然后保存该项的初始值。我曾尝试用一小段代码来复制这个问题,这些代码做了完全相同的事情,但每次都能正常工作。该方法在本地更新指针,但不在结构中更新 float*&target和float&targetInitial是我试图更改的值 static void lfoTargetCombo(const char* name, const char** currentItem, float*& target, float& tar
float*&target
和float&targetInitial
是我试图更改的值
static void lfoTargetCombo(const char* name, const char** currentItem, float*& target, float& targetInitial)
{
static const char* targetStrs[] = { "None", "Oscillator1 Volume", "Oscillator2 Volume", "LFO1 Rate", "LFO2 Rate",
"LFO1 Amount", "LFO2 Amount", "Amplitude Envelope Attack", "Amplitude Envelope Decay", "Amplitude Envelope Sustain",
"Amplitude Envelope Release" };
if (ImGui::BeginCombo(name, *currentItem))
{
for (int i = 0; i < IM_ARRAYSIZE(targetStrs); i++)
{
bool selected = (*currentItem == targetStrs[i]);
if (ImGui::Selectable(targetStrs[i], selected))
{
*currentItem = targetStrs[i];
if (i > 0)
{
uintptr_t addr = reinterpret_cast<uintptr_t>(&vars.osc1Volume) + (i - 1) * sizeof(float);
target = reinterpret_cast<float*>(addr);
targetInitial = *target;
break;
}
}
}
ImGui::EndCombo();
}
}
void foo()
{
static const char* currentItem = "None";
lfoTargetCombo("LFO1 Target", ¤tItem, vars.lfo1Target, vars.lfo1Initial);
//Should result in vars.lfo1Target to be something that isn't nullptr
}
我试图解决这个问题的时间太长了,我不明白为什么会发生这种情况。“我试图用一小段代码来复制这个问题,这些代码执行完全相同的操作,但该代码块每次都有效。”对代码块进行增量更改,使其更像您向我们展示的代码,直到重现问题为止。然后,您将知道您最近所做的更改导致了问题。我建议简化您的测试用例。我没有看到明显的问题,但我确实看到通过您的内部“addr”赋值函数可以访问“vars”,因此我的第一个问题是为什么不去掉参数,直接使用结构?当您通过调试器运行代码时,您发现了什么?
target=…
通常不会被破坏,因此,它只能是addr
或条件或循环边界之一,也可以是调用函数后检查target
的方式,因为这不是您所认为的。调试器可以告诉您expections关闭的位置当我检查函数中的所有值时,它们都设置正确。然而,有趣的是,addr得到的地址与visualstudio内存检查器告诉我的地址不同。不过它离我们很近。
static struct GUIVars
{
float osc1Volume = 0.5, osc2Volume = 0.5;
float lfoRate1 = 1, lfoRate2 = 1;
float lfoAmount1 = 0, lfoAmount2 = 0;
float aeAttack = 0.5, aeDecay = 0.5, aeSustain = 0.5, aeRelease = 0.5;
float osc1Shift = 0, osc2Shift = 0;
int osc1Shape = 0, osc2Shape = 0;
int lfo1Shape = 0, lfo2Shape = 0;
float* lfo1Target, *lfo2Target;
float lfo1Initial, lfo2Initial;
} vars;