Skocz do zawartości

[C] Jak praktycznie wykorzystywać struktury w swoich programach?


Ingemar

Pomocna odpowiedź

Witam.

Wiem co to są struktury, w internecie można znaleźć dużo informacji na ten temat, jednak odnoszę wrażenie, że istnieje pewna luka informacyjna. Można znaleźć albo podstawowe informację co to jest struktura, albo wiadomości dla zaawansowanych, w stylu "jak ich używać, żeby zajmowały mało miejsca w pamięci". Nigdzie jednak nie spotkałem się z tym, żeby ktoś pokazywał gdzie się mogą one przydać, gdzie ułatwiają życie, a gdzie są wręcz konieczne.

Bardzo prosiłbym więc, żeby ktoś na jakimś prostym przykładzie pokazał mi co mogę z taką strukturą zrobić i w jaki sposób może ona ułatwić życie.

Powiedzmy, że mam strukturę która opisuje np jakieś ustawienia maszyny:

struct ustawienia{
char osY;
char osZ;
int czasPracy;
} element;

Co z tym mogę zrobić?

Albo w drugą stronę, mam strukturę która coś by przechowywała, np:

struct pomiar{
char temp;
char wilg;
int czasPomiaru;
} stanowisko;

Jak do niej zapisywać?

Link do komentarza
Share on other sites

Masz tu dobry materiał o strukturach: http://cpp0x.pl/kursy/Kurs-C++/Struktury-danych/303

Co prawda z kursu c++, ale to nic nie szkodzi.

Struktura to jakby nowy, złożony typ zmiennej wiec jak masz strukture:

struct pomiar{ 
char temp; 
char wilg; 
int czasPomiaru; 
} stanowisko; 

To deklarujesz tak:

pomiar a;

I przypisujesz wartość:

a.temp = iles_tam;

Lub deklarujesz i przypisujesz o razu:

pomiar a =
{ 
iles_tam, 
"a", // char przechowuje znaki, a wchar_t liczby 0-255
64, 
};

PS. Mam nadzieje że pomogłem, i że nie zrobiłem błedów w kodzie, bo dawno nie programowałem.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

To deklarujesz tak:

pomiar a;

I to jest to samo jak zadeklarowałem zaraz za strukturą "stanowisko"?

Druga rzecz - poniższe zapisy są równoważne?

pomiar a =
{
30,
57,
12,
}
pomiar a;
a.temp = 30;
a.wilg = 57;
a.czasPomiaru =12,

Ok, tylko teraz jaką przewagę ma struktura nad samymi zmiennymi?

W czym mogę wykorzystać to, że zamiast "temperatura" będę pisał "a.temperatura"? A jeśli chcę pogrupować dane, to mogę wykorzystać tablice, np:

stanowisko1[] ={30,57,12}

stanowisko2[]= {35, 51, 12}

stanowisko3[]={40, 60, 12}

stanowisko4[]={29, 55,8}

Może ktoś podrzuciłby kawałek kodu w którym wykorzystuje struktury?

Link do komentarza
Share on other sites

Ja tylko dodam jeszcze mój praktyczny przykład. Swego czasu w linefollowerze miałem zaimplementowany dobór ustawień na strukturach. W kodzie zapisane na sztywno były 3 tryby jazdy (np.: wolno, szybko, najszybciej). Wybieranie ustawień polegało jedynie na zmianie wskaźnika do struktury. Nie musiałem podmieniać przykładowo 15 zmiennych.

  • Pomogłeś! 1
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

1. Najpierw tworzysz nowy typ zmienej (strukture), a potem tworzysz zmiene tego typu czyli najpierw:

struct pomiar{ 
char temp; 
char wilg; 
int czasPomiaru; 
} stanowisko; 

Globalnie lub w funkcji, a potem:

pomiar a;
pomiar b;

2. Tak, są równoznaczne.

Link do komentarza
Share on other sites

Mam nadzieję, że tłumaczenie podstaw nie jest dla Was irytujące i pozwolę sobię na kolejne pytania.

W kodzie zapisane na sztywno były 3 tryby jazdy (np.: wolno, szybko, najszybciej). Wybieranie ustawień polegało jedynie na zmianie wskaźnika do struktury. Nie musiałem podmieniać przykładowo 15 zmiennych.

I to wydaje się bardzo użyteczne. A jak to zrobiłeś?

Link do komentarza
Share on other sites

Zdefiniowałem strukturę jako typ danych, stworzyłem 3 zmienne tego "typu". Każda miała wpisane inne wartości, a później tylko nadpisywałem wybraną strukturę z aktualnymi ustawieniami (przez podanie wskaźnika).

Link do komentarza
Share on other sites

Nigdzie jednak nie spotkałem się z tym, żeby ktoś pokazywał gdzie się mogą one przydać, gdzie ułatwiają życie, a gdzie są wręcz konieczne.

Dobrym przykładem z życia jest półka z płytami CD. Na takiej półce możesz sobie poukładać płyty jak leci, ale odnalezienie jakiegoś konkretnego wykonawcy jest wtedy trudne. Ale możesz je poukładać gatunkami muzyki, a w ramach danego gatunku alfabetycznie wykonawcami.

To jest właśnie struktura w praktyce, która klasyfikuje ci na półce płyty w sposób logiczny, i pozwala szybko i wygodnie wśród nich wyszukiwać tą którą potrzebujesz.

Struktury są w zasadzie rozwinięciem idei tablic w taki sposób, aby można było w sposób jasny, a przede wszystkim czytelny zarządzać dużymi ilości informacji o wspólnych cechach.

W robotyce, tablica struktur umieszczona w EEPROM może stanowić np. plik konfiguracji robota, w zależności od trybu jego pracy, lub bazę danych niezbędnych do uczenia się np. charakterystyki różnych obiektów dla czujników.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Z tego co wyczytałem tu: http://students.cs.byu.edu/~cs124ta/references/HowTos/HowTo_Structs.html

to struktury dają tą przewagę nad zwykłymi zmiennymi, że "za jednym zamachem" można na raz skopiować (przypisać) duzą ilość danych (całą strukturę). Na pewno jest to łatwiej niż kopiować pojedynczo kilkanascie zmiennych.

typedef struct
{
  char name[namesize];
  char address[addresssize];
  int YearOfBirth;
  int MonthOfBirth;
  int DayOfBirth;
} PersonalData;
then declare:

PersonalData x;


struct Personal x,y;
x = y;

Tylko dlaczego "PersonalData" zostało wpisane po zamknięciu nawiasu }, a nie zaraz po "typedef struct"? Jaka jest różnica?

Link do komentarza
Share on other sites

Ja dodam swoje 3 grosze że jeżeli masz duży projekt gdzie jest multum zmiennych gdzieś 50-100 to struktury ułatwiają życie. Bardzo. Jeżeli dostajesz kod(trzeba dodać dużo kodu) do poprawy i masz zmienić jedna rzecz to jeżeli kod jest napisany przejrzyście to idzie łatwo. Dodam że kod pisany na samych zmiennych jest mało czytelny bo nagle dochodzi dużo linijek kodu.

W skrócie gdzie to jest wykorzystane? Wszędzie gdzie ułatwia to życie, bo od tego to jest. 😉

Zachęcam do obejrzenia opensource programów gdzieś na svn albo git i zapoznania się z kodem.

Link do komentarza
Share on other sites

Zachęcam do obejrzenia opensource programów gdzieś na svn albo git i zapoznania się z kodem.

masz na myśli http://subversion.apache.org/ i http://git-scm.com/ ? to raczej kody do programów na kompa, a ja pytam raczje o typowo mikrokontrolerowe zastosowanie (sterowniki, roboty, systemy pomiarowe).

Tutaj http://www.cprogramming.com/tutorial/c/lesson7.html wyczytałem, że funkcja moze zwracać strukturę. Mógłby ktoś to rozwinąć?

Link do komentarza
Share on other sites

Tylko dlaczego "PersonalData" zostało wpisane po zamknięciu nawiasu },

Ponieważ tak deklaruje się nowy typ danych.

wyczytałem, że funkcja moze zwracać strukturę. Mógłby ktoś to rozwinąć?

Normalnie, funkcja returnem może zwrócić tylko jedną wartość (zmienną) jeśli jednak będzie to struktura, to wewnątrz niej zaszyte może być wile innych wyników.

Główną zaletą struktur, według mnie, która tu nie padła jest:

Struktura, to taka tablica wielowymiarowa, w której każdy element może być innego typu.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

A pochwale się 😉

Poćwiczyłem trochę w praktyce te struktury i jak na moje oko to całkiem skomplikowane już potrafię pisać, np.:

struct Obiekt oHistereza =
{
.nastaw = InitObiekt(&oHistereza),
.wartoscPoczatkowa = 02,
.oSymbol1 = 0xFF,
.oSymbol2 = LKW,
.adres_eeprom = 201,
};

gdzie InitObiekt :

unsigned char InitObiekt (struct Obiekt *wsk )
{
unsigned int Tmp;
Tmp = OdczytZEpromu(wsk ->adres_eeprom);
if (Tmp !=0xFF)
return Tmp;
else
return wsk -> wartoscPoczatkowa;
}

Nie jest to strukturowy Mont Everest, ale:

- wykorzystałem w strukturze funkcję do wypełnienia jednego z jej pól

- użyłem innego pola jako argumentu do tej funkcji

- spełnia swoją funkcje w pseudo sterowniku do pieca który piszę i na bieżąco testuje.

Jak dla mnie już coś 😉

Dla potomnych podrzucę jeszcze linki -

http://pl.wikibooks.org/wiki/C/Typy_z%C5%82o%C5%BCone

http://pl.wikibooks.org/wiki/C/Wska%C5%BAniki_-_wi%C4%99cej#Wska.C5.BAniki_na_funkcje

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.