Tablica dynamiczna

0

W pewnym programie obslugujacym wyswietlacz musiałem tablicę statyczną zastąpić dynamiczna. Zmieniłem więc
w pliku nagłówkowym klasy

uint8_t SSD1306_Buffer[SSD1306_WIDTH * SSD1306_HEIGHT /8];

na:

 uint8_t* SSD1306_Buffer;

i w pliku.cpp napisałem funkcję alokującą pamieć w sposób

this->SSD1306_Buffer=new uint8_t[SSD1306_WIDTH * SSD1306_HEIGHT /8];

W efekcie na wyswietlaczu pojawily się błędne piksele ktore nie wiem skad się wzięły. Czy ktoś ma jakiś pomysł co może byc przyczyną

0

@danielbr3: Masz śmieci w tej tablicy, więc ją wyzeruj. Tak mi się wydaje.

0

W dalszej części programu wypełniam cały bufor 0 lub 1 w zależności od tła (czarne lub biale) i dopiero wtedy wypisuje tekst

0

Właściwie to teraz zauważyłęm że problem występuje chyba tylko w funkcji wypełniającej cały ekran, więc może wstawie tylko to, bo wydaje mi się że tutaj należy szukać błędu i nawet mam już pewien pomysł który muszę sprawdzić.

0
void SSD1306::Fill(SSD1306_COLOR color) {
    /* Set memory */
    uint32_t i;

    for(i = 0; i < sizeof(SSD1306_Buffer); i++) {
        SSD1306_Buffer[i] = (color == Black) ? 0x00 : 0xFF;
    }
}
0

Zgadza się, to jest przyczyna problemu. Po zamianie tablicy na dynamiczną sizeof(SSD1306_Buffer) nie zwraca wymiaru. Po wstawieniu w to miejsce SSD1306_HEIGHT*SSD1306_WIDTH/8 działa już dobrze. Czy mogłby mi ktoś wyjaśnić dlaczego tak się dzieje?

4

Wskaźnik ma zawsze tę samą wielkość, a sizeof zwraca wielkość ponanego typu/typu podanej zmiennej

0

Jeszcze jedno pytanie. Raz przez przypadek zaalokowałem zbyt mała pamięc i zdziwiłem się że wyswietlacz nadal działał prawidlowo.
Przykładowo jak zaalokuje new uint8_t[1] to wszystko nadal jest ok. Jakim sposobem? Wcześniej w takich przypadkach zawsze wyrzucało mi błąd wykroczenia poza zarezerwowaną pamięć.

1

UB to UB. Pewnie w małym systemie mażesz po innych danych.

0

Znalazłem odpowiedż. Okazuje się ze mikrokontroler na ktory pisze program nie ma kontroli dostepu do pamieci

1 użytkowników online, w tym zalogowanych: 0, gości: 1