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



Teraz jest 26 kwi 2024, o 19:09


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 6 maja 2020, o 16:19 
Offline
Nowy

Dołączył(a): 23 lip 2019
Posty: 19
Pomógł: 0

Dobry.
Mam program z kursu i nie rozumiem jak są przechowywane w pamięci oraz odczytywane. Wpisuje liczby i ostatniej pętli są odczytywane. Dane są wpisywane w tabeli ? Czy funkcja malloc tworzy tablice?

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2020, o 16:24 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

nie. malloc dynamicznie alokuje(przydziela) pamięć.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2020, o 18:44 
Offline
Nowy

Dołączył(a): 23 lip 2019
Posty: 19
Pomógł: 0

Dzięki. A jest ktoś w stanie wyjaśnić gdzie w programie są zapisywane dane? zawsze mi się wydawało że do każdej zmiennej może być zapisana jedna zmienna. Niby wskaźnik odwołuje do pierwszej komórki tablicy ale nigdzie nie jest zdefiniowana tablica i nigdzie odwołanie do danego miejsca tablicy. Dla mnie ciemna magia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2020, o 09:19 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Ale o jakiej tablicy piszesz?
W przykładzie który podałeś masz zmienną strukturalną czyli taki a'la rekord, który zawiera w sobie dwie wartości pierwsza to liczba o typie int a druga to wskaźnik pokazujący na następny element.
Kolejne elementy będą się znajdowały w pamięci RAM tam gdzie funkcja malloc je umieści ;-)


Autor postu otrzymał pochwałę

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2020, o 11:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 147
Pomógł: 37

Struktura danych która jest używana w tym programie to lista jednokierunkowa
http://wojciech.bozejko.staff.iiar.pwr. ... _listy.pdf


Autor postu otrzymał pochwałę

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2020, o 12:59 
Offline
Nowy

Dołączył(a): 23 lip 2019
Posty: 19
Pomógł: 0

Dzięki za wyjaśnienie. Czyli funkcja alokuje pamięć.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

To jest struktura. struct node*next to podobno wskaźnik do następnej struktury która zawiera te same dane.
Czy funkcja first nie nadpisze danych gdy jest podany ten sam wskaźnik podczas wywoływania po raz drugi ?

------------------------ [ Dodano po: 58 minutach ]

Malloc definuje dane w stercie ? Kazde wywołanie fukcji first zapisuje dane i są pamiętane z każdego wywołania ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2020, o 20:22 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Nie te same, tylko takie same

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2020, o 07:41 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

ForestP napisał(a):
Czy funkcja first nie nadpisze danych gdy jest podany ten sam wskaźnik podczas wywoływania po raz drugi ?

Zakładam, że piszesz o tej linijce pętli (linia 24):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Po pierwsze, do funkcji przekazywana jest ta sama zmienna (root), ale jej wartość po każdym obiegu pętli jest inna, ponieważ - po zakończeniu działania funkcji first() - zmiennej root przypisywana jest wartość zwrócona przez tę funkcję.

Po drugie, Twoje obawy nadpisywania danych są nieuzasadnione, ponieważ to nawet nie ma znaczenia jaki wskaźnik przekażesz do funkcji first(). Przydzielaniem pamięci zajmuje się funkcja malloc(), która w żaden sposób nie jest zależna od przekazywanego do funkcji first() wskaźnika (linia 10):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Funkcja mallloc() wynajduje tylko wolny obszar pamięci o odpowiednim rozmiarze, zwraca wskaźnik do tego obszaru i przypisuje go do zmiennej lokalnej a (będącej wskaźnikiem do zmiennej typu struct node). Jednocześnie alokowany obszar zostaje oznaczony jako zajęty (przynajmniej do momentu wywołania funkcji free(), która go zwolni), więc przy następnym wywołaniu funkcji malloc() jest przez nią pomijany. Nie ma więc możliwości, że coś zostanie nadpisane.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2020, o 13:44 
Offline
Nowy

Dołączył(a): 23 lip 2019
Posty: 19
Pomógł: 0

Bardzo dziękuje wszystkim za wyjaśnienie moich obaw.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2020, o 15:14 
Offline
Nowy

Dołączył(a): 23 lip 2019
Posty: 19
Pomógł: 0

Dobry. Mam wątpliwości jak chodzi o działanie funkcji. Może jest to banalne dla was ale nie dla mnie :)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czy zmienne typu struct po wykonaniu programu są kasowane ?
Jak tak to czemu program pamięta wskaźniki do następnych elementów?
Czy dobrze mysle że struct node*tmp1=root powoduje wpisanie adresu root do wskaźnika?
Funkcja zwraca początkowa wartość root i nie wiem dlaczego program pamięta następne elementy jak wszystkie elementy są lokalne.

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2020, o 15:49 
Offline
Moderator
Avatar użytkownika

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

ForestP napisał(a):
Czy zmienne typu struct po wykonaniu programu są kasowane ?


Pomyśl i spróbuj sam sobie odpowiedzieć, "po wykonaniu jakiego programu?"

Podpowiedź - z pojęciem "po wykonaniu programu" możesz mieć do czynienia pod jakimś systemem operacyjnym np Windows czy Linux. Wtedy tak, byłyby kasowane po wykonaniu programu.

Ale w procku? Może ci się wykonać program ? Nie ma takiego pojęcia bo nie ma też nadrzędnego systemu operacyjnego i po to masz w głównej funkcji programu main() ... tzw nieskończoną pętlę główną - ona nie może się skończyć ... a więc? Będą kasowane ? czy nie?" ;) jak myślisz

_________________
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: 16 cze 2020, o 19:06 
Offline
Nowy

Dołączył(a): 23 lip 2019
Posty: 19
Pomógł: 0

mirekk36 dziękuje za odpowiedz.
Chodziło mi o funkcje struct node *first (int wartosc, struct node *root). To moj błąd.
Według książki i skryptu zmienne lokalne są kasowane po wykonaniu funkcji i pamiętane w obrębie funkcji.
Według Pana odpowiedzi mogę odczytać miedzy wierszami że mam błąd w swoim myśleniu.
Czyli jak naprawdę jest z tymi zmiennymi lokalnymi ? Są niszczone po wykonaniu funkcji ?
I tak funkcja jest wykonana po wykonaniu rozkazu return.
Czy struct są w tym przypadku ziemnymi lokalnymi ?
jakby były lokalnymi to nie moge odwoływać w innej fukcji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2020, o 21:00 
Offline
Moderator
Avatar użytkownika

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

ForestP napisał(a):
Według książki i skryptu zmienne lokalne są kasowane po wykonaniu funkcji i pamiętane w obrębie funkcji.

Bardzo dobrze pamiętasz i tak jest w 100%

ForestP napisał(a):
Według Pana odpowiedzi mogę odczytać miedzy wierszami że mam błąd w swoim myśleniu.

Tu nie chodzi o czytanie między wierszami, alokowanie pamięci za pomocą malloc to jeszcze inny mechanizm, którego akurat nie poruszałem w książkach i to chyba mój błąd - jakoś tak rzadko tego używam, że tak wyszło.

malloc() alkokuje pamięć w jeszcze innym obszarze, na tzw "stercie" to inny obszar niż ten gdzie leżą zmienne globalne w RAM i inny obszar niż ten tworzony dynamicznie na stosie podczas tworzenia zmiennych lokalnych przy wejściu do funkcji.

sterta o obszar pamięci - w uproszczeniu pomiędzy obszarem zmiennych globalnych a stosem. I jeśli zaalokujesz pamięć na jakąś zmienną to będzie ona "siedziała" tam sobie dokąd nie wykonasz odwrotnej funkcji do zwolnienia tej pamięci albo .... albo tak jak niechcący napisałeś do wyjścia z programu, ale to drugie to tylko pod systemami operacyjnymi jak pisałem na początku.

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

Cytuj:
Czyli jak naprawdę jest z tymi zmiennymi lokalnymi ? Są niszczone po wykonaniu funkcji ?

Jest tak jak napisałem w Bluebooku - są niszczone po wyjściu z funkcji. Ale już z BB wiesz, że inaczej zachowują się np zmienne lokalne ze specyfikatorem "static" prawda ? To są zmienne lokalne ale utworzone w obszarze zmiennych globalnych, z widocznością tylko dla tej funkcji.

A dzisiaj dowiedziałeś się o jeszcze innym mechanizmie - o zmiennych tworzonych dynamicznie w programie na stercie, które jak stworzysz to już tam siedzą i żeby je usunąć to trzeba to zrobić też ręcznie za pomocą odpowiedniej funkcji.

Mam nadzieję, że to wiele ci rozjaśni na początek

_________________
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: 17 cze 2020, o 09:15 
Offline
Nowy

Dołączył(a): 23 lip 2019
Posty: 19
Pomógł: 0

Malloc rozumiem tak że w tym przykladzie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wskaźnik do struktury A odwołuje do zalokowanej pamięci o rozmiarach struktury node i ona jest pamięci nie ulotnej ale struktura do ktorej wskazuje tmp1 nie jest powiązana żaden sposób do tej zamieci malloc.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wskaźnik tmp1 przyjmuje zawartość roota.
tmp1->next=a; Ta linijka tylko wpisuje do next adres . Czy ten malloc jest zwiazany z strukturą tmp1?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 cze 2020, o 09:29 
Offline
Moderator
Avatar użytkownika

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

ForestP napisał(a):
Wskaźnik do struktury A odwołuje do zalokowanej pamięci o rozmiarach struktury node i ona jest pamięci nie ulotnej

do jakiej "nie ulotnej" ? czytał kolega co wyżej napisałem? Toż to ląduje w pamięci RAM na Stercie. I alokowana jest pamięć przecież pod strukturę node - jeśli wykonałeś funkcję malloc()

_________________
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: 17 cze 2020, o 16:27 
Offline
Nowy

Dołączył(a): 23 lip 2019
Posty: 19
Pomógł: 0

Bardziej mi chodziło że nie będzie kasowana po wykonaniu funkcji. Pamieć będzie o rozmiarze struct node. Dane będą zapisane pod zmienną wartość. Ale nie ma powiazania.
Mam taką teorie. Funkcja malloc rezerwuje nam pamięć o wielkości struct node do której odwołuje wskaźnik a. Za każdym wywołaniem funkcji inna pamięć jest przydzielana. Do tej pamięci wpisujemy przez operator strzałki. Pozniej tworzymy następny tmp który jest powiązany z tą strukturą struct a? Tak jak matrioszki ? Ale logicznie to nie jest bo alokowana pamięć sklada się z wartości i struct node* next. Zadnej strony nie mogę powiązać srucktury tmp z pamiecią przydzieloną.

------------------------ [ Dodano po: 59 minutach ]

Już wiem. po pierwszym wywołaniu root odwołuje do pamięci na stercie czyli wskaźnik tmp jest zapisany do tej zmiennej wiec będzie pamiętana i za każdym razem wskaźnik tmp1 ma inny adres poprzez malloc który rezerwuje następny pakiet .
Teoria jest poprawna?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 cze 2020, o 22:37 
Offline
Moderator
Avatar użytkownika

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

dokładnie tak - już zdaje się ktoś wcześniej ci pisał że tworzysz listę jednokierunkową i jej elementy alokujesz na stercie

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 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