Skocz do zawartości

Kurs programowania uC AVR w C (WinAVR, Kurs AVR-GCC)


Pomocna odpowiedź

a = 3; //0b00000011

b = 4; //0b00000100

a&&b

W tym miejscu program robi tak:

Biore sobie a i sprawdzam. Jest nie zerowa wiec fajnie

Biore sobie b i sprawdzam. Jest nie zerowa tym lepiej

Mam dwie wartości nie zerowe czyli logicznie prawde i robie na nich iloczyn czyli wystawiam również prawdę. Czyli daje 1

W skrócie operatory && || Porównója wartości zmiennych w założeniu że 0 to fałsz a wszystko inne to prawda.

a&b

Tutaj wygląda to już inaczej

3 0b00000011 
4 0b00000100 &
0 0b00000000

I tutaj moje sprostowanie 😋 źle przepisałem miało być 5 a nie 9 Sorry

ale już dla 13 i 5

13  0b00001[1]0[1]
5   0b00001[0]0[1]
5   0b00001[0]0[1]

Czyli robimy porównanie bit po bicie i składamy to w wynik

Pozdrawiam

A dlaczego wszystko porównywane jest z fałszem i prawdą a nie z jakąś konkretną liczbą? I czemu wynikiem takiej funkcji logicznej jest prawda lub fałsz a nie iloczyn czy co tam będzie tychże zmiennych?

Symfonia C++ do ręki i czytać. Z tą książką nawet 10-letnie dziecko o zdolnościach humanistycznych zacznie programować.

Czemu C++ skoro to programowanie w C? Nie będzie drobnej aczkolwiek istotnej różnicy?

Powiedzmy sobie szczerze: C++ nie różni się znacznie w podstawach od C, jak się nauczysz C++ to praktycznie od razu będziesz umiał programować w samym C (oczywiście jest kilka różnic pomiędzy tymi językami w podstawach). Wykorzystując AVRGCC dostajemy kompilator języka C w standarcie ISO 9899 więc w podstawach mam to samo co C++:

funkcje inline (znane z języka C++)

dodanie słowa kluczowego restrict

możliwość deklaracji zmiennych w dowolnym miejscu w programie (przyjęte z języka C++)

kilka nowych wbudowanych typów zmiennych takich jak typ logiczny czy long long int

tablice o zmiennej liczbie elementów

komentarze w stylu C++ zaczynające się od // i kończące wraz z końcem linii

nowe standardowe funkcje oraz pliki nagłówkowe

typ bool zawarty w nagłówku stdbool.h

Jak mówię, chodzi mi o podstawy, więc np już o technice OOP nic nie mówię.

Fałsz i prawda to bardzo konkretne liczby jako wyjścia z funkcji już zaimplementowanych w C to jest to odpowiednio 0 i 1 a jako wjescia do tych funkcji to fałsz jest również 0 a prawdą cała reszta.

AND to jest iloczyn logiczny OR to jest suma logiczna. I dokładnie to wychodzi co trzeba 😋. Tylko że raz wychodzi zmiennych a raz wychodzi liczba która jest wynikiem porównywania konkretnych bitów danych wartości. Polecam odaplic sobie Dev-CPP i dużo ale to dużo sie pobawić.

Pozdrawiam

W c nawet nie mogę sobie niczego rozkminić na podstawie składni tegoż języka. Weźmy na przykład początek programu zamka na karty chipowe (gdzieś znalazłem i próbuję skompilować)

#include <avr/io.h> 
#include <util/delay.h>

#define  	SW	PIND.6 
#define  	JMP	PINB.0 
#define  	VCC	PINB.2 
#define   	CLK	PORTB.3
#define  	RST	PORTB.4
#define  	IN	PORTB.1
#define  	OUT	PINB.1
#define  	LED	PORTD.0
#define     BUZZ PORTD.1
#define     PRZ PORTB.5

#define  del 15


char pytanie[48]={1,0,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,0,0,0,0,1,1,1,0,1,0,1,0,1,1,0};  // tablica zawierajaca zadawane karcie pytanie
char int_licz,int_licz1,int_licz2=0,wrong_card;							    // na podstawie ktorego generuje ona odpowiedz
unsigned int bin; 
bit ok=1;
eeprom unsigned int chip_code[20];	// tablica przechowujaca aktywowane karty telefoniczne
eeprom int licz_kart;

char n;
int li_kart;


void reset(void)		// procedura resetujaca karte chipowa
{
RST=1;
_delay_us(del);
CLK=1;
_delay_us(del);
CLK=0;  
_delay_us(del);
RST=0;
_delay_us(del);
}    

W bascom były deklaracje zmiennych a tu? Nie ma. Skąd ja mam wiedzieć co to jest char n; ?

operacje logiczne działają na prawdzie i fałszu dlatego liczby muszą być zamienione właśnie na jedną z tych wartości. Operacje liczbowe wykonuje się inaczej. A operacje iloczynu i sumy "logicznej" o które ci chodzi to działania bitowe. A w tym wypadku wykonujemy jeszcze inną operację czyli przyporządkowujemy wyrażeniu wartość prawda lub fałsz żeby to przetworzyć na warunek pętli czy ifa.

A podstawy C i C++ są takie same, języki rozwidlają się później. Masz inne biblioteki, dochodzą inne konstrukcje itp. W każdym razie jeśli chodzi o rozwiązanie problemów nad którymi na razie siedzisz czyli operacje na zmiennych, operatory, konstrukcje warunkowe, pętle itp to na pewno możesz korzystać z opracowań pod C++.

W bascom były deklaracje zmiennych a tu? Nie ma. Skąd ja mam wiedzieć co to jest char n; ?

Jeszcze musisz bardzo wile doczytać.

A tak dodam, że char, to jest typ zmiennej.

A tak dodam, że char, to jest typ zmiennej.

Wiem że to typ zmiennej tylko chodzi mi o to że przed nią nie ma nic w stylu declare czy też jak w bascom Dim.

no ale wyrażenie char xxx; samo w sobie jest deklaracją zmiennej typu char o nazwie xxx nie musisz tutaj żadnych dodatkowych słówek wstawiać.

Naprawdę lepiej zajrzyj do literatury i na konsoli dokładnie sprawdź działanie wszystkich funkcji bo wyjdzie na to że po zebraniu wszystkich odpowiedzi na twoje pytania będzie można wydać kolejną książkę o podstawach C 😃

C i C++ maja te fajne cechy, że rzeczy, które mogą być krótkie, są krótkie.

Z rzeczy o których warto pamiętać: jeśli mamy w kodzie cos takiego:

#define RST PORTB.4

...

RST=1;

to kompilator widzi:

PORTB.4 = 1;

Co jest zupełnie bez sensu, a pokazywany błąd odnosi się nie do linii gdzie jest zrobione define, tylko do linii gdzie definicja preprocesora (tak sie nazzywa #define) jest wykorzystana.

Dotarłem w sjumie do rozdziału nr 3 Symfonii C++ i nie widzę większych różnic między Bascom a C++ poza nazwami dla zmiennych i delikatnie inną składnią.

Natomiast nadal nie rozumiem jednej rzeczy. Teoretycznie dajmy na to że:

int zmienna;

to deklaracja zmiennej, więc dlaczego gdzieniegdzie można znaleźć sformułowanie:

int main(void);

A przede wszystkim nie mogę spamiętać wszystkich tych typów zmiennych. Ma ktoś jakiś ciekawy sposób na zapamiętanie ich?

int main(void) to podprogram. Nie powinno być po tym ; tylko klamerka. Main to program główny ale możesz tak samo deklarować inne podprogramy.

typów zmiennych jest niewiele (tych podstawowych). Popatrzmy:

char - zmienna znakowa, 1B, -127 - +128

int - stałoprzecinkowa ze znakiem, 2B (AVRy), 4B (ARMy i PC),
float - zmiennoprzecinkowa (znaczy się z ułamkiem)

double - zmiennoprzecinkowa o większej precyzji

void - nic

i inne, ale rzadziej używane

Natomiast można je modyfikować słowami: unsigned, signed, short, long, volatile, register, const itd. nie wszystkie i nie każdym. Do tego dochodzą tablice i wskaźniki.

to deklaracja zmiennej, więc dlaczego gdzieniegdzie można znaleźć sformułowanie: Kod:

int main(void);

nie odpowiem Ci, bo widocznie czytasz po łebkach książki. Albo też dopiero doczytasz do tego miejsca, ale samemu szukać musisz się nauczyć.

edit:

Armir: jaki niby podprogram?? To się nazywa funkcja, ew. można zaakceptować procedura (jeśli funkcja nic nie zwraca i nie pobiera), ale podprogramem nie nazwałbym niczego co nei ma oddzielnego pliku wykonawczego albo chociaż oddzielnego wątku.

I jak najbardziej prawidłowy jest zapis:

void funkcja(void);

tylko zależy w którym miejscu i co ma robić.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...