Ingemar Napisano Kwiecień 18, 2014 Udostępnij Napisano Kwiecień 18, 2014 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ć? Cytuj Link do komentarza Share on other sites More sharing options...
Ven_64 Kwiecień 19, 2014 Udostępnij Kwiecień 19, 2014 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. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Ingemar Kwiecień 19, 2014 Autor tematu Udostępnij Kwiecień 19, 2014 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? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Kwiecień 19, 2014 Udostępnij Kwiecień 19, 2014 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. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Ven_64 Kwiecień 19, 2014 Udostępnij Kwiecień 19, 2014 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. Cytuj Link do komentarza Share on other sites More sharing options...
Ingemar Kwiecień 19, 2014 Autor tematu Udostępnij Kwiecień 19, 2014 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ś? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Kwiecień 19, 2014 Udostępnij Kwiecień 19, 2014 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). Cytuj Link do komentarza Share on other sites More sharing options...
BlackJack Kwiecień 19, 2014 Udostępnij Kwiecień 19, 2014 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. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Ingemar Kwiecień 19, 2014 Autor tematu Udostępnij Kwiecień 19, 2014 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? Cytuj Link do komentarza Share on other sites More sharing options...
gacek91 Kwiecień 19, 2014 Udostępnij Kwiecień 19, 2014 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. Cytuj Link do komentarza Share on other sites More sharing options...
Ingemar Kwiecień 19, 2014 Autor tematu Udostępnij Kwiecień 19, 2014 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ąć? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Kwiecień 19, 2014 Udostępnij Kwiecień 19, 2014 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. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Ingemar Maj 12, 2014 Autor tematu Udostępnij Maj 12, 2014 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 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!