Warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

Beste Forumleden,

Hardware: Windows 10, TFT ILI9341, Arduino IDE 2.3.2, SD kaart Duracell SHC 8GB
Mega board.
Ik gebruik een code om images te tonen op een TFT dislay.
Compilen gaat goed maar de foto's worden niet getoond op het display.
Ik gebruik RAW bestanden 320x240.
De seriele monitor geeft vraagtekens , cijfers en letters.
OP het display is een derde deel gekeurd.
DE warning geeft mijns inzien al aan dat de foto's niet goed gelezen worden.
Ik heb op diverse forums gezocht naar een oplossing maar aangezien ik geen enkele ervaring heb met programmeren niets gevonden dat een oplossing geeft.
De hoop is nu op u gevestigd.

Code:

#include <UTFT_SdRaw.h>
#include <SPI.h>
#include <SdFat.h>
#include <UTFT.h>

#define SD_CHIP_SELECT  53   // SD chip select pin Arduino Mega)
SdFat sd;

UTFT myGLCD(ILI9341_16, 38, 39, 40, 41);
UTFT_SdRaw myFiles(&myGLCD);



void setup() 
{
  Serial.begin(115200);
  delay(100);
  bool mysd = 0;
  while (!mysd)
  {
    if (!sd.begin (SD_CHIP_SELECT, SPI_FULL_SPEED))
     
  {
    Serial.println(F("Card failed, or not present"));
    Serial.println(F("Retrying...."));
}
else
  {
  mysd = 1;
  Serial.println(F("Card initialised."));
  }
}
  Serial.println(F("Initialising LCD."));
  myGLCD.InitLCD();
  myGLCD.clrScr();
  }

void loop()

{
myFiles.load(0, 0, 320, 240, "1.RAW", 1, 0);
while(1);
delay(4000);
myFiles.load(0, 0, 320, 240, "2.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "3.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "4.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "5.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "6.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "7.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "8.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "9.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "10.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "11.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "12.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "13.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "14.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "15.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "16.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "17.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "18.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "19.RAW", 1, 0);
delay(4000);
myFiles.load(0, 0, 320, 240, "20.RAW", 1, 0);
delay(4000);
}

Sorry I only speak English.
But guessing with lines like this. Wherever the load method is defined, that handles
the "1.RAW" parameter, it is probably defined as: char *

Try changing it to: const char *

This lets the compiler know that you are not going to change the contents of the string.

Welke UTFT bibliotheek gebruik je? Ik kon deze niet vinden in in library manager (bibliotheek beheer?). Ik heb nooit geweten dat er zoveel verschillenden waren?

Werkt een voorbeeld van de UTFT_SdRaw bibliotheek wel goed? Of heb je dan ook problemen?

Wat doet die while(1) in je programma?

Je probleem wordt zeer waarschijnlijk niet veroorzaakt door die waarschuwing. Onderstaand programma geeft dezelfde waarschuwing

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

void loop()
{
  someFunc("1.raw");
}

void someFunc(char *text)
{
  Serial.println(text);
}

Oplossing 1:
Gebruik een variabele om de filename in op te slaan zoals hieronder getoond.

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

void loop()
{
  // variable with filename
  char fileName[13];
  // variable with filename
  strcpy(fileName, "1.raw");
  someFunc(fileName);
}

void someFunc(char *text)
{
  Serial.println(text);
}

Wees je ervan bewust dat de variabele fileName groot genoeg moet zijn om het volledige pad plus een (1) extra karakter te bevatten.
Oplossing 2:
De andere oplossing is aangegeven door @KurtE en je moet de bibliotheek aanpassen.
.h file
Verander regel 25 van

    int load(int x, int y, int sx, int sy, char *filename, int bufmult = 1, bool iswap = 0);

naar

    int load(int x, int y, int sx, int sy, const char *filename, int bufmult = 1, bool iswap = 0);

.cpp file
Verander regel 20 van

int UTFT_SdRaw::load(int x, int y, int sx, int sy, char *filename, int bufmult, bool iswap)

naar

int UTFT_SdRaw::load(int x, int y, int sx, int sy, const char *filename, int bufmult, bool iswap)

Je probleem wordt naar mijn mening veroorzaakt door het feit dat je niet genoeg geheugen in je Mega hebt. De load functie in UTFT_SdRaw.cpp begint met

int UTFT_SdRaw::load(int x, int y, int sx, int sy, char *filename, int bufmult, bool iswap)
{
  char buf[2 * bufmult * sx];

Doe de berekening: 2x320x240=153600 bytes; je Mega heeft slechts 8kByte.

Beste Sterretje, KurtE,

Dank je voor de snelle reacties.

Ter info: ik gebruik de UTFT_SdRaw.cpp - Add-on library to integrate UTFT and SdFat.
Copyright (C)2014 Graham Lawrence. Basic functionality of this library
is based on UTFT_tinyFAT by Henning Karlsen. All right reserved

Ik wijzigde de UTFT_SdRaw.cpp en UTFT_SdRaw_h regels zoals je voorstelde.

De eerdere warning is nu niet meer aanwezig maar....
Kreeg na het compileren de melding: Compilation error: exit status 1
Met de onderstaande meldingen die nietszeggend zijn voor me.

Wat zou ik hier moeten veranderen?

c:\Users\Allemaal\Documents\Arduino\libraries\UTFT_SdRaw\src\UTFT_SdRaw.cpp:22:3: error: expected initializer before 'char'
char buf[2 * bufmult * sx];
^~~~
c:\Users\Allemaal\Documents\Arduino\libraries\UTFT_SdRaw\src\UTFT_SdRaw.cpp:25:3: error: expected unqualified-id before 'if'
if (dataFile.open(filename))
^~
c:\Users\Allemaal\Documents\Arduino\libraries\UTFT_SdRaw\src\UTFT_SdRaw.cpp:100:3: error: expected unqualified-id before 'else'
else
^~~~
c:\Users\Allemaal\Documents\Arduino\libraries\UTFT_SdRaw\src\UTFT_SdRaw.cpp:104:1: error: expected declaration before '}' token
}
^

Sorry hard to know what those errors are without seeing more of the output:

I assume you changed:
UTFT_SdRaw/src/UTFT_SdRaw.h at master · ghlawrence2000/UTFT_SdRaw (github.com)

I would assume you have needed to change the implementation as well:
UTFT_SdRaw/src/UTFT_SdRaw.cpp at master · ghlawrence2000/UTFT_SdRaw (github.com)

Possibly some stray characters came in there ...

Die had ik gevonden :wink: Ik ben meer ge-interesseerd in de UTFT bibliotheek die je gebruikt. Als je me verteld welke dat is kan ik de verandering hier maken en compileren.

Zoals gezegd, je probleem zit niet in de waarschuwing die je krijgt maar in het geheugen gebruik van de UTFT_SdRaw bibliotheek.

Dat geeft aan dat je een foutje hebt gemaakt. Waar durf ik niet met zekerheid te zeggen.

De UTFT bibliotheek die ik gebruik: GUslice door Calvin Hass.

Versie 0.17.0

Die bibliotheek heeft geen UTFT.h bestand. Dus compilatie gaat fout aan mijn kant.

Ik heb nu deze bibliotheek geinstalleerd:

Compileren gaat goed. Geen foutmeldingen of warnings.
Seriele monitor geeft: 10:29:59.591 -> x�
Beeld op TFT geeft voor eenderde grijs beeld.

Mooi

Verkeerde baud rate, of wat rommel van de bootloader of een indicatie dat je geheugen problemen hebt (bv. niet genoeg geheugen, zie eerder).

Ik denk nog steeds dat je gebeugen problemen hebt. Maar zonder je nieuwe programma en duidelijkheid wat je precies geinstalleerd hebt kan ik je niet verder helpen.


Dat is geen bebliotheek. Dat is een verzameling van bibliotheken en ander spul. Ik heb de UTFT uit Vivarium getrokken en geprobeerd je originele programma daarme te compileren en krijg een melding 1265148.post01:9:13: error: 'ILI9341_16' was not declared in this scope.

Oke, dan laat ik het hierbij.
Hartelijk dank voor de genomen moeite.

Sorry dat ik je niet verder kan helpen. En nog veel meer sorry voor het, per ongeluk, schreeuwen (extra vetter letters); ik heb dat laatste gewijzigd.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.