Как я могу сохранить в члене структуры и после этого распечатать их с помощью Serial.println(), если данные для хранения представляют собой строковый поток?, фреймворк arduino ESP32

Как вы?.

Я пытаюсь распечатать некоторые данные, которые я получил как string, и для этого я использую следующую функцию (определение FechaProg после функции)

uint8_t Extrae_Data(string trama, FechaProg* destino ,char sep) {
  uint8_t contador = 0;
  string lectura;
  stringstream cadena_leida(trama);
  Serial.print("La trama es: ");
  Serial.println(trama.c_str());
  Serial.print("El stringstream es: ");
  Serial.println(cadena_leida.str().c_str());
  while(getline(cadena_leida, lectura, sep))
  {
    if (sep == '-')
    {
      switch(contador)
      {
        case 1:
        {
          destino->mes = lectura.c_str();
        }
        break;
        case 2:
        {
          destino->dia = lectura.c_str();
        }
        break;
        case 3:
        {
          destino->ano = lectura.c_str();
        }
      }
    }
    else if (sep == ':')
    {
      switch(contador)
      {
        case 1:
        {
          destino->hora = lectura.c_str();
        }
        break;
        case 2:
        {
          destino->minuto = lectura.c_str();
        }
        break;
      }
    }
    contador++;
    Serial.println(contador);
    if (contador == 3)
    {
            //Serial.print("Lectura: ");
      Serial.print("La cadena es: ");
      Serial.println(destino->mes);
      Serial.println(destino->dia);
      Serial.println(destino->ano);
    }
    if (contador == 2)
    {
      //Serial.print("Lectura: ");
      Serial.print("La cadena es: ");
      Serial.println(destino->hora);
      Serial.println(destino->minuto);
    }
  }
  return contador;
}

Тип Fechaprog, который я использую в качестве указателя, представляет собой структуру, которая выглядит следующим образом:

struct FechaProg {
  const char* dia;
  const char* mes;
  const char* ano;
  const char* hora;
  const char* minuto;
  const char* segundo;
};

Конечно, я создаю объект типа FechaProg следующим образом.

FechaProg tiempo = {"0"};

и функция вызывается следующим образом

Extrae_Data(jsonObj["fecha"], &tiempo, '-')

где jsonObj["fecha"] — полученные данные.

Если trama и cadena_leida.str().c_str() печатаются перед сохранением информации в указателе, оба печатаются хорошо, но если я попытаюсь напечатать значения, хранящиеся в указателях, с помощью Serial.println(destino->minuto), тогда будет напечатана нечитаемая информация.

В настоящее время я не мог решить эту проблему.

ОБНОВЛЕНИЕ 04.01.2023: Моими входными аргументами для функции Extrae_Data являются строка, указатель на структуру и разделитель.

внутри функции у меня есть счетчик, который служит мне для хранения каждого токена в определенном члене структуры после того, как каждый токен основан; например, микро получает дату 2023:01:01, где разделителем является «:», тогда я хочу, чтобы токены хранились следующим образом:

destino->ano = 2023;
destino->mes = 01;
destino->dia = 01;

это нужно сделать после того, как функция getline извлечет токен из строки, это для выполнения другой операции вне функции, но, по-видимому, это присвоение полученного токена указателю члена структуры, что я делаю неправильно.

Повторяю, я не рассматриваю строку как структуру, но я хочу сохранить токен, извлеченный из строки, в членах структуры.

Итак, как я могу распечатать это?

Заранее спасибо за помощь.

1) Существует фундаментальное непонимание того, как должна быть инициализирована структура, вы не инициализируете ее строкой «0», вы должны инициализировать ее с помощью FechaProg tiempo = {}, она будет инициализировать каждый указатель в структуре на nullptr (т.е. указывать в никуда ). 2) То, что вы получили от stringstream, является строкой, а не структурой, и поэтому ваш код, пытающийся рассматривать ее как структуру, точно не будет работать. Как (и почему) структура упаковывается и отправляется в виде строки, нам непонятно? и поэтому не подлежит ответу.

hcheung 31.03.2023 03:39

Я знаю, что получаю строку, а не структуру, см. мое обновление к сообщению.

vram 01.04.2023 16:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не полный ответ на вашу проблему, так как на ваш вопрос можно ответить лишь частично. Функция Extrae_Data() не имеет особого смысла и нуждается в дополнительных пояснениях или добавлении контекста того, как она используется в вашем коде.

Это единственный ответ, как разобрать строку в структуру на основе вашего обновленного комментария от 04.01.2023.

Если у вас есть часть данных в виде строки 2023:01:01, и вы хотите проанализировать ее и присвоить различным элементам структуры, вы можете использовать старую добрую функцию strtok() для достижения этой цели:

struct FechaProg {
  const char* dia;
  const char* mes;
  const char* ano;
  const char* hora;
  const char* minuto;
  const char* segundo;
};

// please noted this is not your original function signature
void Extrae_Data(char* trama, FechaProg* destino ,const char* sep) {
    destino->ano  = strtok(trama, sep);
    destino->mes = strtok(NULL, sep);
    destino->dia = strtok(NULL, sep);
}

void setup() {
    Serial.begin(115200);

    char str[] = "2023:01:01";
    const char* separator = ":";
    
    FechaProg myStruct{};
    
    Extrae_Data(str, &myStruct, separator);
    //since you are using esp32, printf is available
    Serial.printf("%s %s %s\n", myStruct.ano, myStruct.mes, myStruct.dia); 
}

Извините за задержку @hcheung, дайте мне попробовать, и я свяжусь с вами

vram 10.04.2023 22:22

Другие вопросы по теме