Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 lis 2024, o 13:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 28 lut 2012, o 21:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Mam Dwa pytanka raczej z tych "oczywistych" :)

1. czy dobrze myslę że przy typie danych bool zmienna przy użyciu takiego kodu będzie zmieniać "znak"

a = 0

a ^= a

Czyli w zmiennej powinno być teraz 1

2. Czy C jest jakaś funkcja rozpoznająca typ zmiennej ? ( OOOOooo już widzę to pytanie a po co ci to skoro przy deklaracji zmiennej podajesz jej typ ) :)
Otóż odrazu odpowiadam :)
Bo chciałbym wiedzieć czy jest taka możliwość, a jeżeli jest to gdzie mogę poszukać informacji na ten temat.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lut 2012, o 23:12 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27314
Lokalizacja: Szczecin
Pomógł: 1041

Malutki_27 napisał(a):
Mam Dwa pytanka raczej z tych "oczywistych" :)

1. czy dobrze myslę że przy typie danych bool zmienna przy użyciu takiego kodu będzie zmieniać "znak"

a = 0

a ^= a

Czyli w zmiennej powinno być teraz 1


Nie nie panie kolego - masz do czynienia z operacjami bitowymi a tu konkretnie z XOR, wystarczy w googla wpisać nazwę operacji bitowej oraz dwa słówka - "tabela prawdy" ;) i od razu zobaczysz, że dla XOR tabela wygląda tak:

Cytuj:
0 XOR 0 = 0
1 XOR 0 = 1
0 XOR 1 = 1
1 XOR 1 = 0


z tego jasno wynika panie kochany że jeśli twoje a=0 to opracja a XOR a czyli 0 XOR 0 = 0 (ZERO)

a jeśli chcesz zmieniać TRUE NA FALSE to musisz robić pan tak jak niżej i to niezależnie jaki znak był na początku w a ( True(1) czy False(0) )

Kod:
a ^= 1;


po tej operacji zawsze wartość bool w a zmieni się na przeciwną ;) ..... Jeszcze raz powtarzam - google + tabele prawdy i wkłucie na pamięć TYLKO 3 podstawowych czyli: AND, OR i XOR a reszta to pochodne



Malutki_27 napisał(a):
2. Czy C jest jakaś funkcja rozpoznająca typ zmiennej ? ( OOOOooo już widzę to pytanie a po co ci to skoro przy deklaracji zmiennej podajesz jej typ ) :)
Otóż odrazu odpowiadam :)
Bo chciałbym wiedzieć czy jest taka możliwość, a jeżeli jest to gdzie mogę poszukać informacji na ten temat.


hyhyhy sorki ale ja jak widzę takie pytania z sugestią odpowiedzi czy pytań pomocniczych - to od razu widzę albo lepiej powiedzieć - czuję, że pachnie tu ogromnym niezrozumieniem tematu. To znaczy dokładniej mówiąc moim zdaniem nie rozumiesz jeszcze po co są typy danych - i dlatego szukasz metod ich "wykrywania" ....

dlatego polecam szczerze - dobrze zadać pytanie, powiedzieć jaki masz tak na prawdę cel albo czego nie rozumiesz - bo wtedy łatwiej byłoby mi tobie pomóc - a tak ? Widzę tylko dużą lukę :(

bo jak ci powiem, albo przypomnę bo w książce to sygnalizowałem, że w języku C istnieje nawet typ nieokreślony zmiennych ale wskaźnikowych - void i można go zastosować np tak:

void a; ---- ŹLE

a tak:

void * z; ----- DOBRZE

to co ty na to powiesz ? - przecież skoro nieokreślony - to jak chciałbyś go wykryć ? ;) mam nadzieję, że ten drobny przykład pokazuje ci , że nie chcę mówić ci "OOOOooooo ! ....."

Tylko czasem potrafię chyba wyczuć z wyprzedzeniem gdzie ktoś ma problem i szybciej do niego dojść - niż gdy inni (jak to bywa na elekrodzie) potrafią tylko brnąć w takie czasem dziwne pomysły i próbować podpowiadać jak realizować coś - co można zrobić całkiem inaczej i prosto - gdyby na początku autora pytania zapytać konkretnie właśnie a do czego ci to ? - pomimo że tak bardzo wzbrania się przed takim pytaniem - rozumiesz mnie ? ;) ja na pewno nie mam zamiaru ci czegoś narzucać albo tylko odsyłać do googla i chętnie pomogę a także zrozumiem to , że być może masz kłopot z najprostszymi rzeczami bo na początku czasem one wykładają wszystko do góry nogami i nie można ruszyć dalej ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lut 2012, o 23:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Pytałem wujka google, ale cholernik chyba już coś wypił bo gadał w obcym języku ;)
1. OOooooo :D własnie mi o to chodziło. Dzięki za łopatologiczne wyjaśnienie, bo jakoś tak sobie napisałem na kartce te parę literek i jakoś nie bardzo mi pasowało wzrokowo :)

2. Celu nie mam żadnego. Pytanie należy traktować jako ( ... hmmm no własnie jak ... ) to z czysto teoretycznych :)
Chodziło mi o to czy typami danych można się podobnie "bawić" jak w VBA . A dokładnie chodzi mi o to czy można w C robić automatyczną konwersję między typami danych ( w prosty sposób jak w VBA ). A wyłuszczając o co napradę mi chodzi, to "klejenie" ze sobą danych i np. wyrzucenie ich na LCD lub RS232.

Na razie nie mam problemu z niczym, to są rozważania teoretyczne przed zabawą USART'em :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lut 2012, o 23:46 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27314
Lokalizacja: Szczecin
Pomógł: 1041

Malutki_27 napisał(a):

Chodziło mi o to czy typami danych można się podobnie "bawić" jak w VBA . A dokładnie chodzi mi o to czy można w C robić automatyczną konwersję między typami danych ( w prosty sposób jak w VBA ). A wyłuszczając o co napradę mi chodzi, to "klejenie" ze sobą danych i np. wyrzucenie ich na LCD lub RS232.


O! widzisz o wyciągnięcie takich informacji mi chodziło ;) ... teraz mogę coś sensownego odpowiedzieć.

W pewnym zakresie oczywiście że jest możliwość robienia konwersji między typami danych jak najbardziej, tyle że w języku C nazywa się to jawnym lub niejawnym rzutowaniem typów na przykład ;) ale można w tym celu posłużyć się w jakimś zakresie także strukturami - to zależy co się chce zrobić....

Ale słysząc "klejenie" w kontekście RS'a ;) już czuję przez skórę o co chodzi - i tu nie będzie tak jak językach wyższego rzędu na PC. Bo na PC zwykle obecne języki mają np coś w rodzaju typu

STRING

prawda ? ;)

zatem jeśli mamy dwie zmienne a i b typu string na PC to co za problem zrobić z nimi takie coś:

c = a + b

W języku C będzie tu trzeba się posłużyć specjalnymi funkcjami operującymi na tablicach bo przecież u nas ni ma czegoś takiego jak STRING, za to mamy C-String czyli tablicę danych zakończoną znakiem NULL....

Dlatego trzeba będzie posłużyć się funkcjami operującymi na takich właśnie tablicach i wtedy będzie można kleić - tylko hmmm że tak powiem - trochę inaczej klej wygląda ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lut 2012, o 00:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

No własnie widzę że ten klej to ma całkiem inny skład ;)
Mysze poczytać coś na ten temat, bo zagadnienie wydaje mie się ciekawe, a i pewnie warto je poznać
Dziękuję za objaśnienie tematu

Tak na marginesie powinno to wyglądać c = a & b ( tu inny klej dają ) ;)

Z tego co sobie popatrzyłem to chyba do takiego klejenia najlepsze będzie (s)printf, bo to raczej uniwersalny klej, tylko chyba dosyć ciężki.

I przy okazji mam jeszcze jedno pytanie dotyczące pamięci EEPROM jest to pamięć nie ulotna po zaniku zasilania, a pytanie brzmi czy mikrokontroler ma możliwość zapisu do niej w czasie parcy ? ( Niestety nie mam książki przy sobie i nie moge tego zweryfikować, natomiast pamiętam że chyba pisałeś o tym i nawet przestrzegałeś przed zbyt częstym zapisywaniem do niej).

A czasem nie jest tak że do tak zdefiniowanych zmiennych nie da się nic zapisać ? Przecież to void taka zmienna nie powinna zwrócić żadnej wartości a raczej powinna tylko że 0. Mylę się ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lut 2012, o 00:33 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27314
Lokalizacja: Szczecin
Pomógł: 1041

Tak sprintf to ciężki klej ale bez przesady ;) za to dobrze wiąże.

Z eeprom jest tak że nie można jej traktować jak ram ;) czyli nadaje się bardziej np do zapamiętywania ustawień urządzenia itp

a z tym void to źle myślisz ale teraz nie mam jak opisać bo klikam mało wygodnie z telefonu. więc przypomnij się jeszcze z tym np jutro to odpiszę z kompa a za to w drugiej części książki taki typ będzie co i rusz wykorzystywany w omawianych kodach ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lut 2012, o 00:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Szkoda palców na telefon, przypomnę się jutro :)

Troszkę poczytałem o cstring ale też znalazłem iostream i powiem że te biblioteki pod względem klejenia wyglądają całkiem obiecująco :D

A teraz to czas już iść spać bo rano dzieciaki mnie wykończą :|



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lut 2012, o 22:33 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27314
Lokalizacja: Szczecin
Pomógł: 1041

Malutki_27 napisał(a):
A czasem nie jest tak że do tak zdefiniowanych zmiennych nie da się nic zapisać ? Przecież to void taka zmienna nie powinna zwrócić żadnej wartości a raczej powinna tylko że 0. Mylę się ?


Więc tak mylisz się ale ja pomyliłem się albo rozpędziłem nieco podając wyżej dwa przykłady:

void a; <------------ BŁĄD !!!! tak nie można

void * a; <---------- POPRAWNA definicja !!!!!

tylko wskaźniki mogą być typu void. W pewnym sensie to także zmienne ;) tyle że wskaźnikowe. Co ciekawe taka definicja:

Kod:
void * a;


nie rezerwuje ani jednego bajtu w pamięci ;) ... ponieważ mamy zdefiniowany pusty typ wskaźnikowy czyli jeszcze nie określony, ale za to możemy wykonać takie operacje z jego udziałem:

Kod:
uint8_t *z = a;  <------- widzisz ?


albo

Kod:
uint8_t k = 8;
uint8_t *z = &k;
a = z;  <-------------- widzisz ?


korzystamy dzięki tu z możliwości dowolnego rzutowania w każdą stronę na dowolny typ wskaźnikowy. Pewnie powiesz: "No fajnie" ale po co mi to?"

hmmm podam praktyczny przykład, załóżmy że chcesz mieć funkcję, która wysyła ci liczbę na jakiś port np na PORTA bo tam masz diody LED. Jednak chcesz ją wywoływać w różnych miejscach programu i będziesz chciał podawać jako argument zmienne różnych typów raz int8_t, innym razem char a jeszcze innym uint8_t ;) jak to zrobić, przecież można zdefiniować tylko jeden typ dla argumentu np:

Kod:
void send_to_port( uint8_t * liczba );


prawda ?

no to teraz gdy mamy w kodzie gdzieś zmienną

Kod:
char k=2;
char * z=&k;


i zechcemy tak użyć funkcji:

Kod:
send_to_port( z );


to spodziewasz się sam że kompilator poda ci ostrzeżenie (warning o tym że jest inny typ zmiennej przekazywanej jako argument w stosunku do zdeklarowanego typu argumentu - zgadza się prawda ?

No to co ? jakie wyjście ? hmmm no można byłoby ją tak wywołać:

Kod:
send_to_port( (uint8_t)z );


bo zrobiliśmy jawne rzutowanie - ale co ? za każdym razem tak rzutować jeśli ta funkcja ma być uniwersalna ? no nie możemy się posłużyć type void - o tak:

Kod:
void send_to_port( void * liczba );


widzisz to ? ;) zamieniłem typ argumentu uint8_t na void ;)

od teraz mogę pisać ciurkiem i tak:

Kod:
char * z;
send_to_port( z );


a nawet tak:

Kod:
int * p;
send_to_port( p );


a kompilator nie zrobi ani mru mru ;)

reasumując najlepszym przykładem będą niektóre funkcje wbudowane jak np:

memcpy(), której deklaracja jak zajrzysz do pliku nagłówkowego teraz wyda ci się już bardzo znajoma i będziesz wiedział dlaczego widzisz tam typy void dla argumentów ;) dobrze mówię ?

Kod:
memcpy(void *, const void *, size_t ) : void


ufff Quniec opisu - jak coś nie jasne to dopytaj ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2012, o 12:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Łojejej , no to teraz mam co przetrawić :) Dziękuję za dogłębne wyjaśnienie, nie powiem żebym zozumiał od razu wszystko, ale po paru eksperymantach na pewno się uda :)

Świetnie opisane, niedość że jest ładnie wytłumaczony typ void, to jeszcze są piękne przykłady rzutowania :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO