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



Teraz jest 14 lut 2025, o 12:51


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: 27359
Lokalizacja: Szczecin
Pomógł: 1042

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: 27359
Lokalizacja: Szczecin
Pomógł: 1042

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: 27359
Lokalizacja: Szczecin
Pomógł: 1042

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: 27359
Lokalizacja: Szczecin
Pomógł: 1042

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: 27359
Lokalizacja: Szczecin
Pomógł: 1042

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: 27359
Lokalizacja: Szczecin
Pomógł: 1042

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 3 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