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



Teraz jest 5 mar 2026, o 04:05


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
Autor Wiadomość
PostNapisane: 8 paź 2016, o 15:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

Witam wszystkich mam problem nie do końca rozumiem rozdział w bluebooku poświęcony przekazywaniu tablic do funkcji rozdz 3.7.2

czy wywołanie funkcji i przekazanie do niej tablicy powoduje utworzenie jej kopi na stosie czy operuje na oryginalnych wartościach jakimi została zainicjowana ta tablica i w momencie wywołania przekazuje tylko adres do miejsca gdzie jest tablica ?
no i właśnie czy jest to adres do całej tablicy czy konkretnego jej obiektu.

uint8_t tab[]={128,64,32}; //komórki zdefiniowane

test(tab); //wywołanie funkcji ten zapis nie spowoduje utworzenia kopii? ?

wprawdzie jest w książce zawarta odpowiedz ale po kilku linijkach widnieje zapis :

test(tab[2]) // wywołanie , przy, którym pisze że taki zapis spowoduje utworzenie kopii przesłanej do niej wartości przecież oba zapisy wywołują tablice i trochę zachodzę w głowę czy mógłby mi ktoś to wyjaśnić?


i jeszcze jedno jak zapisać deklaracji i definicji funkcji jak to zapisać?

Pozdrawiam Spider12



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2016, o 15:37 
Offline
Moderator
Avatar użytkownika

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

słowo klucz dla ciebie to WSKAŹNIKI - przez wskażnik

czyli

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



zaś wywołanie w kodzie

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


albo jak chcesz od konkretnego jej elementu to

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

_________________
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: 8 paź 2016, o 16:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

czyli bez wskaźnika tablica będzie traktowana jak zwykły argument i zawsze wartości przekazywane będą kopiowane wywołując funkcjie?

bez wskaźników się nie obejdzie , tak?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2016, o 17:25 
Offline
Użytkownik

Dołączył(a): 28 wrz 2016
Posty: 215
Pomógł: 14

Poprosiłbym o wyjaśnienie przykładu.
W pierwszym przypadku wywołania funkcji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

przekazujemy funkcji wskaźnik na pierwszy element tablicy, bo nazwa tablicy jest jednocześnie wskaźnikem na jej pierwszy (tzn. z indeksem 0) element. Dalej, w ciele funkcji funkcja prawidłowo sobie przeliczy odwołania do kolejnych elementów tablicy.
Natomiast w drugim wywołaniu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

przekazany zostanie funkcji wskaźnik na trzeci element tablicy (z indeksem 2) i odwołania do tej tablicy, w ciele tej funkcji będą przesunięte o 3, i w
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
indeks wyjdzie poza zakres tablicy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2016, o 17:34 
Offline
Moderator
Avatar użytkownika

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

Podalem tylko przyklad wywolan a nie konkretny przyklad. No nie trudno sobie wyobrazic ze przy tak malej tabilcy robic taki przyklad. Pewnie ze przekroczy ale to oznacza ze rozumiesz o co chodzi

_________________
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: 8 paź 2016, o 18:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

Alef2 napisał(a):
w ciele funkcji funkcja prawidłowo sobie przeliczy odwołania do kolejnych elementów tablicy.

nie rozumiem za bardzo tego co później funkcja robi z takim odwołaniem funkcja( tablica );czy pózniej w jej definicji funkcja widzi całą tablice czy tylko element 0.
Alef2 napisał(a):
przekazany zostanie funkcji wskaźnik na trzeci element tablicy (z indeksem 2) i odwołania do tej tablicy, w ciele tej funkcji będą przesunięte o 3, i w

tego sformułowania też nie potrafię sobie zobrazować

------------------------ [ Dodano po: 44 minutach ]

:) aha już kumam trzeba kilka razy czytać dziękuje wam bardzo za pomoc bardzo dobrze zadawać pytania czytając ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2016, o 20:57 
Offline
Moderator
Avatar użytkownika

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

spider12 napisał(a):
bardzo za pomoc bardzo dobrze zadawać pytania czytając

Bardzo cenna uwaga ! to na prawdę pomaga ;)


Autor postu otrzymał pochwałę

_________________
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: 9 paź 2016, o 09:14 
Offline
Użytkownik

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

Pozwolę sobie coś dodać.
spider12 napisał(a):
czyli bez wskaźnika tablica będzie traktowana jak zwykły argument i zawsze wartości przekazywane będą kopiowane wywołując funkcjie?

W języku C tablice są przekazywane do funkcji zawsze tylko poprzez wskaźnik. Jeśli chcemy przekazać tablicę do funkcji, deklaracja funkcji może mieć różne formy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Niezależnie jednak jakiej formy użyjemy, do funkcji zawsze będzie przekazywany wskaźnik do tablicy. Nigdy nie jest tworzona kopia tablicy wewnątrz funkcji, tak jak ma to miejsce w przypadku innych zmiennych. Oznacza to, że zapis wewnątrz funkcji:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
zmieni zawartość tablicy przekazanej do funkcji, czyli jest równoważny zapisowi:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ważna uwaga:
Jeśli zadeklarujemy tablicę:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a później spróbujemy przypisać wartość do lokalizacji poza zakresem:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to otrzymamy od kompilatora ostrzeżenie:
Kod:
array index 8 is past the end of the array (which contains 5 elements)
.

Jeśli jednak zadeklarujemy funkcję jako:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i później wewnątrz funkcji przekroczymy dopuszczalny indeks tablicy, kompilator nas o tym nie poinformuje. Zwykle najlepszym sposobem na pilnowanie zakresu indeksów tablicy przekazanej do funkcji jest przekazanie jako drugiego argumentu ilości jej elementów:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2016, o 18:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

nie rozumiem ze str 151 BB jednej rzeczy co wspólnego z adresem komórki np 0x01 w pamięci ram ma wywołanie (tab+2) i jaki możemy mieć wpływ na adres w komórce pamięci czy też indeksu bądź wartości kryjącej się pod konkretnym indeksem w tablicy , po przez takie wyrażenie ?

czy indeks tablicy [4] kompilator traktuje jako zmienną int przecież to stała dosłowna? i czy wyrażenie tab+2 to
0000 0000(0) + 0000 0010 które daje dzięsiętnie liczbę 2?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2016, o 19:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 144
Pomógł: 2

Nie rozumiem cię spider12, dlaczego tak się męczysz z tymi adresami.

Tablica tab np. typu int - załóżmy, że zmienna int to dwa bajty.
(tab) - adres pierwszego elementu
(tab+1)- adres drugiego elementu, fizycznie dwa bajty od początku tablicy
(tab+2)- adres trzeciego itd., fizycznie cztery bajty od początku tablicy, a dwa bajty od poprzedniego.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2016, o 20:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

OK zrozumiałem Dziękuje



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2016, o 20:21 
Offline
Moderator
Avatar użytkownika

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

spider12 napisał(a):
nie rozumiem ze str 151 BB jednej rzeczy co wspólnego z adresem komórki np 0x01 w pamięci ram ma wywołanie (tab+2) i jaki możemy mieć wpływ na adres w komórce pamięci czy też indeksu bądź wartości kryjącej się pod konkretnym indeksem w tablicy , po przez takie wyrażenie ?

Proszę cię, błagam - na przyszłość - ZAPAMIĘTAJ sobie, że im bardziej złożone zdanie piszesz a do tego im mniej użyjesz przecinków, czy też podziałów na odrębne zdania, tym mniej osób ciebie zrozumie. A nawet sam nie będziesz rozumiał tego pytania, gdy je przeczytasz. Szczególnie po kilku dniach.

Tu zrobiłeś istną masakrę amerykańską piłą tarczową - i kompletnie nie czepiam się polszczyzny, tylko tego - że właśnie kompletnie nie można zrozumieć o co tobie chodzi ... Szczególnie o jakim adresie 0x01 piszesz ? (to w odniesieniu do czego w książce) ... A po chwili bez przecinka i kropki jednym ciurkiem "jaki możemy mieć wpływ na adres w komórce?" .... to zaraz to ty wiesz co to oznacza adresowanie pamięci czy nie za bardzo wiesz ? Bo może warto od tego zacząć i napisać np:

Słuchajcie nie za bardzo rozumiem o co chodzi z tym adresowaniem pamięci, co to są adresy? Nie za bardzo wiem co to oznacza indeksowanie tablicy? Jak to powiązać ? Tym bardziej że w książce na stronie XXX w akapicie nr YYY napisane jest "cytuję: ....."

Panie - wtedy to KAŻDY zrozumiałby twoje pytanie ... a tak ? sorki ale zgroza - postaraj się na przyszłość ok? Bo nad pytaniami też warto popracować.

spider12 napisał(a):
czy indeks tablicy [4] kompilator traktuje jako zmienną int przecież to stała dosłowna?

Tu już KOMPLETNE pomieszanie kilku absolutnie różnych zagadnień ... ale ok - jeśli nie miało się NIGDY do czynienia z programowaniem to ja oczywiście mogę to zrozumieć i ciebie rozumiem. Więc pomimo to że mieszasz kilka rzeczy to postaram się odpowiedzieć o ile też zgaduję twoje intencje - twoje pytanie poprawnie ...

Tablica to zbiór iluś tam wartości, i można ją rozważać na etapie abstrakcji w oderwaniu w ogóle od pamięci. Zostaw na chwilę pamięć RAM, FLASH, EEPROM i inne pamięci ...

I przez chwilę wyobraź sobie na spokojnie - że masz tablicę danych z czterema elementami:

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


Oczywiście język C umożliwia ci dokonanie tego zapisu w taki sposób:

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


czyli bez określania w nawiasach kwadratowych, ile ona ma elementów, ponieważ kompilator na etapie kompilacji - widzi ile ty tych elementów wpisałeś w nawiasach klamrowych rozumiesz ?

I teraz jak się odwoływać gdzieś w programie do elementów takiej tablicy ? Chciałbyś np odczytać wartość elementu ostatniego ? No jak ?

Musimy posłużyć się tzw indeksem ! Czyli liczbą którą podamy w nawiasach kwadratowych. Liczba ta może być albo stałą dosłowną czyli możemy napisać tak:

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


STAŁA DOSŁOWNA w tym przypadku to 3 (słownie: trzy) ... Stała dosłowna nie ma NIC WSPÓLNEGO z tablicami - po prostu być może pominąłeś albo zapomniałeś wcześniejszego rozdziału o stałych dosłownych. W kodzie programu jeśli wpisujesz wprost cyfrę, liczbę - to mówimy, że jest to STAŁA DOSŁOWNA.

ale możemy też zapisać tak:

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


w tym przypadku niechcący też mamy do czynienia ze stałą dosłowną, ale tym razem w nawiasach kwadratowych indeksem naszej tablicy nie jest stała dosłowna tylko zmienna i, która ma wartość = 3

w obu przypadkach w zmiennej a wyląduje wartość = 4 z naszej tablicy.

------------------------ [ Dodano po: 3 minutach ]

spider12 napisał(a):
i czy wyrażenie tab+2


To jest posługiwanie się WSKAŹNIKIEM tablicy. Skoro mowa, że nazwa tablicy wskazuje na jej pierwszy element, Czyli nazwa jest wskaźnikiem na jej pierwszy element, to jeśli zbudujemy wyrażenie którego wartością będzie wskaźnik na pierwszy element tablicy plus jakaś liczba - to w tym wypadku ta liczba będzie pełniła niejako rolę indeksu opisanego wyżej. Czyli przy zapisie indeksowym możemy napisać tak:

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


zaś przy wskaźnikowym

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

_________________
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: 12 paź 2016, o 23:49 
Offline
Użytkownik

Dołączył(a): 27 lut 2013
Posty: 230
Pomógł: 4

A ja mam pytanie,
jak przekazać do funkcji tablicę dwuwymiarową?

------------------------ [ Dodano po: 38 minutach ]

Pytanie nie aktualne ;)

Popełniłem błąd typu "za długo przy monitorze" i nie działało to u mnie tak jak chciałem. Ale doszedłem gdzie był głupi błąd ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2016, o 14:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

Wybaczcie , zbytnio się pośpieszyłem i chciałem wszystko w kilku zdaniach tak się nie da niestety ;)



Kolejne pytanie nie rozumiem UWAGI ze strony 151 w BB czemu nagle w nawiasach pojawia się tam (186+2) i co to ma do wyrażenia (tab+2) , przecież nazwa tablicy wskazuje na pierwszy jej element tab(0) a nie na wartość tego elementu ,to przecież nazwą się posługujemy a nie wartością 186 .


gdy używaliście słowa adresowanie myślałem że macie na myśli miejsce w pamięci adres komórki w obszarze RAM , a nie :

tab - adres pierwszego elementu
tab+1 - adres drugiego elementu
tab+2 - adres trzeciego elementu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2016, o 15:45 
Offline
Moderator
Avatar użytkownika

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

No rzeczywiście widać, że na razie to chyba kompletnie nie rozumiesz co to znaczy adresowanie pamięci. Dla wyjaśnienia, adresy to kolejne numerki komórek pamięci liczone o zera... Jaśniej ?

Więc na stronie 151 masz przykład i UWAGĘ, że jeśli np pierwszy element tablicy (której elementy są 8-bitowe) leży pod adresem np 186 ....

to znaczy, że zapis

tab+2

oznacza, że kompilator sięgnie do komórki pamięci o adresie

186+2 czyli 188

co w tym dziwnego ?

Mowa tu cały czas o adresach a nie o tym co znajduje się w tych komórkach

_________________
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: 13 paź 2016, o 16:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

czyli te 186 to przykładowy adres , którym chciałeś pokazać że dziesiętne 186 a szesnastkowo 0xBA to nic innego jak nazwa tab?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2016, o 19:53 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
czyli te 186 to przykładowy adres

No panie, przecież książka pełna jest takich przykładów szczególnie w pierwszej abstrakcyjnej części ;) ... no to jaki przykład miałem podać ;) ? co za różnica czy 186 czy 12 czy 342 czy 1209 itp itd ;) no "jakiś" adres

_________________
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 paź 2016, o 10:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

Zastanawia mnie poco przekazywać adres tablicy poprzez wywołanie do funkcji skoro i w niej można bawić się tablicą o zasięgu globalnym w znacznie prostszy sposób zamiast tak:

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


można przecież tak i efekt jest ten sam

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: 16 paź 2016, o 11:56 
Offline
Użytkownik

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

Jeśli Twoja funkcja będzie operować tylko na tej jednej tablicy, tablica ta jest zadeklarowana w tym samym pliku *.c (w programach o budowie modułowej wcale nie musi tak zawsze być) i jest zadeklarowana globalnie (poza funkcjami - "file scope"), możesz oczywiście zrobić tak jak w drugim Twoim przykładzie.

Funkcja z parametrem w postaci wskaźnika na tablicę pozwala na:
  • operowanie na dowolnej tablicy w dowolnym miejscu programu, nawet na tablicach lokalnych zadeklarowanych wewnątrz funkcji; wystarczy, że znamy jej wskaźnik, który przekażemy jako argument (często też jest wymagane podanie jako drugiego argumentu rozmiaru tablicy, jeśli rozmiar przekazywanych do funkcji tablic nie jest stały)
  • ograniczenie funkcji dostępu do tablicy na "tylko do odczytu", przykładowo:
    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: 16 paź 2016, o 12:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

nie do końca rozumiem andrews ale na etapie ,którym jestem może to narazie nie istotne pewnie później do tego dojdę sam .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2016, o 12:33 
Offline
Moderator
Avatar użytkownika

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

andrews napisał(a):
Jeśli Twoja funkcja będzie operować tylko na tej jednej tablicy,


spider12 napisał(a):
nie do końca rozumiem andrews


ale czego nie rozumiesz ? ..... jeśli masz w programie TYLKO tę jedną tablicę i chcesz ZAWSZE tylko i wyłącznie ją przekazywać do funkcji to możesz robić tak jak pokazałeś ale teraz pomyśl że ciut szerzej - a co się stanie gdy będziesz miał 2,3 albo 50 takich tablicy tylko że nieco innego typu ale tyle samo elementów tylko że jedna będzie przechowywała parametry pracy silnika1 inna parametry silnika2 itd

to co ? będziesz pisał kolejne swoje funkcje ?

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


i ZA KAŻDYM razem powtarzał te same kody w ciałach funkcji ? Tu wprawdzie masz tylko jedną linię ale zwykle funkcje coś tam sporo robią .... ZAMIAST dla tych dwóch tablic wywoływać jedną funkcję

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


czyli już masz więcej pamięci FLASH bo nie marnujesz jej na dwie IDENTYCZNE funkcje tyle że posługujące się każda inną tablicą... .a jak mówię - teraz sobie wyobraź że masz w programie 20 taki tablic ? to co? ty będziesz pisał 20 nowych 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: 16 paź 2016, o 12:47 
Offline
Użytkownik

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

spider12 napisał(a):
na etapie ,którym jestem może to narazie nie istotne pewnie później do tego dojdę sam

No wiesz, szczerze mówiąc ja bym z tym nie czekał. Znajomość organizacji danych w pamięci, adresowania i wskaźników to raczej istotne podstawy programowania (nie tylko w języku C). Braki w tej wiedzy mogą utrudnić postępy w edukacji.

Spróbuję prościej.

Jeśli masz jeden plik źródłowy *.c i w nim funkcję, która operuje tylko na jednej tablicy zadeklarowanej globalnie, to możesz zrobić tak, jak napisałeś w drugim przykładzie.

Jeśli chciałbyś, aby Twoja funkcja obsługiwała kilka tablic, należy przekazać do niej wskaźnik na tablicę, aby wiedziała, którą tablicą operować.

Jeśli masz budowę modułową programu i składa się on z kilku plików *.c (i plików nagłówkowych *.h), a funkcja jest w innym pliku niż tablica, też należy przekazać wskaźnik, bo funkcja nie będzie "widziała" Twojej tablicy w innym pliku. Pominę tutaj extern, żeby nie gmatwać sprawy.

Z tego samego powodu na razie pominę tablice utworzone lokalnie wewnątrz funkcji.



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

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