Ошибка из ниоткуда

Тема в разделе "Arduino & Shields", создана пользователем Igor_Ryaboff, 20 сен 2017.

  1. Igor_Ryaboff

    Igor_Ryaboff Нуб

    Пытался скомпилить код в спойлере ниже. Метод "KBGetNumRu" находится ниже KBGetNum. Раньше проблем не было. Сейчас пытаюсь скомпилить - error: 'KBGetNumRu' was not declared in this scope

    Код (C++):
    #define _kbgetnum(a, b, c) if(ch == a || ch == b) return c;
    #define _kbgetnum1(a, b) if(ch == a) return b;
    byte KBGetNum(char ch) {
        _kbgetnum1(' ', 1);
        if (isdigit(ch)) {
            _kbgetnum1('0', 1);
            _kbgetnum1('1', 1);
            _kbgetnum1('2', 2);
            _kbgetnum1('3', 3);
            _kbgetnum1('4', 4);
            _kbgetnum1('5', 5);
            _kbgetnum1('6', 6);
            _kbgetnum1('7', 7);
            _kbgetnum1('8', 8);
            _kbgetnum1('9', 9);
            return byte(ch);
        }
        if (_Layout == RUS && KBGetNumRu(ch) != 0) return KBGetNumRu(ch); //Проблемная строка
        _kbgetnum('A', 'a', 1);
        _kbgetnum('B', 'b', 2);
        _kbgetnum('C', 'c', 3);
        _kbgetnum('D', 'd', 4);
        _kbgetnum('E', 'e', 5);
        _kbgetnum('F', 'f', 6);
        _kbgetnum('G', 'g', 7);
        _kbgetnum('H', 'h', 8);
        _kbgetnum('I', 'i', 9);
        _kbgetnum('J', 'j', 10);
        _kbgetnum('K', 'k', 11);
        _kbgetnum('L', 'l', 12);
        _kbgetnum('M', 'm', 13);
        _kbgetnum('N', 'n', 14);
        _kbgetnum('O', 'o', 15);
        _kbgetnum('P', 'p', 16);
        _kbgetnum('Q', 'q', 17);
        _kbgetnum('R', 'r', 18);
        _kbgetnum('S', 's', 19);
        _kbgetnum('T', 't', 20);
        _kbgetnum('U', 'u', 21);
        _kbgetnum('V', 'v', 22);
        _kbgetnum('W', 'w', 23);
        _kbgetnum('X', 'x', 24);
        _kbgetnum('Y', 'y', 25);
        _kbgetnum('Z', 'z', 26);
        _kbgetnum1('`', 27);
        _kbgetnum1('~', 28);
        _kbgetnum1('!', 29);
        _kbgetnum1('@', 30);
        _kbgetnum1('\"', 31);
        _kbgetnum1('#', 32);
        _kbgetnum1('$', 34);
        _kbgetnum1(';', 35);
        _kbgetnum1('%', 36);
        _kbgetnum1('^', 37);
        _kbgetnum1(':', 38);
        _kbgetnum1('&', 39);
        _kbgetnum1('?', 40);
        _kbgetnum1('*', 41);
        _kbgetnum1('(', 42);
        _kbgetnum1(')', 43);
        _kbgetnum1('-', 44);
        _kbgetnum1('_', 45);
        _kbgetnum1('=', 46);
        _kbgetnum1('+', 47);
        _kbgetnum1('[', 48);
        _kbgetnum1('{', 49);
        _kbgetnum1(']', 40);
        _kbgetnum1('}', 51);
        _kbgetnum1('\\', 52);
        _kbgetnum1('|', 53);
        _kbgetnum1('/', 54);
        _kbgetnum1(',', 55);
        _kbgetnum1('<', 56);
        _kbgetnum1('.', 57);
        _kbgetnum1('>', 58);
        return 0;
    }

    byte KBGetNumRu(char ch) {
        _kbgetnum('F', 'f', 1);
        _kbgetnum('<', ',', 2);
        _kbgetnum('D', 'd', 3);
        _kbgetnum('U', 'u', 4);
        _kbgetnum('L', 'l', 5);
        _kbgetnum('T', 't', 6);
        _kbgetnum('~', '`', 7);
        _kbgetnum(':', ';', 8);
        _kbgetnum('P', 'p', 9);
        _kbgetnum('B', 'b', 10);
        _kbgetnum('Q', 'q', 11);
        _kbgetnum('R', 'r', 12);
        _kbgetnum('K', 'k', 13);
        _kbgetnum('V', 'v', 14);
        _kbgetnum('Y', 'y', 15);
        _kbgetnum('J', 'j', 16);
        _kbgetnum('G', 'g', 17);
        _kbgetnum('H', 'h', 18);
        _kbgetnum('C', 'c', 19);
        _kbgetnum('N', 'n', 20);
        _kbgetnum('E', 'e', 21);
        _kbgetnum('A', 'a', 22);
        _kbgetnum('{', '[', 23);
        _kbgetnum('W', 'w', 24);
        _kbgetnum('X', 'x', 25);
        _kbgetnum('I', 'i', 26);
        _kbgetnum('O', 'o', 27);
        _kbgetnum('}', ']', 28);
        _kbgetnum('S', 's', 29);
        _kbgetnum('M', 'm', 30);
        _kbgetnum('\"', '\'', 31);
        _kbgetnum('>', '.', 32);
        _kbgetnum('Z', 'z', 33);;
        _kbgetnum1('\"', 31);
        _kbgetnum1('#', 33);
        _kbgetnum1('$', 35);
        _kbgetnum1('%', 36);
        _kbgetnum1('^', 37);
        _kbgetnum1('&', 40);
        _kbgetnum1('|', 54);
        _kbgetnum1('?', 55);
        _kbgetnum1('/', 57)
        return 0;
    }
     
  2. rkit

    rkit Гуру

    Ошибка из кривых костылей к с++ в ардуино иде.
    Напишите byte KBGetNumRu(char ch); где-нибудь в начале файла.
     
    arkadyf нравится это.
  3. Igor_Ryaboff

    Igor_Ryaboff Нуб

    Это решит проблему ошибок, но для меня это не решение. У меня в коде в дальшейшем будет множество методов и если к каждому будет ошибка, то хоть куда не суй метод, он все равно что-то да выдаст
    Может есть какое-то решение?
     
  4. rkit

    rkit Гуру

    Я дал вам решение. Попробуйте прочитать, что я вам написал. Если не понятно, то читайте учебник по С++.
     
  5. b707

    b707 Гуру

    тогда РЕШЕНИЕ = бросить ардуину и заняться чем-то более понятным.

    Прочитайте предыдущий совет, rkit все написал правильно, именно так это и решается в "настоящем" программировании С/С++
     
  6. qwone

    qwone Гик

  7. DetSimen

    DetSimen Guest

    C++ требует прототипов функций. АрдуинаИДЕ просто незаметно от пользователя создает их в секретном h файле.
     
  8. AlexU

    AlexU Гуру

    Похоже, что проблема связана с наличием символов отличных от латинницы в путях к скетчу или куда установлена Arduino IDE.
     
    arkadyf нравится это.
  9. ostrov

    ostrov Гуру

    Пару раз возникало такое, зависимости не уловил. Все пути и настройки те же.

    AVRS хорош, хоть и не без тараканов тоже.
     
  10. AlexU

    AlexU Гуру

    Зависимость такая, что начиная с какой-то версии Arduino IDE перестали нормально генерироваться исходники "*.c", "*.cpp" и "*.h" на основе скетча, если в путях присутствуют символы отличные от латинницы, например, кириллица -- т.е. русские буковки в пути к скетчу.
    Вариантов решения как минимум два:
    1. в названиях каталогов использовать только латинницу;
    2. писать скетчи по всем правилам языков C/C++.