v.....y
v.....y
#programowanie #cpp #cplusplus #arduino #avr

Mam problem, tzn. wcześniej było tak

unsigned char charMap[] = { ... }
unsigned char *pFont;
(jakiś kod)
pFont = &charMap[((unsigned int)(*c) - 32) * 14];
a teraz jest tak:

prog_uchar charMap[] PROGMEM = { ... }
unsigned char *pFont;
pFont = pgm_read_byte_near(&charMap + ((unsigned int)(*c) - 32) * 14);
i kompilator wyrzuca mi błąd

invalid conversion from 'uint8_t' to 'unsigned char*
Moglibyście mi pomóc? Jak temu zaradzić? Próbowałem konwersji na wskaźnik ale chyba coś robię źle, bo nie pomaga.
  • Najlepsze
  • Wszystkie komentarze
Supercoolljuk2
Treść przeznaczona dla osób powyżej 18 roku życia...
inplaz
@vifon_pikantny: pFont to wskaźnik na char, nie możesz przypisać do niego wartości char (tzn możesz przez rzutowanie, ale raczej nie osiągniesz nic poza katastrofą). Możesz tę wartość zapisać pod adres który wskazuje pFont:

*pFont = //stuff

ale w tym przypadku to też kiepski pomysł, bo nie zainicjowałeś jego wartości, więc nie wskazuje na nic konkretnego (na coś wskazuje tylko nie wiadomo na co)
inplaz
@vifon_pikantny: a no i jest jeszcze

pFont++;

teraz pFont nie jest wskaźnikiem wiec zamiast tego używaj pgmreadbyte_near z wartością za każdym razem o 1 większą

http://wklej.org/id/1502416/
A.....k
A.....k
@vifon_pikantny: Tak czy siak Arduino IDE korzysta z tej samej biblioteki w ten sam sposób. Definiujesz tablicę (kompilator ustali jej adres) i operujesz takim wskaźnikiem. Żebyś go sobie gdzieś nie zapomniał zmienić, definiuj go (ją, tą tablicę) jako const, przecież i tak jest tylko do odczytu. To nie obowiązek ale dobra praktyka.
p.....n
p.....n
@vifon_pikantny: a co zwraca pgmreadbyte_near ?
v.....y
v.....y
p.....n
p.....n
@vifon_pikantny: jak chara to niedziwne, że błąd jest. Ale z błędu wynika, że uint8_t zwraca
v.....y
v.....y
@pstjepan: no niewątpię, tylko nie mam pojęcia jak temu zaradzić
p.....n
p.....n
@vifon_pikantny: tak czy inaczej robisz źle, bo próbujesz przypisać liczbę do wskaźnika
v.....y
v.....y
@pstjepan: umiem czytać, jeżeli nie zamierzasz pomóc w konkretach to pozdrawiam
p.....n
p.....n
@vifon_pikantny: to dobrze, że umiesz czytać. Domyślam się, że zamiast "pFont =" ma być tam "*pFont ="
IdeaGames
@Supercoolljuk2: a Ty przeRZuć się na słownik ortograficzny, analfabeta i w dodatku obraża rodzinę królewskich języków, sam kodzę w javie, ale szacunek do rodziny C trzeba posiadać :D
Yahoo_
@vifon_pikantny:

pFont = &charMap[((unsigned int)(*c) - 32) * 14];


Proponuje popracować nad czytelnością kodu
v.....y
v.....y
@pstjepan: error: invalid type argument of 'unary *'
v.....y
v.....y
@inplaz: tak, rzutowanie sprawiło, że miałem krzaki :) Za to zmiana pFont na *pFont dała taki skutek jak powyżej.
inplaz
@vifon_pikantny: ale czemu wartość char chcesz przypisać do wskaźnika i to, o zgrozo, bez zainicjowanej wartości?
v.....y
v.....y
@inplaz: nie wiem, po prostu chciałem dodać PROGMEM do programu i mi się krzaczy, jeżeli masz jakiś inny pomysł na realizację dokładnie tego samego co było poprzednio, to zapraszam :)
inplaz
@vifon_pikantny: a do czego używasz pFont? jeżeli tylko potrzebujesz wartości tego chara to po prostu zmień typ pFont z unsigned char* na unsigned char
v.....y
v.....y
@inplaz: cała funkcja wygląda tak:

http://wklej.org/hash/59ddd9d4d1c/

po ostatniej radzie się krzaczy niestety