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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 maja 2025, o 21:30


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
    Autor Wiadomość
    PostNapisane: 25 mar 2018, o 20:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 maja 2017
    Posty: 143
    Pomógł: 0

    Witam czytając BB i analizując rozdział funkcje podrozdział" przekazywanie argumentu przez wartość"
    wyciągłem wnioski pytanie do was czy dobre więc mnie naprostujcie jeśli coś źle będę pisał

    bo zauważyłem że jeśli zdefiniuje zmienną i zainicjuje ją wartością np . 5

    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 kodzie gdybym chciał zrobić tak :

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


    wartość komórki ,w której jest uint8_t guzik =5; nie ulegnie zmianie tylko zawartość zmiennej guzik zostanie pobrana i zapisana do komórek roboczych jako typ ( int) ,(int) guzik + 4;
    do obliczeń i do tej pobranej kopii, którą kompilator sobie pobrał do obliczeń zostanie dodane 4 , wynik trafi do komórki zmiennej skrzynia.

    podobna sytuacja jest z funkcjami i przekazywaniem argumentu przez wartość zauważyłem podobieństwo do sytuacji powyżej z funkcjami, też tak jest że argument , wartość jest pobierana do obliczeń z komórki i przekazywana do komórki w której znajdują się parametry formalne

    uint8_t owoc ; //definicja komórki owoc

    funkcja (owoc) //wywołanie i przekazanie zawartości komórki( parametr aktualny)

    funkcja (koszyk) // praca w definicji funkcja na kopii zawartości owoc ,która nazywa się koszyk i pracuje się z nią wewnątrz funkcji
    {
    }


    w efekcie mamy i owoc i koszyk jako uint8_t w których jest to samo i jedna komórka nie oddziałuje na drugą, czy mam rację czy popełniam błędy w rozumieniu tego.

    zapytam jeszcze o to:

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


    wywołanie funkcji i przekazanie argumentu aktualnego , stała dosłowna wartość 5 którą kompilator potraktuje jako int i zrzutuje do typu jaki zwraca funkcja, czy dobrze rozumiem?

    Pozdrawiam spider



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 mar 2018, o 20:53 
    Offline
    Moderator
    Avatar użytkownika

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

    Cytuj:
    w efekcie mamy i owoc i koszyk jako uint8_t w których jest to samo i jedna komórka nie oddziałuje na drugą, czy mam rację czy popełniam błędy w rozumieniu tego.

    to nie są jakieś komórki które porównujesz do zmiennych, argument funkcji przekazywany przez wartość - jest jak słusznie zauważyłeś przekazywany przez jego kopię tworzoną w trakcie wywołania funkcji na stosie ... Poczytaj rozdział o funkcjach gdzie to bardzo precyzyjnie wyjaśniam

    procek87 napisał(a):
    wywołanie funkcji i przekazanie argumentu aktualnego , stała dosłowna wartość 5 którą kompilator potraktuje jako int i zrzutuje do typu jaki zwraca funkcja, czy dobrze rozumiem?

    No tutaj to pokręciłeś na maksa - stała dosłowna 5 zostaje przekazana jako argument do funkcji i nie ma nic wspólnego z rezultatem bo to dopiero od kodu który jest w ciele funkcji zależy jaki będzie rezultat czyli wynik tej funkcji

    _________________
    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: 26 mar 2018, o 06:54 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 maja 2017
    Posty: 143
    Pomógł: 0

    mirekk36 napisał(a):
    stała dosłowna 5 zostaje przekazana jako

    pomiędzy nawiasami w wywołaniu 5 jest traktowana jako int dopiero po przekazaniu do funkcji kompilator rzutuje ją do uint8_t.

    Kompilator wie to stąd że w deklaracji funkcji podaje się typ uint8_t stąd póżniej następuje żutowanie stałej
    dosłownie którą kompilator traktuje jako int domyślnie jak każdą dosłowną .

    oberwie mi się ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 mar 2018, o 07:30 
    Offline
    Moderator
    Avatar użytkownika

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

    procek87 napisał(a):
    pomiędzy nawiasami w wywołaniu 5 jest traktowana jako int

    bardzo dobrze - bo stałe dosłowne są domyślnie traktowane jak int

    procek87 napisał(a):
    dopiero po przekazaniu do funkcji kompilator rzutuje ją do uint8_t.

    też dobrze

    procek87 napisał(a):
    Kompilator wie to stąd że w deklaracji funkcji podaje się typ uint8_t stąd póżniej następuje żutowanie stałej

    też dobrze

    procek87 napisał(a):
    oberwie mi się

    a za co? ja wyżej odniosłem się tylko do tego, że argument nie ma nic wspólnego z rezultatem funkcji

    _________________
    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: 26 mar 2018, o 12:24 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 maja 2017
    Posty: 143
    Pomógł: 0

    A co ze zmiennymi zdefiniowanymi i zainicjowanymi jakimiś wartościami , jeśli będę chciał ją wykorzystać w obliczeniach

    uint8_t owoc=5;
    a= owoc+5;


    To do obliczeń zostanie pobrana kopia zmiennej owoc bo zmiana nie może nastąpić bezpośrednio na niej dobrze rozumiem ? Czyli mamy dwa miejsca gdzie jest przechowywana zmienna owoc jedno w RAM jeśli to jest zmienna lokalna to na stosie, a drugie w no właśnie i chyba jest to stos, tylko jest to miejsce stworzone na krótką chwilę na czas wykonania operacji dlatego kod zajmie jeden bajt a nie dwa. Dobrze rozumiem?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 mar 2018, o 13:01 
    Offline
    Moderator
    Avatar użytkownika

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

    Cytuj:
    To do obliczeń zostanie pobrana kopia zmiennej owoc bo zmiana nie może nastąpić bezpośrednio na niej dobrze rozumiem ?

    jaka kopia - no toż tu aż ciężko mówić o jakich kopiach .... po co ci kopia do takiego działania

    a = owoc + 5;

    toż zostanie dokonane obliczenie gdzie dodana zostanie wartość zmiennej owoc do wartości stałej dosłownej a wynik trafi do zmiennej a.

    _________________
    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: 26 mar 2018, o 16:51 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 maja 2017
    Posty: 143
    Pomógł: 0

    tak ale jeśli

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


    to zmienna owoc będzie miała wartość 5 a nie 10 , przykład dowodzi temu że w tej operacji a= owoc+5; kompilator operuje już nie na uint8_t owoc; o zawartości 5 tylko na jej kopii , zgadza się tylko jak i gdzie jest przetrzymywana ta kopia jak to się dzieje że uint8_t owoc=5; się nie zmienia i jest w niej stale 5 ? ;)

    Przepraszam za to że męczę chce po prostu jak najwięcej zrozumieć im więcej czy to Mirek czy ktoś opowiada o tym , piszę to tym to lepiej to zaczynam sobie wyobrażać .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 mar 2018, o 17:10 
    Offline
    Moderator
    Avatar użytkownika

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

    procek87 napisał(a):
    to zmienna owoc będzie miała wartość 5 a nie 10

    ale ty sobie sam w głowie jakiś problem tworzysz - a ile chciałbyś żeby miała ? no zainicjowałeś ją wartością 5 i czego się spodziewasz ? ;)

    niczego to dalej nie dowodzi jak piszesz - w ogóle tu już mocno płyniesz z wyjaśnieniami o jakichś kopiach ....

    masz zmienną owoc = 5 i jej stan nigdzie w tym kodzie ci się nie zmienia, brana jest tylko jej wartość do obliczeń (a nie żadna tam jakaś wydumana kopia) i na tym KONIEC panie .... nie ma żadnych kopii owoca ;) już nie kombinuj bo brniesz w jakąś ciemną ślepą uliczkę

    przykład:

    1. masz koszyk z 5 jabłkami
    2. masz luzem 3 śliwki
    3. oblicz ile razem masz owoców ?

    WYNIK: = 8

    czy w wyniku tego działania coś ci się dzieje w koszyku z jabłkami ? No spojrzałeś na koszyk sprawdziłeś własnymi oczami że leży na dnie 5 jabłek (czyli wziąłeś wartość owoców w koszyku) i policzyłeś że masz 3 śliwki luzem - to wszystko

    _________________
    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: 26 mar 2018, o 17:27 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 maja 2017
    Posty: 143
    Pomógł: 0

    Ok zrozumiałem wracając do przekazywania wartości w funkcjach

    to tam dlaczego mówi się że twrzona jest kopia argumentu na stosie

    uint8_t a=5;

    funkcja(a);

    uint8_t funkcja(uint8_t zegarek)

    w momencie przekazania wartości zmiennej a , czyli wartości 5 do funkcji która ładuje sobie tą wartość do argumentu zegarek , tu masz na myśli tą kopie w książce ? uint8_t a=5; ---> uint8_t zegarek;



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 mar 2018, o 17:39 
    Offline
    Moderator
    Avatar użytkownika

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

    DOKŁADNIE TAK, no bo przekazany argument przez wartość nie może zostać zniszczony wewnątrz funkcji rozumiesz? Dlatego przy jej starcie na stosie tworzona jest KOPIA wartości tego argumentu i funkcja wewnątrz operuje na tej kopii - może ją zmieniać - zmielić co tylko chce ... bo to kopia ... A po zakończeniu funkcji i powrocie - twoja zmienna owoc przekazana do funkcji nadal będzie miała tę samą wartość.

    _________________
    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: 26 mar 2018, o 18:10 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 maja 2017
    Posty: 143
    Pomógł: 0

    czyli jeszcze raz dla pewności uint8_t a=5; --do--> argument funkcji , kopia (uint8_t zegarek);



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 mar 2018, o 18:15 
    Offline
    Moderator
    Avatar użytkownika

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

    sorry ja się wyłączam, można ileś razy powtarzać ale ty chcesz po raz 10001 ? dziękuję ;)

    _________________
    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: 26 mar 2018, o 18:30 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 maja 2017
    Posty: 143
    Pomógł: 0

    OK nie męcze wszystko jasne już rozumiem Dziękuje Mirku Przepraszam . ;)



    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: 13 ] 

    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:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO