avr Trójargumentowy operator warunkowy

avr Trójargumentowy operator warunkowy
C1
  • Rejestracja:około 4 lata
  • Ostatnio:około miesiąc
  • Postów:22
0

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

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

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

Kopiuj
		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 |=

AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Postów:3561
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".


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 3x, ostatnio: AnyKtokolwiek
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
2
Kopiuj
PORTC^=(PORTC^stan)&(1<<PC1);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
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.

Kopiuj
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
AL
PORTx|=(1<<Pxy) to rekomendowany przez maintainerów AVR-GCC sposób dostępu do IO. I raczej będzie (tudzież: miał być) to kod w C. Tzn. nie dam głowy ale kod na to wskazuje.
AL
A, i jak pamietam AVRy to dobrze, żeby flag był typu uint8_t albo short (tam to to samo).
AK
@MarekR22: zamknąć w klasie? A to jest klasa (pytanie statystycznego arduinowca) ;)
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
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:

Kopiuj
	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);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.