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



Teraz jest 22 gru 2024, o 10:05


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 126 ]  Przejdź na stronę Poprzednia strona  1, 2, 3, 4, 5  Następna strona
Autor Wiadomość
PostNapisane: 28 paź 2013, o 19:55 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

Dziś czytałem rozdział o przekazywaniu argumentów funkcji przez wartość i nie zrozumiałem, których argumentów robione są kopie. Na początku wspomina się o deklaracji przykładowej funkcji: int mnozenie(uint8_t a, uint8_t b); i w ramce podkreśla się, że argumenty tej funkcji są formalnymi, albo inaczej zwanymi parametrami formalnymi.
Później mówi się, że funkcja w programie przyjmuje argumenty aktualne, które mogą być zmiennymi, wyrażenia lub stałymi.

"gdy funkcja startuje, przygotowuje sobie kopie robocze swoich parametrów formalnych", tzn tych z przykładu zmiennych a i b?
"....na stos odkładane są kopie wszystkich argumentów aktualnych funkcji..."

To jak to jest w końcu, których argumentów robione są kopie, formalnych czy aktualnych?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2013, o 20:04 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

Też tak myślałem, bo to jest nawet bardziej logiczne, że nie ulegają stracie argumenty aktualnie przekazywane do funkcii dzięki wykonaniu ich kopii.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2013, o 20:12 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

Ja to rozumiem wszystko koledzy i wiem jaka jest różnica między tymi dwom rodzajami argumentów, ale zatem co ten zapis podkreślony jeszcze wytłuszczonym drukiem; "gdy funkcja startuje, przygotowuje sobie kopie robocze swoich parametrów formalnych" znaczy, czy to może błąd?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2013, o 20:20 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

117

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2013, o 20:20 
Offline
Moderator
Avatar użytkownika

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

rysiekm55 napisał(a):
"gdy funkcja startuje, przygotowuje sobie kopie robocze swoich parametrów formalnych" znaczy, czy to może błąd?


To nie jest błąd - bo tak się rzeczywiście dzieje ... Po prostu określenia "aktualne" , "formalne" to czysto abstrakcyjne bym powiedział i dlatego ich nie za bardzo lubię. Chodzi o to że gdy funkcja startuje to właśnie na stosie pojawiają się kopie tych przekazanych argumentów - i dzięki temu funkcja operuje już na ich wartościach w pamięci RAM ale na stosie a nie na wartościach zmiennych które były przekazane do funkcji.

------------------------ [ Dodano po: 2 minutach ]

czyli masz np:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


a potem w kodzie wołasz funkcję:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


to właśnie na stosie tworzona jest kopia zmiennej a czyli defacto argumentu funkcji, dzięki czemu wewnątrz funkcji możemy się posługiwać argumentem jak zmienną - może mieć inną nazwę (co wynika właśnie z tych formalnych i aktualnych) ale operujemy na kopii a, nie zaś na jej bezpośredniej wartości.

_________________
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 paź 2013, o 20:30 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

Ja to rozumiem, co wcześnie zostało już powiedziane, że robione są kopie przekazanych argumentów. Mi chodziło tylko o same sformułowanie w książce, skoro w ramce mówi się dokładnie co to są argumenty formalne, a potem jest to zdanie, że funkcja przygotowuje sobie kopie robocze swoich parametrów formalnych.
Wydaje mi się, że nie jestem jedynym, szczególnie gdy jestem początkującym, który może to źle zrozumieć czytając ten fragment, który jednak wprowadza moim zdaniem w błąd, może się mylę, może tylko ja tak odebrałem.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2013, o 20:59 
Offline
Moderator
Avatar użytkownika

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

No widzisz ja nie mówię że to mogło cię wprowadzić w błąd czy nie. Nie oceniam czy ty masz rację czy nie. Ja po prostu nadal uważam, że to w jaki sposób to opisałem w ramce jest słuszne i nie zmieniłbym tego. Bo taka jest forma mojego przekazu .... Czy każdy musi się z nią zgadzać ? pewnie że nie .... czy do każdego to musi trafić ? .. pewnie że nie

Tak w ogóle to mocno się tu TEORETYZUJE - a prędzej można byłoby to "zobaczyć" gdyby przeanalizować kod w asemblerze po kompilacji. Wtedy nie ma że boli - czy tego chcesz czy nie chcesz ... w momencie wejścia do funkcji na stosie zostaną stworzone kopie przekazanych argumentów - i w ogóle nie jest istotne na tym etapie czy mówimy o argumentach formalnych czy aktualnych .... (bo formalne czy aktualne to abstrakcyjne pojęcie) i nawet nie widzę większego sensu wnikania w to dalej ... tzn formalny czy aktualny...

Jeśli programujesz w asemblerze to pewnie sam niejednokrotnie stosowałeś podobną technikę, że na stosie tworzyłeś kopię przekazywanej zmiennej ... i gdy się tak robi już w kodzie to człowieka czochra ;) jak się nazywa argument czy formalny czy aktualny. Ot po prostu tworzę kopię na stosie i przekazuję sterowanie do funkcji za pomocą rozkazu typu call ...

------------------------ [ Dodano po: 1 minucie ]

Wystarczy sobie poczytać różne książki na temat języka C i sprawdzić jak to jest opisywane ;) nie ma tak - że każda książka opisuje to w IDENTYCZNY sposób - każdy stara się dotrzeć do czytelnika własnymi słowami - własnym sposobem.

------------------------ [ Dodano po: 7 minutach ]

rysiekm55 napisał(a):
Dziś czytałem rozdział o przekazywaniu argumentów funkcji przez wartość i nie zrozumiałem, których argumentów robione są kopie


jeszcze dodam ;) coś

po tym cytacie można by mieć wrażenie że przekazując argumenty do funkcji one się jakoś dziwnie mnożą samoistnie. Bo co to znaczy wg ciebie "których argumentów" .... Zakładając że przekazujemy do funkcji fizycznie JEDEN argument. To z punktu widzenia syntaktyki języka w pewnej sytuacji możemy go nazywać formalnym a w innej sytuacji aktualnym. Gwyn podpowiedział ci o co chodzi ... A ty jakby traktujesz to tak - że przekazując JEDEN argument nagle robią się co najmniej dwa ... jakiś aktualny i jakiś formalny

ale może rzuć okiem jeszcze na to i powiedz mi co o tym myślisz, powiedz mi czy jest to prawidłowy zapis czy nie - zagadka dla ciebie:


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
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 paź 2013, o 23:39 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

mirekk36 napisał(a):
ale może rzuć okiem jeszcze na to i powiedz mi co o tym myślisz, powiedz mi czy jest to prawidłowy zapis czy nie - zagadka dla ciebie:


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Uważam to całkowicie prawidłowy zapis, u góry deklaracja funkcji tylko z typem argumentu (nie musi być nazwa), na dole definicja tejże funkcji z argumentem formalnym, zaś w funkcji main jest wywołanie tej funkcji, w której już wprowadzony argument aktualny. Ten przykład ma moim zdaniem prawidłowy zapis, tylko funkcja bezsensownie dokonuje nieskończonego ciągłego zapisu do portu A wartości znaku A zgodnie z tablicą ASCII.
Ja to wszystko rozumiem, nie twierdzę, że są to różne argumenty, formalny czy aktualny.
Wyżej chodziło mi tylko o to sformułowanie, o którym juz pisałem. Również Antystatyczny potwierdził, że jest ono w pełni jasne.
Ale zakończmy ten bezsensowny spór. Ważne, że całkowicie zrozumiałem jak działa to przekazywanie przez wartość.

A propos następnej części książki, to pięknie opisałeś jak ustawiać, zerować lub zmieniać stan konkretnego bitu lub kilku bitów w bajcie za pomocą operacji przesunięć bitowych i operacji bitowych. Wcześniej nie rozumiałem, dlaczego były stosowane takie niby dziwne operacje.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2013, o 07:04 
Offline
Moderator
Avatar użytkownika

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

rysiekm55 --> nie traktuję tego w żadnym wypadku jako spór albo chęć na siłę przekonania kogoś, że akurat ja mam jedyną rację. Po prostu dyskusja. A piszę o tym bo wręcz nie mogę zrozumieć co tu jest niejasnego albo co się nie zgadza, ale TYLKO W TYM SENSIE, że chciałbym wiedzieć co sprawia kłopot ? co powoduje niejasność - a nie - że uważam że to jest proste i każdy powinien to wiedzieć od urodzenia.

I pomimo to że na tej stronie 117 wydawać by się mogło, że jest nawet pewna niekonsekwencja, ponieważ najpierw piszę wytłuszczonym drukiem tak:

Obrazek

a za chwilę na tej samej stronie napisałem również tak:

Obrazek

No i teraz stawiam konia z rzędem jak to się mówi temu kto w jakiś sposób udowodni że jedno wyklucza drugie gdy się tłumaczy podstawy działania funkcji. Ja tylko podpowiem, że z tego punktu widzenia (ale to wg mnie) nie ma NAJMNIEJSZEGO znaczenia czy mówię tu o parametrach/argumentach "formalnych" czy "aktualnych" .... a dlaczego ?

.... a dlatego, że zszedłem o wiele niżej (do piekła) :lol: prawie do kodu źródłowego w asm. Tu argument funkcji to argument - i nie ważne czy aktualny czy formalny bo w kodzie to już jest JEDNO I TO SAMO.

------------------------------------------------------------------------------------

pojęcia "formalny" i "aktualny" mają znaczenie jedynie gdy chcemy komuś wyjaśnić, działanie funkcji ale na poziomie syntaktyki języka. Żeby ktoś zrozumiał - że czym innym jest NAZWA tak naprawdę argumentu, który występuje w DEFINICJI funkcji (bo jak widać w deklaracji funkcji nawet tej NAZWY nie musi być! gorzej - można by się było teraz zacząć spierać - to co? to tu nagle nie ma żadnego argumentu ? tylko sam typ? .... tak sam typ argumentu wystarczy.)

A czym INNYM jest już nie tylko NAZWA ale to co podajemy przy WYWOŁANIU funkcji - bo tu już nie musi być nazwy argumentu, który występuje w definicji. Tu podaje się :

1. nazwę zmiennej
2. stałą dosłowną
3. całe wyrażenie

Dlatego przy omawianiu tego istotnym może być zwrócenie uwagi na nazewnictwo "formalny", "aktualny" ponieważ bez dobrego wyjaśnienia tego zagadnienia później początkujący dziwi się i uznaje za błąd (ja nie mówię że TY) ... coś takiego.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I zadaje np pytanie typu:

A dlaczego na górze w deklaracji funkcji napisałeś że argument ma nazwę "z" natomiast wewnątrz main wywołujesz ją z argumentem o nazwie "a"

To jest częste pytanie na początku drogi ... i każdy chyba przyzna, że wyjaśnianie tego na TYM ETAPIE ma mało - albo prawie NIC wspólnego z tym co się dzieje z argumentami czy to przekazywanymi przez wartość czy przez referencję. Że przez stos itp .... Bo na tym NIŻSZYM poziomie - to co mówiłem na początku - nie jest już istotne czy "formalny czy aktualny" ... istotne jest że "argument funkcji".

Sorki, że jeszcze o tym piszę - ale jak ktoś mnie zapyta w przyszłości o te sprawy - to z chęcią skieruję go na tę właśnie dyskusję w tym wątku.

_________________
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 paź 2013, o 19:48 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

Dziękuję Mirek za tak olbrzymie zaangażowane i tak szczegółowe wyjaśnianie tego. Dla mnie dalej to sformuowanie pozostaje niejasne, dlatego, że na tej samej stronie w jednym miejscu piszesz, że kopiowaniu podlegają zmienne formalne, a za troszeczkę później, że jednak na stos idą kopie argumentów aktualnych. Wiem, że argument formalny to ten, który występuje w deklaracji i definicji funkcji, który jest zamieniany na aktualny, gdy ta funcja jest wywoływania, tzn rozumiem, że w miejsce tej formalnej zmiennej (w twoim przykładzie zmienna z) jest wstawiana zmienna aktualna (a).
W związku z tym mam dodatkowe pytanie, czy jeśli funkcja jest zdefiniowana z argumentami formalnymi, to te argumenty muszą mieć zarezerwowane miejsce w pamięci RAM, a potem co się dzieje z tymi argumentami w momencie wywołania funkcji, czy one są w ogóle użyte? Skoro wstawiane są argumenty aktualne, które są innymi zmiennymi, i ich właśnie jest robiona kopia, która trafia na stos w czasie wywołania funkcji.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2013, o 20:21 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

Antystyczny, nie chodziło mi o to, co napisałeś, to co napisałeś ja w pełni rozumiem, ze tak się dzieje. Chodziło, co dzieje się ze zmiennymi formalnymi, one są w ogóle realne, czy tylko symboliczne, dla definicji fukcji, te zmienne a i b w twoim przykładzie?
To są zmienne automatyczne, rozumiem, więc trwają tak długo jak jest wywołana funkcja.
Ja mówię o zmiennych a i b, a nie o tych przekazywanych do funkcji.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2013, o 20:29 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Myślę, że można je traktować jak zmienne lokalne funkcji.
Zauważ, że do funkcji przekazane zostały wartości, które z powodzeniem zmieściłyby się w bajcie, a mimo to na przekazanie argumentów do funkcji zużyte zostały po 2 bajty.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2013, o 20:32 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

Ale przecież zmienne formalne a i b, to nie są te same zmienne, które są przekazywane do funkcji, nieprawdaż? Zmienne a i b, które zostały zdefiniowane, to też zajmują miejsce w RAM, to wciąż dalej moje pytanie, co sie z nimi dzieje?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2013, o 20:36 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Do tej funkcji nie przekazuje się zmiennych tylko wartości i te skopiowane wartości są przechowywane w zmiennych a i b.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2013, o 22:11 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

To po co w ogóle mówić o kopiowaniu argumentów aktualnych, a nie po prosto powiedzieć, że wartości argumentów aktualnych są zapisywane do zmiennych formalnych ( w tym przykładzie a i b) i to one są umieszczone są na stosie, i trwają jako zmienne automatyczne na czas wywołania funkcji, i wtedy ten niejasny zapis w książce Mirka staje się całkowicie jasny.

Korekta, musi być skopiowany argument aktualny, żeby on pozostał i nie zniknął w swojej oryginalnej postaci. Także myśle, ze wszystko mi sie teraz wyjaśniło, i nie ma niejasności w książce Mirka.

To już był mój ostatni wpis na ten temat.....szkoda czasu na wałkowanie tego tematu!.

Już kończę czytanie części teoretycznej w książce Mirka, zostały mi tablice i najtrudniejsze sprawa wskaźników i skończę to do piątku. Od weekendu zaczynam przerabianie części praktycznej, także poza czytałem zacznę w końcu ćwiczyć.....

_________________
sig off ;(



Ostatnio edytowano 29 paź 2013, o 23:04 przez rysiekm55, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2013, o 07:03 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

Dzięki Antystatyczny za miłe słowa oraz dobre przejęcie. Oczywiście, jak coś nie będę rozumieć w sprawie wskaźników, napiszę tutaj.
Ale teraz mogę powiedzieć, że wczoraj czytałem rozdział dotyczący makrodefinicji typu define i nie mogłem zrozumieć tego przykładu na końcu.
Muszę jeszcze raz to przeanalizować.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2013, o 10:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1967
Lokalizacja: Lipsko
Pomógł: 125

Jestem już w połowie nie'biań'skiej książeczki i jako zatwardziały bascomowiec spokojnie mogę powiedzieć, że sposób w jaki Mirek objaśnia kolejne założenia jest naprawdę rewelacyjny! Próbowałem kilka razy podchodzić do C i myślę, że wreszcie się ...zahaczyłem :) Oczywiście jest jeszcze kilka kwestii, których za cholerę nie mogę logicznie powiązać, ale myślę, że z czasem to zrozumiem. Chodzi, np. zmienną typu char. No przyjęło się, że to do tekstu, ale przecież ona może przyjmować wartość od -128 do 127, a kody ASCII mieszczą się w zakresie 0-255 i gdzie tu sens...? Albo, dlaczego w przykładowych programach, które oglądam w pętli głównej int main(void) definiowane są np. zmienne uint8_t, a mnie nie chciało działać póki nie zdefiniowałem static uint8_t (kompilator dawał ostrzeżenie 'zmienna' may be used uninitialized in this function). No dziwne to dla mnie i rzecz, która jakby nie patrzył trochę zniechęca.
EDIT:
(Kombinowałem, ale przekombinowałem i nie zauważyłem mojego innego błędu dlatego żeby nie mieszać wywalam to co tu było :) )

_________________
http://www.sylwekkuna.com



Ostatnio edytowano 30 paź 2013, o 11:19 przez SylwekK, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2013, o 11:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1967
Lokalizacja: Lipsko
Pomógł: 125

@Antystatyczny, dzięki za odpowiedź. Teraz wszystko już jasne :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2013, o 11:40 
Offline
Moderator
Avatar użytkownika

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

SylwekK napisał(a):
Chodzi, np. zmienną typu char. No przyjęło się, że to do tekstu, ale przecież ona może przyjmować wartość od -128 do 127, a kody ASCII mieszczą się w zakresie 0-255 i gdzie tu sens...?


Sens jest spory akurat w AVR GCC, doprecyzowywałem to już wielokrotnie na tym forum ale powtórzę jeszcze raz ;) Tylko później jak gdzieś zobaczysz, że ktoś o to pyta to też postaraj się od razu podpowiedzieć ok ? ;)

pewnie że char może , BA! a nawet przechowuje liczby i nie tylko od -128 do 127 lecz także od 0-255 (unsigned char)....

ale teraz zastanów się - czym jest np litera 'A' ?

jest znakiem ASCII, co więcej znakiem, który ma swój kod = 65 (dziesiętnie) ;)

więc cóż dziwnego w tym, że char przechowuje liczby pomimo to , że mówimy aby używać go akurat do tych zmiennych, w których najczęściej przechowujemy właśnie znaki ASCII / teksty ? Zanim powiem dalej dwa przykłady:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


czy któryś z nich nie zadziała pomimo to, że wspominam aby typu char używać do tekstów ? Ależ zadziała, każdy z tych przykładów tak samo ... no to w czym rzecz ??? ;)

na tą "rzecz" składają się dwa czynniki ;)

1. POPRAWNY styl programowania (szczególnie akurat w AVR GCC) - dlatego, że teraz zobacz dwa przykłady:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


patrzymy się na taki kod czy fragment kodu nawet w cudzym programie, który mamy przeanalizować, gdzie zwykle jest o wiele wiele więcej przecież tego typu definicji czy deklaracji ... i co ? hmmm no ok widzimy jakieś zmienne tablicowe ... w oderwaniu od całej reszty programu hmm tfuu projektu i to jeszcze złożonego projektu składającego się np ze 120 plików i 43 folderów .... nic więcej nie możemy o nich powiedzieć, pomyśleć, skojarzyć do czego mogą być używane ....

a teraz zobacz:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


O! ... gdy ja widzę, albo ludzie, którzy stosują się do tej zasady - to od razu w głowie otwiera się 6-klapka, która mówi nam tzn podpowiada nam , że: TU WIDZIMY JEDNĄ ZMIENNĄ TABLICOWĄ O NAZWIE TAB, DO PRZECHOWYWANIA JAKICHŚ LICZB, NIE WAŻNE NA RAZIE JAKICH, ..... ALE .... ALE ZMIENNA BUF ;) HMM TU PEWNIE BĘDZIE JAKIŚ BUFOR ZNAKOWY, TU PEWNIE AUTOR BĘDZIE TRZYMAŁ JAKIEŚ TEKSTY LUB JE OBRABIAŁ !!!

jest różnica ? .... myślę że widzisz że JEST , i rozumiem że na początku drogi w C może jeszcze jej dokładnie nie widać, że jest jeszcze niewyraźna - ale pewnie już coś czujesz i gęsia skórka pojawia się na łydkach (ja tak miałem gdy to kiedyś zrozumiałem) ... :lol: .... że hmmm no to teraz duże nawet swoje projekty będzie się o wiele lepiej analizować szczególnie po roku, po dwóch albo i po 10 latach!!! I NAWET jeśli na razie to do ciebie w pełni nie dociera to postaraj się w ten sposób umownie traktować char tylko na potrzeby tekstów. Przysięgam, że ani się obejrzysz - a TAK SIĘ KURNA przyzwyczaisz - że później jak zobaczysz cudzy kod:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


to cię będzie skręcało ;) że po co tak ? (oczywiście wciąż mówię szczególnie o AVR GCC w którym powołano takie fajne typy dla liczb ja:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


to też robiono wszystko po to aby wygodnie się później programowało. Po to aby zachować BARDO DOBRY STYL programowania ... Ale spokojnie na PC'ty również typu char używa się NAJCZĘŚCIEJ do tekstów. Tyle że nie zawsze ... dlaczego ??? ano dlatego że zwykle PC'ty to maszynki o dużo większych prockach, gdzie zwykle nikt się nie bawi z jakimś typem uint8_t bo nie musi oszczędzać RAM, bo wygodniej jest użyć podstawowego typu int, który na dodatek na PC składa się nawet nie z dwóch bajtów jak w prockach a aż z 4 bajtów!!! Jednak czasem zdarza się, że z jakichś powodów ktoś chce użyć niewielkiego 8-bitowego typu - a że w ANSI C (czystym C) nie ma czegoś takiego jak uint8_t czy int8_t - to wtedy czasem używa się typu char również dla zwykłych zmiennych liczbowych ... ale to "CZASEM" robi różnicę.

2. Drugi CZYNNIK .... tak jak mówisz char przechowuje zakres od -128 do 127 ... dlatego te osoby, które nie rozumieją tego o czy mowa była wyżej pkt.1 to zwykle widzimy jak naparzają w kodzie dodatkowo tak:

unsigned char i;
for( i=0, i<240; ...

zgadza się ? no bo przecież chce zakresu liczb bez znaku ... albo i dla tekstów pisze:

unsigned char tab[] = "test";

OOOO! no i jeśli nie chce posłuchać tych porad o których piszę - to dosyć szybko popada w AVR GCC w kłopoty ;) szczególnie gdy zechce korzystać z niektórych wbudowanych funkcji do obróbki takich stringów, które o DZIWO !!!! chcą argumentów z typem char a nie "unsigned char" ... i powodują, że pojawiają się KOCIE WARNINGI! i są kłopoty i wyrywanie włosów z głowy że O CO CHODZI kocia twarz? :( ....

a sprawa jest banalnie prosta, w AVR GCC w opcjach kompilacji (można to zmienić oczywiście ale nie polecam) typ char i tak jest zamieniany na unsigned char. Więc robi to za ciebie kompilator i warto sobie z tego zdawać sprawę. Bo większość funkcji AVR GCC właśnie korzysta z takiego przemutowanego że tak się brzydko wyrażę typu char (nazwy typu) ... i co gorsze zaczyna traktować twoje z ręki wpisane unsigned char jako inny typ niż char i zgłasza błędy szczególnie gdy działasz ze wskaźnikami - więc kompilator żąda dodatkowego rzutowania ..... !!! No są niektórzy który z uporem maniaka potem jeszcze piszą tak ;)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

masakra ;) bo jakbyś zastosował tą wiedzę, którą pokazałem wyżej to już przynajmniej pisałbyś

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i wtedy w funkcji nie musiałbyś robić durnego rzutowania jak masło maślane

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


bo funkcja ma taką deklarację:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



--------------------------

uuuf koniec - chyba muszę to spisać na blogu i tam odsyłać w przypadku takich pytań zamiast zawsze od nowa to pisać ;) ...

Sylwek - nawet jeśli ostatnie argumenty z pkt.2 nie trafiają jeszcze w pełni to uwierz że czym dalej w stronę C, to tym szybciej trafią - a jak się na początku przyzwyczaisz do kociego

unsigned char - na każdą okazję w AVR GCC - to wiesz jak to potem jest - jak w powiedzeniu:

"przyzwyczajenie gorsze niż ....." :lol:

i będziesz jeszcze długo się borykał i walczył żeby przejść na dobrą stronę mocy ;)

------------------------ [ Dodano po: 2 minutach ]

Dzięki ANTY - za wyręczenie mnie z wyjaśnieniem drugiego zagadnienia ;)

tu dodam tylko żeby Sylwek doczytał sobie jeszcze raz o RÓŻNICACH pomiędzy zmiennymi lokalnymi (automatycznymi) a globalnymi bo w książce o tym jest - ale pewnie umknęło w natłoku informacji - bo to pomaga zrozumieć ów problem ale przy okazji jeszcze wiele wiele innych ;)

_________________
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: 30 paź 2013, o 14:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1967
Lokalizacja: Lipsko
Pomógł: 125

No Mirku, bardziej precyzyjne wyjaśnienie niż Twoje chyba już jest niemożliwe :D Oczywiście nigdy nie zamierzałem używać char do czegoś innego niż tekst (zgodnie z zaleceniami w książce) tym bardziej, że jeszcze w końcu lat 80-ych ubiegłego wieku kiedy to zaczynałem BASIC na Commodore+4 miałem tam instrukcję Char do drukowania tekstów w trybie graficznym :) Nie mniej ten cytat:

mirekk36 napisał(a):
a sprawa jest banalnie prosta, w AVR GCC w opcjach kompilacji (można to zmienić oczywiście ale nie polecam) typ char i tak jest zamieniany na unsigned char


rozwiał wszelkie moje wątpliwości odnośnie zakresu liczb dla typu char.
Czuję, że z taką pomocą przechodzenie z Bee na Cee naprawdę nie będzie jakimś wielkim problemem ;)
Jeszcze raz wielkie dzięki!

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2013, o 16:05 
Offline
Moderator
Avatar użytkownika

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

Dlatego staram się udowadniać Bluebookiem, że nauka C może być łatwiejsza niż Bascom ;) ....

_________________
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: 30 paź 2013, o 19:47 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

Dziś przeczytałem część książki o tablicach i zacząłem o wskaźnikach. Jestem pod wielkim wrażeniem, oczywiście bardzo pozytywnym, jak dokładnie i precyzyjne zostały te zagadnienia opisane. Naprawdę super książka!.
Wczoraj czytałem materiał o dyrektywach preprocesora. Wszystko było też ładnie opisane, jedynie nie zrozumiałem tego przykładu z rozdziału o operatorze zamiany na string #. Chodziło o makra przekazujące nazwę aktualnego procesora używanego zamieszczonej w zmiennej MCU.
Najpierw piszesz, że:
#define TOSTRING MCU nie może przekazać zawartość MCU, tylko samą jej nazwę, i to rozumiem.
Ale nie wiem jak działają te dwa makra:
#define TOSTRING(a) STRINGX(a)
#define STRINGX(a) #a
Czy one muszą działać razem z tym makrem na początku, czy wystarczą te dwa makra, żeby przekazać zawartość zmiennej MCU w postaci stringu?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2013, o 20:57 
Offline
Moderator
Avatar użytkownika

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

Zapytam jak zwykle - a szukałeś informacji uzupełniających do książki na blogu ? ;)

http://mirekk36.blogspot.com/2011/12/je ... ep-do.html

_________________
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: 30 paź 2013, o 21:45 
Offline
Użytkownik

Dołączył(a): 13 wrz 2013
Posty: 173
Lokalizacja: Birmingham, UK
Pomógł: 0

Dziękuję za to. Z pewnością tam znajdę pełne wyjaśnienie. Prawdę wcześniej nie szukałem, bo nie pomyślałem, że mogą takie tematy, albo na blogu albo na tym forum. Ależ ten temat nie jest nowy, więc rzeczywiście mógł być wcześniej omawiany.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sty 2014, o 11:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 sty 2014
Posty: 336
Lokalizacja: Grodzisk Mazowiecki
Pomógł: 13

Witam
Wczoraj stałem nad przepaścią a dzisiaj wykonałem krok do przodu i postanowiłem kupić to Dzieło. :-D
Tak na serio to mam pytanie. Na jakim uc oparte są przykłady w książce?
Chciałbym swoją płytę bascomową przeorganizować lub zrobić od początku jeśli zmiany będą drastyczne.
Domyślam się że mój programator widziany w AvrStudio jako STK500 będzie odpowiedni?

_________________
"Nie programuj w święta - bug się rodzi"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sty 2014, o 11:57 
Offline
Moderator
Avatar użytkownika

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

tomson5 napisał(a):
Witam
Wczoraj stałem nad przepaścią a dzisiaj wykonałem krok do przodu i postanowiłem kupić to Dzieło. :-D
Tak na serio to mam pytanie. Na jakim uc oparte są przykłady w książce?
Chciałbym swoją płytę bascomową przeorganizować lub zrobić od początku jeśli zmiany będą drastyczne.
Domyślam się że mój programator widziany w AvrStudio jako STK500 będzie odpowiedni?


A w tytule książki kolega nie widzi jakie procesory ? ;)

a spis treści i fragmenty książki ? - nie zaglądał kolega ? ;)

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

polecam - bo już tytuł mówi o procka AVR (Atmega i Attiny)

programator dowolny, środowisko ? zdecydowanie polecam Eclipse

http://mirekk36.blogspot.com/2013/12/ec ... nanie.html

_________________
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: 10 sty 2014, o 11:58 

Pomógł: 0

Nie ma jakiegoś "konkretnego" procesora, ale jeżeli pytasz pod jakie np. skonfigurowane są timery to pod Atmega32. Tylko co za problem przepisać dwie/trzy linijki by działało to na innym procku.

Biblioteki nie są pisane pod jeden procesor, jeżeli o to pytasz.
Bez większych problemów można uruchomić to od attiny po mega2560

PS. I Mirek mnie ubiegł.
Dodam tylko od siebie, że sam bez większych problemów przenosiłem wszystko na atmega8, czy "większe" tinki.
No jedynie z czym może być problem na tinkach to uart bo one sprzętowego nie posiadają.
Ale np. wrzucasz do tinki bibliotekę I2C to LCD, i masz na 8 nóżkowym procesorze attiny45 obsługę LCD 4x16 :D



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sty 2014, o 12:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 sty 2014
Posty: 336
Lokalizacja: Grodzisk Mazowiecki
Pomógł: 13

Zaglądałem i podczytywałem co nieco. Gdzieś mi się Atmega8 i tinka rzuciła w oczy a patrzę na płytę testową i widzę "bydlaczka" atmega32 Bydlaczek to rodzaj nie lubianej przeze mnie obudowy.
Wiem że można kod przerzucać z uc do uc ale może zdażyć się że omawiany przykład po prostu się nie zmieści
Wolę działać na tej samej platformie co Autor szczególnie że te układy różnią się wspomnianą obudową
Z bascomowej nauki wiem że tak jest lepiej i maleje szansa na błędy

_________________
"Nie programuj w święta - bug się rodzi"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sty 2014, o 12:32 

Pomógł: 0

Jest przejścióweczka i do Atmega8 i do tinek dla ATB, więc co za problem?



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sty 2014, o 13:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 sty 2014
Posty: 336
Lokalizacja: Grodzisk Mazowiecki
Pomógł: 13

Nie stać mnie na płytę ATB i zdecydowanie będzie to płyta made in tomson
Rozumiem że mam szykować z szeroką podstawką pod Atmega32 i dorobić sobie adapter pod atmega8?

_________________
"Nie programuj w święta - bug się rodzi"



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: 126 ]  Przejdź na stronę Poprzednia strona  1, 2, 3, 4, 5  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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