Problème pointeur et string

J'essaye d'adapter un code pour traiter sur ESP32 une donnée reçue par Bluetooth LE. Voici le code initial qui affiche simplement la donnée reçue :

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();

      if (value.length() > 0) {
        Serial.println("*********");
        Serial.print("New value: ");
        for (int i = 0; i < value.length(); i++)
          Serial.print(value[i]);

        Serial.println();
        Serial.println("*********");
      }
    }
};

Moi je veux la comparer et lancer des actions selon son contenu. Voici ce que j'ai essayé

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();

      char carac;
      if (value.length() > 0) {
        Serial.print("New value: ");
        for (int i = 0; i < value.length(); i++) Serial.print(value[i]);
        Serial.print (" : ");
        carac  = *value;
        switch (carac) {
          case 'U':
            Serial.println("Couleur");
            break;
          case 'A':
            Serial.print("Animation ");
            int numAnim = 0;
            int i = 1;
            carac = *value[i] ;
            while (carac != "*") {
              numAnim = numAnim * 10 + carac - '0';
              i++;
            }
            Serial.println(numAnim);
            break;
        }
        Serial.println();
      }
    }
};

Mais ça ne compile pas :

Arduino : 1.8.2 (Windows 10), Carte : "ESP32 Dev Module, Disabled, Default, QIO, 80MHz, 4MB (32Mb), 921600, None"

Les options de compilation ont été modifiées, tout sera recompilé
C:\Users\Chuwi\Documents\Arduino_ESP32\BLE_write_traite\BLE_write_traite.ino: In member function 'virtual void MyCallbacks::onWrite(BLECharacteristic*)':

BLE_write_traite:26: error: no match for 'operator*' (operand type is 'std::__cxx11::string {aka std::__cxx11::basic_string}')

carac = *value;

^

BLE_write_traite:35: error: invalid type argument of unary '*' (have '__gnu_cxx::__alloc_traits<std::allocator >::value_type {aka char}')

carac = *value ;

  • ^*
    BLE_write_traite:36: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
    _ while (carac != "*") {_
  • ^*
    exit status 1
    no match for 'operator*' (operand type is 'std::__cxx11::string {aka std::__cxx11::basic_string}')[/quote]Je crois comprendre que c'est un problème de conversion ou de comparaison d'un pointeur, mais je n'arrive pas à m'en sortir. Toute aide et explication est bienvenue !! :slight_smile:

Salut

Je crois que tu es en train de confondre c-string et STL string.

essaie carac  = value[x];

Mais je ne suis pas sûr que STL string se comporte comme la classe String.

@+

Avec ça :

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();

      char carac;
      if (value.length() > 0) {
        Serial.print("New value: ");
        for (int i = 0; i < value.length(); i++) Serial.print(value[i]);
        Serial.print (" : ");
        carac  = value[0];
        switch (carac) {
          case 'U':
            Serial.println("Couleur");
            break;
          case 'A':
            Serial.print("Animation ");
            int numAnim = 0;
            int i = 1;
            carac = value[i] ;
            while (carac != "*") {
              numAnim = numAnim * 10 + carac - '0';
              i++;
            }
            Serial.println(numAnim);
            break;
        }
        Serial.println();
      }
    }
};

J'ai ces erreurs de compilation

Arduino : 1.8.2 (Windows 10), Carte : "ESP32 Dev Module, Disabled, Default, QIO, 80MHz, 4MB (32Mb), 921600, None"

C:\Users\Chuwi\Documents\Arduino_ESP32\BLE_write_traite\BLE_write_traite.ino: In member function 'virtual void MyCallbacks::onWrite(BLECharacteristic*)':

BLE_write_traite:36: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

while (carac != "*") {

^

exit status 1
ISO C++ forbids comparison between pointer and integer [-fpermissive]

et avec
            while (carac != "*") { c'est pas mieux :

Arduino : 1.8.2 (Windows 10), Carte : "ESP32 Dev Module, Disabled, Default, QIO, 80MHz, 4MB (32Mb), 921600, None"

C:\Users\Chuwi\Documents\Arduino_ESP32\BLE_write_traite\BLE_write_traite.ino: In member function 'virtual void MyCallbacks::onWrite(BLECharacteristic*)':

BLE_write_traite:36: error: invalid type argument of unary '*' (have 'char')

while (carac != "") {

^

exit status 1
invalid type argument of unary '*' (have 'char')

Des idées ?
Qu'est ce qu'un STL string ?

Utilise de simple quotes pour un char.

             while (carac != '*') {
             while (*carac != "*") { // 2 erreurs

carac est un caractère, pas un pointeur.

"" représente une chaîne de caractères (on ne compare pas un caractère avec une chaîne)
'
' représente un caractère (comparaison légale)

La classe string fait partie de la bibliothèque STL (Standard Template Library).

Bonne nuit
@+

Compris, merci