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



Teraz jest 30 lis 2024, o 13:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
 Tytuł: Adresy w C
PostNapisane: 25 sie 2013, o 07:36 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

Czytam Ksiazke Mirka i jednoczesnie Stephena Praty Szkoła Programowania. Mam problem ze zrozumieniem jednej rzeczy. Chodzi mianowicie o program pisany na PC.

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


Chodzi mi o to co tak naprawde robi funkcja scanf("%d" , &a). czy ona zapisuje liczbę podana przy wpisywaniu jako adres? Jak podam np 10, to czy np wartosc zmiennej globalnej a bedzie rowna 0, bo jej nie przypisałem wartosci a jej adres to bedzie 24 w zapisie dziesietnym.
A gdyby tak umiescic dodatkową zmienną w innej funkcji, załózmy ze mam cos oprócz main. Zdefiniowac zmienna i nie przypisac jej wartosci. Pobrac wartosc scanf identyczna jak dla zmiennej globalnej czyli 10. Jaka wartosc i jaki adres bedzie miala?
Na dodatek nie wiem dokladnie jak dziala printf[ choc pewenie rozjasni mi sie dowiem jak dziala scanf.] Jak ona wyswietla wartosc( w sensie wartosci zmiennych, ich adresy, co tak faktycznie widze na ekranie wpisujac ta liczbe 10)?


Pozdrawiam
Piotrek

P.S Rozumiem ze jak napisze int i = 1; to zmienna i bedzie miala wartosc 1 i bedzie zapisana w jakims adresie w pamieci, o ktorym moge sie dowiedziec np. wykorzystujac wskaznik. Ale z drugiej sctony jesli scanf("%d" , a) pobierze wartosc reprezentujaca adres a potem zrobie c = i*a; to jak, mnozenie wartosci przez adres- nielogiczne, czegos ewidentnie nie wiem/nie rozumiem

Prosze o pomoc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Adresy w C
PostNapisane: 25 sie 2013, o 07:42 
Offline
Moderator
Avatar użytkownika

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

leech10 --> na razie bardzo daleko jesteś od mikrokontrolera i pewnie stąd to niezrozumienie .... tym bardziej, że posługujesz się w rozważaniach na razie takimi funkcjami jak scanf(), printf() .... których (jak sam zresztą piszesz) działania w ogóle nie rozumiesz :(

A tymczasem gdybyś przeczytał sobie np rozdział 4.8 WSKAŹNIKI, str 153 z bluebooka, (dokładniej na stronie 155) ... to już miałbyś wizję co to jest adres zmiennej. Tymczasem w programowaniu na PC nikogo nie interesuje taki adres bo po co ? Nie ma tego w rozważaniach w książkach do C na PC ... i stąd masz kłopoty.

Piszesz np:

leech10 napisał(a):
hodzi mi o to co tak naprawde robi funkcja scanf("%d" , &a). czy ona zapisuje liczbę podana przy wpisywaniu jako adres?

No pewnie w tej książce masz wyraźnie napisane że funkcja ta służy do wprowadzania danych ze strumienia zewnętrznego. Więc jak możesz pytać czy ona zapisuje liczbę jako adres ? A co to znaczy zapisać liczbę jako adres hmmm ?

masz swoją zmienną "a" typu int. Rzuć proszę okiem w tym momencie na stronę 153 w bluebooku, i ona jest umieszczona w pamięci RAM pod jakimś adresem - TO ZNACZY w jakiejś komórce pamięci RAM, a komórki te ponumerowane są przecież. I ten numer komórki panie kochany to jest fizyczny adres zmiennej w pamięci RAM. Tyle że ty już z tej książki nabierasz nawyku posługiwania się najmniejszym typem int ;) podczas gdy w prockach zaczniesz szybko mieć z tym kłopoty bo to AŻ DWA bajty w procku - więc ta twoja zmienna "a" w procku zajęłaby aż dwa bajty.

leech10 napisał(a):
to czy np wartosc zmiennej globalnej a bedzie rowna 0,

Ja w książce wyraźnie piszę i to MUSISZ sobie zapamiętać na zawsze - że w języku C WSZYSTKIE ZMIENNE GLOBALNE są automatycznie inicjowane ZEREM jeśli ich nie inicjalizujesz inną wartością. Rozumiesz?


leech10 napisał(a):
bo jej nie przypisałem wartosci a jej adres to bedzie 24 w zapisie dziesietnym.

A skąd sobie wziąłeś taką akurat wartość 24 ? z przysłowiowego kapelusza ? ;) Programując w języku C NIKOGO tak na prawdę nie obchodzą fizyczne adresy komórek pamięci w których są zmienne, za to ja w książce tłumaczę to w oparciu o takie przykładowe adresy żeby lepiej to zrozumieć. W książkach do programowania w C na PC - nigdy nie spotkasz takiego podejścia że ktoś będzie mówił ci że np jakaś tam zmienna "G" leży sobie pod adresem 0x0045 - bo tam pamięci RAM masz od groma i w ogóle takie podejście jest niepotrzene.

leech10 napisał(a):
A gdyby tak umiescic dodatkową zmienną w innej funkcji, załózmy ze mam cos oprócz main. Zdefiniowac zmienna i nie przypisac jej wartosci. Pobrac wartosc scanf identyczna jak dla zmiennej globalnej czyli 10. Jaka wartosc i jaki adres bedzie miala?


No to już pewnie jak sam się domyślasz jest TOTALNYM nieporozumieniem.

jeszcze raz - definiujesz jakąś zmienną globalną np "a" (będzie zainicjalizowana ZEREM)

teraz pobierasz do niej wartość za pomocą scanf() np ze strumienia klawiatury komputerowej

to panie kochany ona będzie miała taką wartość jaki klawisz wcisnąłeś na klawiaturze - kod znaku ASCII a nie jakieś tam 10 co ty wymyślasz itp :( ..... Chyba że scanf() nie odbierze żadnego znaku to wartość zmiennej "a" zostanie nie zmieniona i pozostanie = 0

leech10 napisał(a):
Na dodatek nie wiem dokladnie jak dziala printf[ choc pewenie rozjasni mi sie dowiem jak dziala scanf.]

Ja bym na twoim miejscu zaczął od tego aby się dowiedzieć jak te funkcje działają a nie czytać 300 stron książki gdzie wciąż masz przykłady tylko na tych funkcjach i wciąż nie wiesz do czego one są :(

ale ok scanf() już ci chyba wyjaśniłem - pobiera dane ze strumienia WEjściowego

a printf() - wysyła dane na strumień WYjściowy ;)

rozumiesz ? w C na PC posługujesz się pojęciem tzw strumieni we/wy. Co może być strumieniem WYjściowym ? jak myślisz ? no to podpowiadam. Może to być np: monitor, drukarka, dysk twardy itp

zakładając więc że strumieniem wyjściowym będzie monitor to printf spowoduje ci wyświetlenie tego co ma w argumentach na monitorze

no nie można bez tak mega podstawowej wiedzy próbować uczyć się C ale pewnie czytając tą książkę w ogóle nie próbujesz wykonywać ćwiczeń na PC i pewnie stąd twój problem - bo gdybyś sobie zainstalował jakiś kompilator i zaczął bawić się nawet w konsoli to już byś to poczuł dużo wcześniej....

Za to jak wiesz w mikrokontrolerach jesteśmy DUŻO bliżej sprzętu - wprawdzie i tu można posługiwać się strumieniami ale najpierw, .... najpierw panie kochany to trzeba te strumienie samemu zbudować, zmajstrować i jeszcze je zdefiniować jako strumienie ;) ...

leech10 napisał(a):
ak ona wyswietla wartosc( w sensie wartosci zmiennych, ich adresy, co tak faktycznie widze na ekranie wpisujac ta liczbe 10)?


jeśli dasz zmiennej "a" wartość = 10 i wyświetlisz ją za pomocą printf() to czego innego można się spodziewać niż jej wartości czyli liczby 10?

Tobie się mylą tutaj niestety wskaźniki - o których może jeszcze nie doczytałeś ... i stąd twój problem z tymi adresami dlatego jeszcze raz z uporem maniaka ;) proponuję ci przeczytać rozdział o wskaźnikach w Bluebooku

reasumując:

scanf( "%d" , &a);

spowoduje wczytanie kodu klawisza do zmiennej "a" dlatego że jako argument podałeś WSKAŹNIK do swojej zmiennej "a" czyli jej adres rozumiesz ? dokonałeś tego za pomocą operatora wyłuskiwania adresu &.

natomiast:

printf("&d" , a);

wyświetli ci zawartość zmiennej "a", oczywiście gdybyś napisał

printf("&d" , &a);

to efekt byłby ten sam ....

ale jeśli cię to dziwi - to jak mówię - musisz poczytać o wskaźnikach ok ?

_________________
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  
 Tytuł: Re: Adresy w C
PostNapisane: 25 sie 2013, o 07:56 

Pomógł: 0

Ja rozumiem to tak:
1. int a deklarujesz, że zmienna a będzie typu całkowitego i jest rezerwowane dla niej jakieś miejsce w pamięci
2. funkcja scanf czeka na wprowadzenie liczby dziesiętnej z klawiatury i przypisuje jej wartość zmiennej a
3. funkcja printf z kolei pobiera aktualna wartość zmiennej a i wypisuje ją na ekran

nie bardzo rozumiem czego nie rozumiesz, a może ja to upraszczam w swoim rozumieniu?

------------------------ [ Dodano po: kilkunastu sekundach ]

o widzę że w miedzyczasie Mirek Ci obszerniej i bardziej fachowo opisał



Góra
  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Adresy w C
PostNapisane: 25 sie 2013, o 09:22 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

Dzieki bardzo. Juz teraz wiem.

To nie jest tak ze cwiczen nie robie. Mam zainstalowany MS Visual studio 2010 i zrobilem wszystkie przyklady i zadania z pierwszych 5 rozdzialow. Teraz wiem czego nie zrozumialem. Poprostu & przypisuje wartosc( a wlasciwie kod ASCII) tej zmiennej. & wskazuje na fizyczny adres tej zmiennej do ktorej ta wartosc ma byc przypisana. Ot co mnie zgubilo. A dlaczego? Bo ja wlasnie przyczytalem czesc teoretyczna bluebooka i zastanawialem sie czemu Prata tego tak nie wyjasnial. Teraz Ty mi to wyjasniles. Ze to nie jest potrzebne na PC. Wczesniej czytalem ze scanf() pobiera dane ze strumienia ale jakos nie zastanawialem sie nad fizycznymi adresami, bo bo jak piszesz po co skoro w PC mam np 4 GB RAM.............

Zrobilem sobie w glowie metlik dlatego gadalem glupoty, wybacz, ale jakbym sie nie zapytal to bym utonal teraz.

P.S. Juz wiem jak na PC odczytywac adres przy pomocy %p i tak naprawde co to wogole jest. Zrobilem sobie wlasnie troche cwiczen w Visual Studio na PC.

Dziekuje raz jeszcze za rozjasnienie tematu


Pozdrawiam
Piotrek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Adresy w C
PostNapisane: 25 sie 2013, o 09:49 
Offline
Moderator
Avatar użytkownika

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

leech10 napisał(a):
wybacz, ale jakbym sie nie zapytal to bym utonal teraz.


Ależ nie mam czego wybaczać ;) .... bardzo dobrze to rozumiem, że ktoś może się w tym zagubić - stąd takie moje obszerniejsze wyjaśnienie ;)

_________________
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  
 Tytuł: Re: Adresy w C
PostNapisane: 25 sie 2013, o 09:50 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

A i jeszcze jedno

Na stronie 155 bluebooka jest ten fajny obrazek z adresami

mirekk36 napisał(a):
TO ZNACZY w jakiejś komórce pamięci RAM, a komórki te ponumerowane są przecież. I ten numer komórki panie kochany to jest fizyczny adres zmiennej w pamięci RAM. Tyle że ty już z tej książki nabierasz nawyku posługiwania się najmniejszym typem int ;) podczas gdy w prockach zaczniesz szybko mieć z tym kłopoty bo to AŻ DWA bajty w procku - więc ta twoja zmienna "a" w procku zajęłaby aż dwa bajty.



Czy mam rozumiec to tak:


typ uint8_t zajmuje 1 bajt, uint16_t zajmie 2 bajty, ale typ float zajmie juz 4 bajty(AVR)


Na PC , jak typ int reprezentuje wartosc 32-bit to bedzie 4 bajtowy a np double 8 bajtowy.

No i wskaznik pokaze nam fizyczny adres kazdej z tych zmiennych


Pozdrawoam
Piotrek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Adresy w C
PostNapisane: 25 sie 2013, o 10:36 
Offline
Moderator
Avatar użytkownika

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

leech10 napisał(a):
Czy mam rozumiec to tak:


typ uint8_t zajmuje 1 bajt, uint16_t zajmie 2 bajty, ale typ float zajmie juz 4 bajty(AVR)


Na PC , jak typ int reprezentuje wartosc 32-bit to bedzie 4 bajtowy a np double 8 bajtowy.

No i wskaznik pokaze nam fizyczny adres kazdej z tych zmiennych


DOKŁADNIE tak ;)

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

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