Skocz do zawartości

OpenFontRender (ofr) i strtok_r brak wyświetlania w pętli loop.


Pomocna odpowiedź

Napisano

- gdzieś na forum znalazłem program obslugujący strtok_r do dzielenia tekstu wg separatorów.

- sam podprogram dzielenia tekstu działa i wyświetla poprawnie tekst na TFT zapisywany w tablicy.

- ta sama tablica w pętli loop jednak nie chce się wyświetlać dając błąd o przekroczeniu bufora 256 znaków w OpenFontRender.

- jedna tablica DX raz się wyświetla, drugi raz już nie, coś chyba nagrzebałem, tak jakby brakowało w tablicy znaku NULL na końcu.

- proszę o pomoc bo nie daje rady z tym problemem.

char* DX[10];

void testChar()
{
  char *str;
  char sz[] = "Prognoza na jutro. Niewielki deszcz. ";
  char *p = sz;
	char *del = ".";																	// separator
	int indeks = 0;
		// -------------------------------------
  while ((str = strtok_r(p, del, &p)) != NULL) 
    {
			DX[indeks] = str;	
    		ofr.printf("%s\n", DX[indeks])		// tu wyswetla poprawnie
			indeks += 1;
    }
}
// .... loop
if (millis() > czas)
	{
		Serial.println(".");	
		tft.fillScreen(TFT_BLUE);
		testChar();
				
		for(wiersz = 0; wiersz < 6; wiersz++)
		{
			ofr.setCursor(50, 20 * wiersz);
			
     		//ofr.printf("%s\n", DX[wiersz]); // tutaj blad !
		}	
		czas = millis() + 10000;					
	}

 

(edytowany)

Gdzie inicjalizujesz DX? To jest wskaźnik na tablicę 10 elementów (co - jeśli dobrze pamiętam C - jest równoważne tablicy tablic dziesięcioelementowych), ale brakuje mi wywołania `new` albo `malloc` dla tego wskaźnika.

Powinno być albo `char DX[10]` (bez wskaźnika) albo coś w deseń: `char * DX[10]; DX = (char *[])malloc(sizeof(char) * 10 * 20);`. To ostatnie trzeba sprawdzić, bo dawno nie pisałem w gołym C (w sensie, czy cast `(char *[])` zadziała).

Jeżeli nie zainicjujesz DX, to najprawdopodobniej wskazuje on na jakieś losowe miejsce w pamięci. Jeżeli piszesz do tego miejsca i zaraz z niego czytasz, to zadziała (zbiegiem okoliczności). Ale dane przechowywane w tamtym miejscu nie są bezpieczne, bo pamięć nie została zarezerwowana. Wystarczy, że w międzyczasie zostanie zaalokowana pamięć i już dane, które się tam znajdowały, mogą zostać nadpisane. Nie mówiąc już o tym, że zamazujesz losowe miejsce w pamięci, co ogólnie jest przepisem na katastrofę.

Pozdrawiam -- Spook.

Edytowano przez spook
  • Lubię! 1

- DX[] to tablica wskażników, zainicjalizowałem char* DX[10] = {"ala"};

- potem komendą Serial.printf("tekst %#xd\n", &DX[wiersz]);, zobaczyłem że wyświetla kolejne adresy co 64 bajty.

- obecnie komenda ofr.printf("%s\n", &DX[wiersz]);, wyświetla wiersze ale zawartość jakaś z kosmosu.

tekst 0x3fc93d00d
tekst 0x3fc93d04d
tekst 0x3fc93d08d
tekst 0x3fc93d0cd
tekst 0x3fc93d10d
tekst 0x3fc93d14d
tekst 0x3fc93d18d
tekst 0x3fc93d1cd

 

(edytowany)

- kombinowałem na różne sposoby ale zawsze krzaczki na TFT.

- zastosowałem ten podprogram, działa, ma on tę zaletę że poprzez indeks wybieramy numer separatora.

- wada: nie ma zakresu separatorów.

	// Function to return a substring defined by a delimiter at an index
char* subStr(char* dest, char* str, const char *delim, int index)
{
  char *act;
  char *sub = nullptr;
  char *ptr;
  int i;

			// Since strtok consumes the first arg, make a copy
  strncpy(dest, str, strlen(str)+1);
  for (i = 1, act = dest; i <= index; i++, act = nullptr) {
    sub = strtok_r(act, delim, &ptr);
    if (sub == nullptr) break;
  }
		sub = Trim(sub);
  return sub;
}
	// ------------------
char* Trim(char* p)
{
  while ((*p != '\0') && isblank(*p)) { p++; }  // Trim leading spaces
  char* q = p + strlen(p) -1;
  while ((q >= p) && isblank(*q)) { q--; }   	// Trim trailing spaces
  q++;
  *q = '\0';
  return p;
}

 

Edytowano przez 99teki

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...