• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kompilacja i błąd char* C++

Object Storage Arubacloud
0 głosów
325 wizyt
pytanie zadane 6 października 2017 w C i C++ przez bini Nowicjusz (120 p.)

Witajcie.smiley
W jaki sposób można rozwiązać taki komunikat

warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

             gprs.sendSMS (buffNumber, "Relay 1 Status Aktif");
 

podczas kompilacji tego kodu:
 

#include <gprs.h>
#include <softwareserial.h>

#define TIMEOUT    5000
#define AKTIF LOW
#define MATI HIGH

byte Relay[] = {A0,A1,A2,A3};
byte StatRelay[4];
char buffNumber[20];
char currentLine[500] = "";
int currentLineIndex = 0;
bool nextLineIsMessage = false;
String replyNumber = "0799800990";
GPRS gprs;

void setup() {
  for(int i=0; i < 4; i++) {
    pinMode (Relay[i] , OUTPUT); 
    digitalWrite (Relay[i], MATI); 
    StatRelay[i] = MATI;
  } 
  Serial.begin(9600);
  while (!Serial);
  Serial.println("Aktifkan SIM800L V2 >>> Otomatis Membaca SMS");
  gprs.preInit();
  delay(1000);
  while (0 != gprs.init()) {
    delay(1000);
    Serial.print("init errorrn");
  }
  // Mengatur SMS ke mode ASCII
  if (0 != gprs.sendCmdAndWaitForResp("AT+CMGF=1rn", "OK", TIMEOUT)) {
    ERROR("ERROR:CNMI");
    return;
  }
  // Membaca SMS yang Baru Masuk
  if (0 != gprs.sendCmdAndWaitForResp("AT+CNMI=1,2,0,0,0rn", "OK", TIMEOUT)) {
    ERROR("ERROR:CNMI");
    return;
  }
  int pjg = replyNumber.length() + 1;
  buffNumber[pjg];
  replyNumber.toCharArray(buffNumber,pjg);
  Serial.print("Kirim balasan ke nomor = > ");
  Serial.println(buffNumber);
  Serial.println("Initialisasi Berhasil");
  Serial.println("=============================================================");
}

void loop() {
  // Merubah status Relay ON / OFF
  for(int i=0; i < 4; i++) {
    digitalWrite(Relay[i], StatRelay[i]);
  } 
  
  // Jika terdapat data masukan dari SIM800
  if (gprs.serialSIM800.available()) {
    char lastCharRead = gprs.serialSIM800.read();
    // Simpan semuad data pada lastCharRead, kemudian jika terdapat r atau n, sebagai tanda akhir pesan masuk
    if (lastCharRead == 'r' || lastCharRead == 'n') {
      String lastLine = String(currentLine);

      //Jika pesan terakihr +CMT menandakan pesan barus diterima
      if (lastLine.startsWith("+CMT:")) {
        Serial.println(lastLine);
        nextLineIsMessage = true;

      } else if (lastLine.length() > 0) {
        if (nextLineIsMessage) {
          Serial.println(lastLine);
          // ================================================================>> Fungsi Mengendalikan Relay
          //Kendali Relay 1
          if (lastLine.indexOf("Relay 1 ON") >= 0) {
            StatRelay[0] = AKTIF;
            Serial.print("Balasan  ====>>>>  ");
            Serial.println("Relay 1 Status Aktif");
            gprs.sendSMS (buffNumber, "Relay 1 Status Aktif");
          }
          else if (lastLine.indexOf("Relay 1 OFF") >= 0) {
            StatRelay[0] = MATI;
            Serial.print("Balasan  ====>>>>  ");
            Serial.println("Relay 1 Status Mati");
            gprs.sendSMS (buffNumber, "Relay 1 Status Mati");
          }
          //Kendali Relay 2
          if (lastLine.indexOf("Relay 2 ON") >= 0) {
            StatRelay[1] = AKTIF;
            Serial.print("Balasan  ====>>>>  ");
            Serial.println("Relay 2 Status Aktif");
            gprs.sendSMS (buffNumber, "Relay 2 Status Aktif");
          }
          else if (lastLine.indexOf("Relay 2 OFF") >= 0) {
            StatRelay[1] = MATI;
            Serial.print("Balasan  ====>>>>  ");
            Serial.println("Relay 2 Status Mati");
            gprs.sendSMS (buffNumber, "Relay 2 Status Mati");
          }
          //Kendali Relay 3
          if (lastLine.indexOf("Relay 3 ON") >= 0) {
            StatRelay[2] = AKTIF;
            Serial.print("Balasan  ====>>>>  ");
            Serial.println("Relay 3 Status Aktif");
            gprs.sendSMS (buffNumber, "Relay 3 Status Aktif");
          }
          else if (lastLine.indexOf("Relay 3 OFF") >= 0) {
            StatRelay[2] = MATI;
            Serial.print("Balasan  ====>>>>  ");
            Serial.println("Relay 3 Status Mati");
            gprs.sendSMS (buffNumber, "Relay 3 Status Mati");
          }
          //Kendali Relay 4
          if (lastLine.indexOf("Relay 4 ON") >= 0) {
            StatRelay[3] = AKTIF;
            Serial.print("Balasan  ====>>>>  ");
            Serial.println("Relay 4 Status Aktif");
            gprs.sendSMS (buffNumber, "Relay 4 Status Aktif");
          }
          else if (lastLine.indexOf("Relay 4 OFF") >= 0) {
            StatRelay[3] = MATI;
            Serial.print("Balasan  ====>>>>  ");
            Serial.println("Relay 4 Status Mati");
            gprs.sendSMS (buffNumber, "Relay 4 Status Mati");
          }
          nextLineIsMessage = false;
        }
        // ==================================================================>>
      }

      //Clear char array for next line of read
      for ( int i = 0; i < sizeof(currentLine);  ++i ) {
        currentLine[i] = (char)0;
      }
      currentLineIndex = 0;
    } 
    else {
      currentLine[currentLineIndex++] = lastCharRead;
    }
  }
}

 

2 odpowiedzi

+1 głos
odpowiedź 6 października 2017 przez Wiciorny Ekspert (270,230 p.)

String jest immutable. Poczytaj co to znaczy WIĘC nie możesz go zmienić.

 A literał jest niestety const - typu stałego stąd nie możesz go zamienić na *char.

Posłużę się rozwinięciem STACKA: 

This is an error message you see whenever you have a situation like the following:

char* pointer_to_nonconst = "string literal";

Why? Well, C and C++ differ in the type of the string literal. In C the type is array of char and in C++ it is constant array of char. In any case, you are not allowed to change the characters of the string literal, so the const in C++ is not really a restriction but more of a type safety thing. A conversion from const char* to char* is generally not possible without an explicit cast for safety reasons. But for backwards compatibility with C the language C++ still allows assigning a string literal to a char* and gives you a warning about this conversion being deprecated.

So, somwehere you are missing one or more consts in your program for const correctness. But the code you showed to us is not the problem as it does not do this kind of deprecated conversion. The warning must have come from some other place.

+1 głos
odpowiedź 6 października 2017 przez j23 Mędrzec (194,920 p.)

Daj jawne rzutowanie literałów tekstowych: gprs.sendSMS (buffNumber, (char*)"Relay 1 Status Aktif");

Podobne pytania

0 głosów
1 odpowiedź 210 wizyt
pytanie zadane 31 grudnia 2020 w C i C++ przez kijank Początkujący (250 p.)
–1 głos
2 odpowiedzi 776 wizyt
pytanie zadane 4 stycznia 2019 w C i C++ przez Piotr Lis Obywatel (1,310 p.)
+2 głosów
2 odpowiedzi 206 wizyt
pytanie zadane 26 stycznia 2016 w C i C++ przez LukaszW Nowicjusz (140 p.)

92,583 zapytań

141,434 odpowiedzi

319,668 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...