Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用传递的指针是';更新了吗?_C++ - Fatal编程技术网

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", &currentItem, 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;