Преобразование кода c++ в arduino со строковыми и потоковыми заголовочными файлами и функциями

Я разрабатываю проект на своей плате ардуино, для своего проецирования идеи я написал код в C++. Но некоторые библиотечные файлы и функции не были найдены в IDE arduino, которые, насколько мне известно, находятся в C++.

Я прилагаю код ниже. Я хочу преобразовать весь код в arduino, в котором только convertToEnglish останется как функция в arduino. Я пытался заменить заголовочные файлы и другие функции строковой библиотекой и другим заголовочным файлом Stream.h, но почти все закончилось напрасно. Следовательно, чтобы преодолеть это, пожалуйста, процитируйте мне решение. Я попытался использовать Standard C++, как указано в кавычках, но все же функция getline сообщает об ошибке, указывающей, что cin не был объявлен в сфера.

#include <StandardCplusplus.h>
#include <system_configuration.h>
#include <unwind-cxx.h>
#include <utility.h>



#include <iostream>
 #include <string>
#include <sstream>
using namespace std;

 string convertToEnglish(string morse, string const morseCode[]);

int main()
{
string input = "";
cout << "Please enter a string in morse code: ";
getline(cin, input);

string const morseCode[] = {".-", "-...", "-.-.", "-..", ".", "..-.",
"--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",
".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};

cout << convertToEnglish(input, morseCode) << endl;


return 0;
}

 string convertToEnglish(string morse, string const morseCode[])
 {
 string output = "";
 string currentLetter = "";
 istringstream ss(morse);

size_t const characters = 26;

while(ss >> currentLetter)
{
    size_t index = 0;
    while(currentLetter != morseCode[index] && index < characters)
    {
        ++index; //increment here so we don't have to decrement after the loop like if we put in the condition
    }

    output += 'A' + index;
}

return output;
}

сообщение об ошибке: Arduino: 1.6.8 (Windows 8.1), плата: «Arduino/Genuino Uno»

E:\brain\arduino\sketch_mar15a\Blink\Blink\Blink.ino: В функции ‘int main()’:

Мигание: 19: ошибка: «cin» не был объявлен в этой области

 getline(cin, input);

         ^

статус выхода 1 ‘cin’ не был объявлен в этой области

См. также:  Облачные функции firebase ограничивают детей

В этом отчете будет больше информации, если в меню «Файл» -> «Настройки» включена опция «Показать подробный вывод во время компиляции».

в чем именно проблема?:   —  person satabios    schedule 18.04.2016

Файлы заголовков string и sstream не могут быть найдены в arduino ide. Если нет, то другие заголовочные файлы используются для получения того же вывода.   —  person satabios    schedule 18.04.2016

Возможный дубликат векторов в Arduino   —  person satabios    schedule 18.04.2016

Вы должны поменять порядок тестов currentLetter: до index < characters и после currentLetter != morseCode[index]. В противном случае вы можете получить доступ к morseCode[26]   —  person satabios    schedule 19.04.2016

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. satabios

    Для меня непонятно, что можно использовать, а что нельзя.

    Предположим, что вы не можете использовать std::vector, но можете использовать старую добрую функцию строки C (char *) и функции ввода/вывода, я подготовил следующий пример в стиле C

    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <stdexcept>
    
    
    char * convertToEnglish (char *                      output,
                             std::size_t                 dimOut,
                             char const * const          input,
                             char const * const * const  morseCode,
                             std::size_t                 numMorseCodes)
     {
       if ( (nullptr == output) || (0U == dimOut) || (nullptr == input)
           || (nullptr == morseCode) || (0U == numMorseCodes) )
          throw std::runtime_error("invalid input in cTE()");
    
       std::size_t   posOut = 0U;
       std::size_t   index;
       char const *  ptrI0;
       char const *  ptrI1;
       char          currentLetter[5];
    
       std::memset(output, 0, dimOut);
    
       for ( ptrI0 = input ; nullptr != ptrI0 ; ptrI0 = ptrI1 )
        {
          ptrI1 = std::strpbrk(ptrI0, " \n");
    
          if ( nullptr == ptrI1 )
           {
             // last character if the string isn't cr terminated
             if ( sizeof(currentLetter) <= strlen(ptrI0) )
                throw std::runtime_error("to length last char in cTE()");
    
             std::strcpy(currentLetter, ptrI0);
           }
          else
           {
             if ( sizeof(currentLetter) <= (ptrI1 - ptrI0) )
                throw std::runtime_error("to length char in cTE()");
    
             std::memset(currentLetter, 0, sizeof(currentLetter));
             std::strncpy(currentLetter, ptrI0, (ptrI1 - ptrI0));
    
             if ( '\n' == *ptrI1 )
                 ptrI1 = nullptr;
             else 
                ++ptrI1;
           }
    
          for ( index = 0U
               ;    (index < numMorseCodes)
                 && strcmp(currentLetter, morseCode[index])
               ; ++index )
           ; 
    
          if ( numMorseCodes <= index )
             throw std::runtime_error("no morse code in cTE()");
    
          output[posOut] = 'A' + index;
    
          if ( ++posOut >= dimOut )
             throw std::runtime_error("small out buffer in cTE()");
        }
    
       return output;
     }
    
    
    int main ()
     {
       constexpr char const * morseCode[] = {".-", "-...", "-.-.",
          "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..",
          "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
          "...-", ".--", "-..-", "-.--", "--.."};
    
       constexpr std::size_t  numMorseCodes
          = sizeof(morseCode)/sizeof(morseCode[0]);
    
       char *       input = nullptr;
       std::size_t  dim   = 0U;
    
       if ( getline(&input, &dim, stdin) == -1 )
          throw std::runtime_error("error reading input");
    
       char  output[1024];
    
       std::cout << convertToEnglish(output, sizeof(output), input,
                                     morseCode, numMorseCodes) << std::endl;
    
       return EXIT_SUCCESS;
     }
    

    Если вы можете использовать std::vector или std::string, можно сделать действительно проще.

    p.s.: извините за мой плохой английский

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: