Skocz do zawartości

Tworzenie obiektów w języku C++ / Arduino - jak to prawidłowo robić?


hubert27

Pomocna odpowiedź

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ę 😉

Link do komentarza
Share on other sites

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ęć.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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()?

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

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ą.

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

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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]
Link do komentarza
Share on other sites

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ć.

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.