hubert27 Napisano Grudzień 14, 2016 Udostępnij Napisano Grudzień 14, 2016 Witam. Przy przeglądaniu bibliotek dla Arduino spotykam się z takim oto tworzeniem instancji klasy (obiektu): Klasa obiektKlasy ; czy nie powinny być te obiekty tworzone przez konstruktory? Co daje taki a nie inny zapis? Ja bym bowiem zrobił tak: Klasa * obiektKlasy = new Klasa(); Za wszelkie sugestie dziękuję 😉 Cytuj Link do komentarza Share on other sites More sharing options...
buchbuch Grudzień 15, 2016 Udostępnij Grudzień 15, 2016 bo to może struktura a nie klasa albo wyziew typedefu. Pokaż ten plik i to miejsce w pliku to może "profesjonały" wyjaśnią Ci dokładnie bo sam jestem ciekaw. Na podstawie tego co napisałeś nie da się udzielić sensownej odpowiedzi na Twoje pytanie tzn. przynajmniej z mojego punktu widzenia bo być może są też tacy co znają źródła arduino na pamięć. Cytuj Link do komentarza Share on other sites More sharing options...
Lukaszm Grudzień 15, 2016 Udostępnij Grudzień 15, 2016 czy nie powinny być te obiekty tworzone przez konstruktory? W podanym przypadku wywoływany jest konstruktor Klasa(). Co daje taki a nie inny zapis? Inny względem czego? Względem tego co podałeś poniżej? To jest dynamiczna alokacja pamięci pod obiekt, tworzony jest on wtedy na stercie. W systemach wbudowanych raczej nie stosuje się dynamicznej alokacji. Cytuj Link do komentarza Share on other sites More sharing options...
hubert27 Grudzień 15, 2016 Autor tematu Udostępnij Grudzień 15, 2016 bo to może struktura a nie klasa albo wyziew typedefu. Pokaż ten plik i to miejsce w pliku to może "profesjonały" wyjaśnią Ci dokładnie bo sam jestem ciekaw. Na podstawie tego co napisałeś nie da się udzielić sensownej odpowiedzi na Twoje pytanie tzn. przynajmniej z mojego punktu widzenia bo być może są też tacy co znają źródła arduino na pamięć. Nie. To nie jest struktura, tylko klasa. Przedstawie ten sposób na przykładzie biblioteki do czujnika temperatury Dallasa, działającego na OneWire. Tu mamy deklaracje klasy i jej składników w pliku nagłówkowym .h: class DallasTemperature { public: DallasTemperature(OneWire*); // initalise bus void begin(void); ... } Nie ma watpliwości że to klasa. W pliku głównym natomiast mamy utworzenie instancji (tak mi się wydaje) obiektu DallasTemperature: DallasTemperature sensors(&oneWire); //podanie referencji do typu interfejsu //jest to wywołanie konstruktora,ale bez "new" //dalej odnosi się do tego obiketu w ten sposoób: sensors.begin(); float tempC = sensors.getTempC(deviceAddress); //itd. Nie wiem, może nie mam kompletnej wiedzy na temat obiektówki, może jest to po prostu inna metoda stworzenia obiektu - stąd pytanie, co daje, i czemu nie przez new Konstruktor()? 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
deshipu Grudzień 15, 2016 Udostępnij Grudzień 15, 2016 To nie ma nic wspólnego z "programowaniem obiektowym". Różnica jest dokładnie taka, jak pomiędzy zrobieniem: char my_array[255]; a zrobieniem char *my_array = malloc(255); Różnica polega na tym gdzie ta pamięć zostanie zarezerwowana, na stercie czy na stosie, i czy może być potem w trakcie działania programu zwolniona i/lub zarezewrowana od nowa z inną wielkością. W przypadku małej ilości pamięci, jak przy mikrokontrolerach, raczej należy unikać dynamicznego alokowania pamięci -- więc wszelkie malloc i new odpadają. 1 Cytuj Link do komentarza Share on other sites More sharing options...
buchbuch Grudzień 15, 2016 Udostępnij Grudzień 15, 2016 a co w takim razie z funkcją free()? Czy zrobienie czegoś takiego ma sens?: typedef struct { char *c; int i; int (*f)(void); } str; str jakis_str; str.c = "tekst"; str.i = 9; str.f = &funkcja; str *wsk_str = &jakis_str; . . . free(wsk_str); EDIT: głównie literówki Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 15, 2016 Udostępnij Grudzień 15, 2016 Nie ma. Cytuj Link do komentarza Share on other sites More sharing options...
buchbuch Grudzień 15, 2016 Udostępnij Grudzień 15, 2016 Wnioskuję więc z tego, że funkcja free() ma ścisły związek z z funkcjami do dynamicznej alokacji i nie da się jej wykorzystać do "ręcznego" zwalniania pamięci na stosie, jej działanie jest ograniczone tylko do sterty, tak? Możecie podać jakiś prosty przykład na tworzenie "obiektów" bez użycia dynamicznej alokacji? Chodzi mi o implementację takiej klasy ze wszystkimi składowymi. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 15, 2016 Udostępnij Grudzień 15, 2016 W pierwszym poście masz taki przykład. Cytuj Link do komentarza Share on other sites More sharing options...
hubert27 Grudzień 15, 2016 Autor tematu Udostępnij Grudzień 15, 2016 Podsumowując - sposób BEZ wykorzystania słówka NEW tworzy obiekt w pamięci operacyjnej "statycznie" - czyli w momencie uruchomienia programu mikrokontrolera, co daje większą stabilność pamięci w przypadku nikłych jej zasobów. To jest tak jakby zadeklarować jakąś tablicę albo jakiegoś inta, i to jest dobra metoda programując systemy mikrokontrolerowe. Dobrze zrozumiałem? Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 15, 2016 Udostępnij Grudzień 15, 2016 Tak. Choć to niekoniecznie będzie statycznie -- bo jak to będzie w funkcji, to będzie tworzony na nowo przy każdym jej uruchomieniu. Cytuj Link do komentarza Share on other sites More sharing options...
buchbuch Grudzień 16, 2016 Udostępnij Grudzień 16, 2016 co daje większą stabilność pamięci w przypadku nikłych jej zasobów Tak. Choć to niekoniecznie będzie statycznie -- bo jak to będzie w funkcji, to będzie tworzony na nowo przy każdym jej uruchomieniu. Co mam rozumieć przez większą stabilność pamięci? Chodzi tu może o tzw "kolizję" stery ze stosem? W pierwszym poście masz taki przykład. Chodzi mi o przykładowe "bebechy" takiej "klasy" - ot taki ze mnie c-patolog 😉 dasz radę deshipu? Cytuj Link do komentarza Share on other sites More sharing options...
hubert27 Grudzień 16, 2016 Autor tematu Udostępnij Grudzień 16, 2016 Inaczej - jak wy programujecie swoje Arduina? 😃 Co do stabilności pamięci - arduino daje taki komunikat czasami: Sketch uses 21,236 bytes (65%) of program storage space. Maximum is 32,256 bytes. Global variables use 1,583 bytes (77%) of dynamic memory, leaving 465 bytes for local variables. Maximum is 2,048 bytes. Low memory available, stability problems may occur. [Finished in 24.3s] Cytuj Link do komentarza Share on other sites More sharing options...
Lukaszm Grudzień 16, 2016 Udostępnij Grudzień 16, 2016 Nie ma czegoś takiego jak 'stabilność pamięci', co to niby ma znaczyć? Przy alokacji dynamicznej występuje defragmentacja pamięci jak już. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 16, 2016 Udostępnij Grudzień 16, 2016 Chodzi mi o przykładowe "bebechy" takiej "klasy" - ot taki ze mnie c-patolog 😉 dasz radę deshipu? Weź sobie sam wyszukaj na githubie. Nie mam najmniejszej ochoty robić za ciebie ciągle całej roboty, bo jesteś "ciekawy" ale nawet ci się komentarza na YouTube nie chce sprawdzić. 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!