Skocz do zawartości
Treker

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

Pomocna odpowiedź

Masz rację, nie ma nawiasów po x to chodzi o zmienną. Natomiast

int nazwa(int argument)

oznacza deklarację funkcji zwracającą int o argumencie typu int. Nawiasy oznaczają zawsze miejsce na argumenty które może przyjmować funkcja. Jeżeli funkcja nie przyjmuje żadnych argumentów to nawiasy są puste ale zawsze występują właśnie po to aby odróżnić funkcję od zmiennej. Podobnie ma się rzecz z innymi typami zmiennych. I to jest cała filozofia. Naprawdę nie wiem jak to inaczej wytłumaczyć.

Udostępnij ten post


Link to post
Share on other sites
oznacza deklarację funkcji zwracającą int o argumencie typu int. Nawiasy oznaczają zawsze miejsce na argumenty które może przyjmować funkcja.

No i właśnie tego nie rozumiem. Ja po szkole jestem już jakieś 13 lat i nie pamiętam co to jest argument funkcji? Co znaczy że może przyjmować? W jaki sposób przyjmie te argumenty? To są zapewne podstawy podstaw i dlatego nie mogę pojąć całości.

Udostępnij ten post


Link to post
Share on other sites

Matrix, a możesz mi powiedzieć ile programów napisałeś? włącznie z "hello world"?

Jeśli przez książke Ci nie idzie to ucz się przez praktyke.

Pisząc int deklarujesz ze powałasz do życia coś związanego z integerem. To czym te coś będzie czy to będzie funkcja zmienna tablica wskaźnik to już zależy od dalszego zapisu.

int Ilosc_Kielbasy;

Powołójesz do życia zmienną.

int Wroz_Ocene(int Czas_Spedzony_na_nauce, int Wspolczynnik_Trudnosci_Facetki, int Moj_zapal){
return 2; //Bania i tak niezdasz
}

Powolojesz do zycia funkcje która jako parametry będzie miała 3 zmienne integer

int Oceny_Matma[] ={1,4,1,2,5,1,3,1};

Powołójesz do życia tablice o nie predefiniowanym rozmiarze ale odrazu ją uzupelniasz elementami i taki będzie miała rozmiar.

int *Slodziak_Wskaznik;

Powołasz do życia wskaźnik ale tym narazie sobie głowy nie zawracaj.

Widzisz różnice?

Bardzo przydatne jest to, że funkcja coś zwraca dzięki temu możemy w jasny sposób używać funkcji trygonometrycznych dajmy na to sin(30). Albo zamknać pewien blok obliczeń w małym poleceniu.

int max(int Tablica[], int Dlugosc)

Tutaj mozemy napisać ciało funkcji która wybierze nam maksymalny element tablicy i wstawi dokładnie w miejsce w którym została wywołana. Jeśli byśmy mieli funkcyjke min() która działa analogicznnie to zobacz jak prosto mozna pozyskać amplitude

amplituda = max(Tab,Dlugosc_Tab)-min(Tab,Dlugosc_Tab);

Za wszelkie błędy przepraszam, jestem bardzo zmęczony

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Słowo "int" nie jest deklaracją zmiennej, ono określa typ. Może to być typ deklarowanej zmiennej, wartości zwracanej przez funkcję, wskaźnika itd.

myślę że nie matematyczna strona jest problemem a to że nigdzie nie jest to wyjaśnione naprawdę od podstaw.

Nie pamiętam jak w Symfonii, ale w Arkana C++ w pierwszym rozdziale pierwszy program jest opisany bardzo dokładnie, każde słowo i każdy znak jest wyjaśniony co robi. Albo czytasz po łebkach lub bez zrozumienia, albo jesteś zbyt zamknięty. Kup/pożycz/ściągnij tą książkę a nie pożałujesz o ile naprawdę chcesz się nauczyć tego języka. 1000 stron dobrze wyjaśnionej wiedzy z zakresu chyba całego podstawowego C++ (w sensie: samego języka, bez wskazania na biblioteki i środowiska).

Bascom był dużo prostszy, żadnego zwracania, podstawienie jednego wyrażenia pod drugie to proste słowo ALIAS, deklaracja zmiennych to zwykłe DIM, port to port a pin to pin.

Co mnie tylko utwierdza w tym, że Bascom jest bardzo złym językiem - funkcje nie mogły zwracać wartości? Jak można w czymś takim cokolwiek pisać? Druga opcja jest taka, że Ty tak naprawdę w ogóle prawie nie znasz Bascoma i go nie rozumiesz. Mówię Ci - postaw sobie cel i go wykonaj. C można się uczyć długo i cały czas można się nauczyć czegoś nowego.

Zadania na początek:

napisz prosty kalkulator na PC mogący wykonywać działania +-/*, działanie byłoby wybierane w programie.

Podpowiedzi: switch, case, break, if, while, for

Udostępnij ten post


Link to post
Share on other sites

Kod:

int Wroz_Ocene(int Czas_Spedzony_na_nauce, int Wspolczynnik_Trudnosci_Facetki, int Moj_zapal){

return 2; //Bania i tak niezdasz

}

Powolojesz do zycia funkcje która jako parametry będzie miała 3 zmienne integer

A skąd wiesz że zwróci Ci 2?

Ogólnie trochę się nie rozumiemy. Ja wiem co to poszczególne zmienne i wiem jak je deklarować. Ja nie rozumiem jaki jest stosunek tego co stoi przed nawiasem do tego co w nawiasie czy też odwrotnie.

funkcje nie mogły zwracać wartości?

Może źle to ująłem, zwracają, ale nigdy nie było mi to potrzebne, najzwyczajniej nie musiałem zawracać sobie tym głowy.

Albo czytasz po łebkach lub bez zrozumienia

Na pewno nie czytam po łebkach bo do rozdziału 5 w symfonii doszedłem już ze 4 razy.

Zadania na początek:

napisz prosty kalkulator na PC mogący wykonywać działania +-/*, działanie byłoby wybierane w programie.

Podpowiedzi: switch, case, break, if, while, for

Chyba oszalałeś? Wiem do czego służą poszczególne dyrektywy ale za BOga nie wiedziałbym jak się za to zbrać w języku C. W bascom mogę napisać Ci to w ciągu 10minut.

Udostępnij ten post


Link to post
Share on other sites

no dobra to spróbujmy inaczej - masz zapis matematyczny x = sin(a). Funkcji sinus podajesz argumenty (a) i na podstawie tego otrzymujesz jakiś tam wynik. To jest zapis jaki na pewno używałeś w swoim życiu i zakładam, że go rozumiesz. Tak samo jest np z logarytmami, funkcjami wykładniczymi itd. No i właśnie taki matematyczny zapis funkcyjny był podstawą do stworzenia funkcji w języku C.

Teraz pomyśl sobie, że ktoś wcześniej napisał tą funkcję sin w C żebyś mógł ją użyć w swoim programie. Żeby kompilator to rozumiał musi mieć określony typ jaki funkcja zwraca. W tym wypadku będzie to float. Poza tym musi wiedzieć jakiego rodzaju spodziewać się argumentów i ile ich jest. Dlatego właśnie gdzieś w kodzie deklarujesz tą funkcję:

float[bo taki typ zwraca] sin[nazwa] (float[typ argumentu] a[nazwa argumentu])

Udostępnij ten post


Link to post
Share on other sites
masz zapis matematyczny x = sin(a). Funkcji sinus podajesz argumenty (a) i na podstawie tego otrzymujesz jakiś tam wynik. To jest zapis jaki na pewno używałeś w swoim życiu i zakładam, że go rozumiesz

To źle zakładasz bo ja już nic nie pamiętam z obliczeń sinusów, cosinusów itd. Skończyłem szkołę w 1998r i od tamtej pory nie było mi to już potrzebne, a wiadomo że jak coś niepotrzebne i się tego nie używa to się to zapomina.

Żeby kompilator to rozumiał musi mieć określony typ jaki funkcja zwraca. W tym wypadku będzie to float.

A skąd wiesz?

Przepraszam Ciebie i wszystkich próbujących mi to wszystko wyjaśnić, ale nie potrafię tego ogarnąć.

Udostępnij ten post


Link to post
Share on other sites

dobra ja się poddaje jeżeli jesteś aż tak odporny na wiedzę z C to może rzeczywiście daj sobie spokój...

Udostępnij ten post


Link to post
Share on other sites
Chyba oszalałeś? Wiem do czego służą poszczególne dyrektywy ale za BOga nie wiedziałbym jak się za to zbrać w języku C. W bascom mogę napisać Ci to w ciągu 10minut.

Jeśli to umiesz napisać w jakimś innym języku to nawet masz ąłtwiej niż osoby uczące się od zera, bo odpada Ci problem algorytmu i pozostaje sam język. Nic prostszego (poza "hell ou! world") nie napiszesz.

o źle zakładasz bo ja już nic nie pamiętam z obliczeń sinusów, cosinusów itd. Skończyłem szkołę w 1998r i od tamtej pory nie było mi to już potrzebne

głupie pytanie: w jakiej branży pracujesz? Nie potrzebujesz w pracy korzystać z jakiegoś oprogramowania obliczeniowego albo kalkulatora z nieco większą liczbą funkcji niz +-*/?

C ma tylko jedną wadę: nie jest językiem, który można czytać o ile zna się angielski. Poza tym ma niewiele wad, przez co jest tak masowo przerabiano i klonowany (np. java to w połowie C). Pamiętaj też, że ot tak nie nauczysz się go. Z Twoim poziomem wiedzy nauka dowolnego języka programowania to minimum parę miesięcy, zadaj sobie pytanie czy to potrzebujesz.

Udostępnij ten post


Link to post
Share on other sites

No dobra to kolej na mnie. C znam jako tako, ale programuję w kilku innych językach więc może podołam.

Przytoczę Twój przykład:

Deklarujesz funkcję:

int x(int a, int b)

Po czym poznajemy, że funkcja? Tak, bo ma nawiasy.

Zmienimy sobie, dla ułatwienia nazwę funkcji na:

int dodawanie(int a, int b);

Co ten zapis nam mówi? Deklarujemy funkcję (może łatwiej nazwać to będzie podprogramem - większa analogia do Bascoma) o nazwie dodawanie, która jeśli coś zwróci to zwróci wartość typu int - czyli liczbę. Dalej wiemy, że funkcja będzie operowała "w środku" na zmiennych a i b (które do niej przekażemy), one też są liczbami typu int.

I to jest tylko deklaracja.

dalej w kodzie napiszesz sobie definicję funkcji czyli np.:

int dodawanie(int a, int b) {
int wynik; //deklaracja zmiennej wewnątrz funkcji
wynik = a + b; //dodajemy wprowadzone z zewnątrz do funkcji zmienne
return wynik; // i je zwracamy
}

I teraz w każdym (uogólniając) miejscu programu gdy napiszesz coś w stylu dodawanie(5,8) jako wynik funkcja zwróci Ci liczbę 13.

Będziesz mógł tego użyć na przykład tak:

int test; //nowa zmienna testowa

test = dodawanie(1,4);

Od teraz zmienna test ma wartość 5.

Czego nie rozumiesz tutaj? To na prawdę nie jest trudne.

Niech ktoś kto pisze w C, mnie sprawdzi, ale wydaje mi się że nie zrobiłem tutaj błędów.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
w jakiej branży pracujesz? Nie potrzebujesz w pracy korzystać z jakiegoś oprogramowania obliczeniowego albo kalkulatora z nieco większą liczbą funkcji niz +-*/?

Wcześniej pracowałem 8 gdzoin stojąc przy taśmie. Pilnowałem czy nadruk na kubek typu Danone czy Bakoma czy cokolwiek innego dobrze się drukuje, skutek? Zaawansowane obliczenia nie potrzebne.

Teraz pracuję w telekomunikacji a raczej u partnera technicznego TP. Zakładam neostradę usuwam uszkodzenia i takie tam, skutek? Zaawansowane obliczenia nie są potrzebne.

Z Twoim poziomem wiedzy nauka dowolnego języka programowania to minimum parę miesięcy,

Myślałem że rozumiejąc ("coś tam") z jakiegokolwiek języka (bascom) nie będzie trudno nauczyć się języka C. Najwyraźniej się myliłem.

zadaj sobie pytanie czy to potrzebujesz.

Potrzebne na pewno nie, ale lubię uczyć się nowych rzeczy.

Widzisz kolego Treker, od razu wiem o co chodzi. Chyba powinieneś zostać jakimś nauczycielem. Trzeba było od razu napisać że funkcja zwróci wartość z obliczeń jakie wykonamy. Dla mnie cały czas nienormalne było to, skąd funkcja zwróci tą wartość skoro nie ma żadnych obliczeń?

I teraz w każdym (uogólniając) miejscu programu gdy napiszesz coś w stylu dodawanie(5,8) jako wynik funkcja zwróci Ci liczbę 13.

Tylko czemu mam napisać dodawanie(x, y) a nie wynik(x, y)? Chodzi o wywołanie nazwy danej funkcji? Czyli taki skok do podprogramu?

Udostępnij ten post


Link to post
Share on other sites
Tylko czemu mam napisać dodawanie(x, y) a nie wynik(x, y)? Chodzi o wywołanie nazwy danej funkcji? Czyli taki skok do podprogramu?

Tak dokładnie. Zmienna wynik jest lokalna i obecna tylko wewnątrz funkcji. Po drugie jest to zmienna, więc nie możesz odwoływać się do niej z parametrami. Na razie nic się nie stanie jeśli dla Ciebie równoznaczne będą słowa podprogram=funkcja=procedura=subprogram. Później zobaczysz jakie są różnice, ale na razie zrozum o co tam chodzi 😉

P.S z tego co pamiętam (potwierdźcie to) zawartość zmiennej wynik, po wykonaniu return zostanie zniszczona.

Udostępnij ten post


Link to post
Share on other sites
P.S z tego co pamiętam (potwierdźcie to) zawartość zmiennej wynik, po wykonaniu return zostanie zniszczona.

Jeśli dobrze pamiętam to co przeczytałem to tak.

Udostępnij ten post


Link to post
Share on other sites

zmienna wynik została zadeklarowana między klamrami {} ograniczającymi kod funkcji. Tak więc ta zmienna może "żyć" tylko w tym segmencie a po wykonaniu wszystkich zawartych tam instrukcji jest niszczona. Czyli po prostu jest zmienną lokalną. Za każdym razem kiedy wywołujemy tą funkcję, zmienna lokalna tworzona jest od nowa i po użyciu niszczona.

Samo słowo return oczywiście zmiennej nie niszczy tylko wychodzi z podprogramu pośrednio przyczyniając się do jej skasowania.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Ale oczywiście jest możliwa taka deklaracja zmiennych, aby nie zostały one zniszczone - to tak na przyszłość.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...