Использование необъявленного идентификатора «буфер» и неиспользуемой переменной «буфер» - PullRequest
0 голосов
/ 04 мая 2018

я получаю Использование необъявленного идентификатора 'buffer' в memcpy (buffer, & m_Text [index], m_Index - index); и вернуть atof (буфер); и ошибка неиспользуемой переменной 'buffer' в буфере символов [32] = {0}; Есть ли способ исправить это? большое спасибо

double GetNumber()
{
    SkipWhitespaces();

    int index = m_Index;
    while (isdigit(m_Text[m_Index])) m_Index++;
    if (m_Text[m_Index] == '.') m_Index++;
    while (isdigit(m_Text[m_Index])) m_Index++;

    if (m_Index - index == 0)


    char buffer[32] = { 0 };
    memcpy(buffer, &m_Text[index], m_Index - index);

    return atof(buffer);
}

1 Ответ

0 голосов
/ 04 мая 2018

Давайте добавим несколько дополнительных скобок, чтобы продемонстрировать, что происходит

double GetNumber()
{
    SkipWhitespaces();

    int index = m_Index;
    while (isdigit(m_Text[m_Index])) 
    { // added brace
        m_Index++;
    } // added close brace.
    if (m_Text[m_Index] == '.') 
    { // added brace
        m_Index++;
    } // added close brace.
    while (isdigit(m_Text[m_Index]))
    { // added brace
        m_Index++;
    } // added close brace.

    if (m_Index - index == 0)
    { // added brace
        char buffer[32] = { 0 };
    } // added close brace.
    memcpy(buffer, &m_Text[index], m_Index - index);

    return atof(buffer);
}

Как изначально написано, оператор if не имеет тела, поэтому он принял следующую строку в качестве тела. Поскольку char buffer[32] = { 0 }; является следующей строкой, она становится частью if и выходит из области видимости, как только выходит if, к тому моменту, когда memcpy пытается его использовать, больше не существует.

Я настоятельно рекомендую всегда включать все фигурные скобки во время обучения. Это помогает предотвратить ошибки. Вы можете опустить их позже, если хотите, но я всегда находил для них больше помощи, чем помех.

Решение

Глядя на оригинальный код из исходного блога, я нахожу

if(m_Index - index == 0) 
    throw ParserException("Number expected but not found!", m_Index);

не

if (m_Index - index == 0)
 

Добавьте пропущенную строку (желательно вместе с пропущенными фигурными скобками) и char buffer[32] = { 0 }; снова будет в правильной области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...