dzieki za odpowiedzi,
na spokojnie sprawdzę kod i poprawię.
Co do poszczególnych fragmentów:
LED5W
Cytat: W pierwszym przypadku odczytywana jest wartość zmiennej c i kopiowana do argumentu funkcji foo. Funkcje działają na kopii, więc nawet, jeśli wartość c się zmieni podczas wykonywania foo, ta funkcja nic o tym nie będzie wiedzieć.
W drugim przypadku kopiowany jest wskaźnik. Działa to tak samo - wartość wskaźnika (czyli adres) się nie zmienia, ale wartość na którą wskazuje może się zmienić.
Oczywiście funkcja foo dla tych dwóch przypadków powinna być inaczej zadeklarowana. Odpowiednio:
Sama kwestia kopiowania/ref/wskaźnika jako mechanizm C++ raczej rozumiem i nie wskazywała ona na problem.
Zakładałem, ze w zmiennej char jest tak naprawdę adres pamięci (jednobajtowy), wiec kopiowanie adresu niczego nie zmieni.
To też wysłanie go do funkcji/structury przez kopię nie będzie problemem, ponieważ nadal odwoływac się będziemy do tego samego miejsca.
W C++ to przecież standard i póki nie chcemy modyfikować samego adresu to nie wysyłamy wskaźnika na wskaźnik ani ref na wskaźnik (w sumie to samo...).
Więc sama semantyka (kopiowania, referencji, wskaźnika) nie wydawała mi się problemem.
zgodnie z tym co rozumiałem:
Zaloguj się, aby zobaczyć kod
więc cały czas zmienna, która jest argumentem w tych makrach, jest wskaźnikiem. To też jej kopiowanie nie powinno być problemem.
Dlatego kod setButton powinien zapisać kopię adresu, a ta kopia potem użyta powinna w pełni działać.
Tak bym to rozumiał, gdyby to był zwykły wskaźnik w C++.
Tutaj natomiast w trakcie kopiowania tego chara (który, z tego co rozumiem jest adresem), coś przestaje działać. Mimo, że zgodnie z moją wiedzą, powinien on ciągle wskazywać na ten sam adres.
Więc może problemem nie jest kwestia kopii/wskaźnika, a optymalizacji/volatile?
szelus
Cytat: Wyrażenie PINx w AVR zwraca wartość typu uint8_t / unsigned char, ale nie jest taką wartością (hint: to jest makro). Jeżeli podajesz PINx jako argument funkcji setButton, która przyjmuje argument typu unsigned char, to wbudowany w język C mechanizm dopasowania typów wymusza w tym momencie odczyt portu i przekazanie odczytanej wartości do funkcji.
AAAA czekaj proszę, bo ja nie wiem czy dobrze zrozumiałem.
PINx to makro, które jest przez preprocessor zamieniane na wartość typu uint8_t (unsigned char). Zakładam, że jest to adres pamięci, powiedzmy "10", w miejscu którego wartość jest bajt 0b00000000.
I tutaj jest dla mnie magia, więc to powtórzę:
Cytat: Jeżeli podajesz PINx jako argument funkcji setButton, która przyjmuje argument typu unsigned char, to wbudowany w język C mechanizm dopasowania typów wymusza w tym momencie *odczyt portu* i przekazanie odczytanej wartości do funkcji.
czyli, że argument setButton, nie odbierze adresu "10", tylko wartość 0b00000000?
Dobrze to rozumiem? Moższ coś więcej powiedzieć o tym mechaniźmie?