Skocz do zawartości

Tablice w Arduino – #2 – organizacja pamięci


Gieneq

Pomocna odpowiedź

4 minuty temu, SOYER napisał:

Ja dotychczas takich rzeczy nie miałem potrzeby używać, albo nie wiedziałem, że tak można;).

To tak jak i ze mna😉 rzadko korzystam, ale warto poczytac o wskaznikach bo temat obszerny i mozna tym wszelakiej masci kombinacje tworzyc i ulatwiac sobie zycie...taki prosty przyklad jak kolega @ethanak pokazal juz pokazuje ze dla kilku zmiennych musial bys tworzyc tyle samo jakichs if'ow i dodatkowych argumentow zebys wiedzial na jakiej zmiennej globalnej aktualnie operujesz w funkcji...a to tylko prosty przyklad uzycia wskaznika😉

  • Lubię! 1
Link do komentarza
Share on other sites

Chyba wiem gdzie mógłbym to zastosować, ale jak... 

W jednym z urządzeń(arduino mega) zapisuję najwyższe i najniższe odczyty z wszystkich czujników wraz z datą. Pisania było co nie miara, bo to z 15 czujników, każdy ma swój min, max, dzień, miesiąc i rok. Wtedy to zrobiłem na rtc1307 i osobno zapisywałem dd,mm,rr. Działa do dzisiaj, trzeba by też tam dorobić pobieranie czasu z neta.

Tylko czy dla uproszczenia takiego kodu da się użyć wskaźników? Tak na szybko myśląc, to by nawet ten przykład @ethanaksię nadawał. Jedna funkcja zapisująca dane i dla każdego czujnika linijka kodu wysyłająca do funkcji wartości i wskaźnik gdzie to zapisać.

Si?

 

Link do komentarza
Share on other sites

22 minuty temu, SOYER napisał:

Tylko czy dla uproszczenia takiego kodu da się użyć wskaźników? Tak na szybko myśląc, to by nawet ten przykład @ethanaksię nadawał. Jedna funkcja zapisująca dane i dla każdego czujnika linijka kodu wysyłająca do funkcji wartości i wskaźnik gdzie to zapisać.

Si?

 

Si😉...dokladnie tak...nie musisz sie wtedy z osobna bawic zmiennymi, tylko jedna uniwersalna funkcja ktora dla kazdego czujnika robi identyczna robote, a jedyne co to maja sie zmieniac zmienne do zapisania danych (ktore musza byc oryginalami, a nie kopiami)

Link do komentarza
Share on other sites

@SOYER też się trochę zastanawiałem. W kursie o tablicach ciężko o przykład gdzie wskaźniki są cudownym rozwiązaniem problemów tablic. Jak dla mnie, można używać wymiennie, kto co woli. W 6 części serii poruszam ten temat.

Wskaźniki mają jednak swoją działkę, w której rozwiązują realny problem. Jest to tworzenie połączeń na zasadzie "referencji". Np masz strukturę, odwołujesz się do jej elementu, modyfikujesz ją i gdzieś indziej w kodzie coś się zmienia. Mógłbyś zrobić to tablicami jednoelementowymi, ale nie ma to sensu, wskaźnik będzie lepszy. Masz też do wyboru referencję o której wspomniał @farmaceuta ale ją to bym zostawił do programowani obiektowego, ale jak kto woli 🙂 referencja została dodana do języka później więc musiała rozwiązywać realny problem, którego wskaźniki nie potrafiły.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Referencja i wskaźnik to dwie różne rzeczy.

Referencja zawsze odnosi się do istniejącego obiektu. Wskaźnik to po prostu adres, który może (ale nie musi) być adresem jakiejś zmiennej (równie dobrze może pokazywać  na miejsce w pół drogi na Marsa).

Analogia pocztowa: referencja to "ten dom, który pokazuję palcem" (czyli istniejący). Wskaźnik to "ul. Zielona 17", przy czym numeracja na Zielonej może kończyć się na 10, a nawet samej ulicy Zielonej w danym mieście może nie być.

I z programowaniem obiektowym nie mają nic wspólnego.

Link do komentarza
Share on other sites

@Gieneq tak, przeczytałem wczoraj ten kurs do ostatniego dostępnego odcinka. Bardzo merytorycznie i przystępnie napisane, choć nie ukrywam, że muszę do tego wrócić bo wiele rzeczy jest dla mnie nowych. Co do wskaźników, to już(odrobinę) rozumiem po co toto jest;). Tajemnicze gwiazdki i ampersandy już mniej straszne:).

  • Lubię! 1
Link do komentarza
Share on other sites

Skoro juz mowa o wskaznikach...😉 Da sie jakos uzyc wskaznika na element enum?? Mam np...

typedef enum {
  s1 
  s2 
  s3 
} Dane;
Dane dane;

I chcialbym do funkcji przekazywac s1/2/3 etc...🤔 Mam 4 guziki i musze powtarzac dla kazdej zmiennej te same ify...jedynie zmienne sie zmieniaja i przypisanie innej wartosci do "dane" 

O ile dla zwyklych zmiennych uzycie wskaznika jest oczywiste, o tyle dla enum nie wiem czy sie da (jakiego typu mialby byc wskaznik), bo nie wiem co mialbym utworzyc w funkcji...

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

A da się zrobić wskaźnik do siedem?[1]

Enum to w uproszczeniu coś w stylu #define - w Twoim przypadku (pomijając interpunkcję) odpowiednik
 

#define s1 0
#define s2 1
#define s3 2

Coś masz za bardzo nakombinowane w kodzie.

---

[1] Pomińmy FORTRAN 🙂

 

  • Lubię! 1
Link do komentarza
Share on other sites

25 minut temu, ethanak napisał:

Enum to w uproszczeniu coś w stylu #define - w Twoim przypadku (pomijając interpunkcję) odpowiednik

 



#define s1 0
#define s2 1
#define s3 2

Coś masz za bardzo nakombinowane w kodzie.

 

Tak tak...wiem ze enum to taki odpowiednik define...ale skoro juz jest enum to tego chce uzyc..😉 

Kod w miare normalny...mam switch() i case w ktorych wyswietlam...wyswietlam i przechodze do case S1: (zeby nie powtarzac wyswietlania na darmo) w S1 mam 4 if'y  dwa od ++/-- zmiennej i dwa od "up" "down"..czyli przechodze do nastepnego case lub do poprzedniego...no i dla 10 zmiennych obsluga guzikow wyglada tak samo, tylko zmienia sie skladnik dla enum...wiec moglbym z tego zrobic funkcje i tylko argumenty(skladnik enum) inny...ale juz chybamam odpowiedz....

typedef enum {
  s1 
  s2 
  s3 
}Dane;
Dane dane = s1;

fun(s3);

void fun(Dane dane2) {
  if(up) {
    dane = dane2;
    }
}

Czy to zadziala?? Czy w funkcji zmiennej "dane" zostanie przypisana wartosc s3? (Jesli wcisne guzik "up")

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

@ethanakw tej linijce

if (remainder) *remainder = a % b;

zastanawia mnie dlaczego jest to

if (remainder)

 

23 godziny temu, ethanak napisał:

Sprawdzamy, czy wskaźnik jest różny od zera

przecież w argumencie funkcji przekazujemy adres &reszta, to remainder nie może być pusty, czy coś pokręciłem?

Link do komentarza
Share on other sites

6 minut temu, SOYER napisał:

przecież w argumencie funkcji przekazujemy adres &reszta, to remainder nie może być pusty, czy coś pokręciłem?

A co jeśli parametrem będzie NULL?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.