avr Trójargumentowy operator warunkowy

0

dlaczego nie chce mi działać Trójargumentowy operator warunkowy.

>  warunek ? wartość1 : wartość2 

Próbowałem na różne sposoby zapisać i nie działa:

		PORTC stan ?(&= ~):(|=) (1<<PC1);
                PORTC (stan ?(&= ~):(|=)) (1<<PC1);
                PORTC (stan ? &= ~:|=) (1<<PC1);
		PORTC stan ? &= ~ : |= (1<<PC1);

PORTC &= ~(1<<PC1) i PORTC (1<<PC1)
chciałbym aby zwracałwartośc: &= ~ albo |=

1

Masz tam tylko operatory a nie wyrażenie (wartość), co jest wymagane.
Operatory nie mają wartości. Oprócz prawej, lewa strona też jest napisana bez sensu.

Skąd takie "hackerstwo" ?
Strzelamy, strzelamy, a widzieliśmy jakiś podręcznik C, choćby przez ramię u kolegi ?
(tak, wiem, prawdziwi arduinowcy nie czytają niczego)

PS. nigdy na podobnych forach nie pisz "nie działa", tylko np "daje błąd kompilacji Xxxxxxx".

2
PORTC^=(PORTC^stan)&(1<<PC1);
4

To coś nie przypomina kodu C lub C++, bardziej wygląda tak jakby kot przebiegł ci po klawiaturze.
Ciekawe co chcesz osiągnąć, może Dragon dobrze strzela.
Jednak zamiast pisać, coś co będzie wymagało poświęcenia większego czasu na zrozumienie co się dzieje podczas każdego pisania, lepiej napisać coś co może będzie dłuższe, ale czytelnik zrozumie w 3 sekundy.

int flag = (1<<PC1);
PORTC = stan ? (PORTC & ~flag) : (PORTC | flag);

Albo jeszcze lepiej, zamknąć to w klasie reprezentującej flagi, żeby było to jedną zrozumiałą linijką, np tak jak tu: QFlags.

1

@MarekR22: Z trajektorii kota biegnącego po klawiaturze ciężko się zgaduje intencje właściciela. Więc jak na to patrzę, to raczej twój kod bardziej odpowiada intencją właściciela :p
Więc może jeszcze taka wersja tego samego:

	static uint8_t (*fun[])(uint8_t v,uint8_t s)
	{
		[](uint8_t v,uint8_t s){ return (uint8_t)(v&~(1<<s)); },
		[](uint8_t v,uint8_t s){ return (uint8_t)(v|(1<<s)); }
	};
PORTC = fun[!stan](PORTC,PC1);

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