• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C, nie C++] Obiekt ADT alokowany statycznie

Object Storage Arubacloud
0 głosów
110 wizyt
pytanie zadane 15 marca 2017 w C i C++ przez Piotr Batko Stary wyjadacz (13,190 p.)
Czy jest możliwe, i jeżeli tak to w jaki sposób, utworzenie obiektu abstrakcyjnego typu danych alokowanego statycznie? W moim przypadku nie wchodzi w grę alokacja dynamiczna z zastosowaniem malloca.

Innymi słowy chodzi mi o odpowiednik klasy (z C++) z prywatnymi danymi oraz publicznymi metodami. Ważne, żebym mógł stworzyć globalny obiekt tej klasy, w jakimś innym pliku, załączając jedynie plik nagłówkowy.

Obecnie mój plik nagłówkowy zawiera jedynie nagłówki funkcji. W pliku źródłowym alokuję statycznie obiekt i implementuję ciała funkcji zadeklarowanych w pliku nagłówkowym. To rozwiązanie jednak ogranicza mi liczbę obiektów do jednej sztuki.

1 odpowiedź

+1 głos
odpowiedź 15 marca 2017 przez tangarr Mędrzec (154,780 p.)
wybrane 15 marca 2017 przez Piotr Batko
 
Najlepsza
Mógłbyś utworzyć tablicę takich obiektów i do swoich funkcji przekazywać odpowiedni indeks.
Dlaczego nie chcesz alokować pamięci dynamicznie?
komentarz 15 marca 2017 przez Piotr Batko Stary wyjadacz (13,190 p.)
Programuję systemy wbudowane. Mają pracować długi czas (na przykład miesiące) bez restartu.

1. Przy stosowaniu dynamicznej alokacji pamięci po dłuższym czasie pojawia się problem fragmentacji pamięci.
2. Ciężko oszacować ilość zajętego RAMu przez program.
3. Mam stosunkowo mało dostępnego RAMu.
1
komentarz 15 marca 2017 przez tangarr Mędrzec (154,780 p.)

Możesz spróbować czegoś takiego:
klasa.h
 

typedef struct moja_klasa moja_klasa_t;

moja_klasa *obiekt1();
moja_klasa *obiekt2();

int klasa_numer(moja_klasa* obiekt);

klasa.c
 

#include "klasa.h"

struct moja_klasa_t {
    int numer;
}

moja_klasa statyczny_obiekt1, statyczny_obiekt2;

moja_klasa *obiekt1() {
    return &statyczny_obiekt1;
}

moja_klasa *obiekt2() {
    return &statyczny_obiekt2;
}

int klasa_numer(moja_klasa *obiekt) {
    if (!obiekt)
        return -1;
    return obiekt->numer;
}

 

komentarz 15 marca 2017 przez Piotr Batko Stary wyjadacz (13,190 p.)

Nie podoba mi się to rozwiązanie. Załóżmy, że napisałbym w ten sposób stos i chciałbym wykorzystać go 50 razy w programie w bardzo różnych miejscach. Sterownik ledów miałby swój stos, czujnik pomiarowe miałyby jakieś swoje stosy itd. Wtedy muszę w pliku źródłowym zdefiniować wszystkie te stosy oraz w nagłówkowym zadeklarować wszystkie funkcje zwracające wskaźniki do nich.

Drugi argument przeciw: gdy będę przenosił ten stos do innego projektu, to muszę skasować wszystkie tworzone obiekty i wszystkie funkcje do ich zwracania.

Kiedy wcześniej kombinowałem z tym problemem, doszedłem do czegoś bardzo podobnego co tutaj napisałeś, ale zamiast tworzyć obiekty w pliku źródłowym z implementacją, próbowałem utworzyć je w innym pliku źródłowym. Niestety kompilator zaprotestował:

error: aggregate '' has incomplete type and cannot be defined

1
komentarz 15 marca 2017 przez tangarr Mędrzec (154,780 p.)
Gdybyś używał malloca to mógłbyś napisać konstruktor zwracający wskaźnik.
Wtedy mógłbyś zaalokować potrzebne obiekty w odpowiednich plikach.
Nie rozumiem dlaczego tak się wzbraniasz przed mallockiem. Jeżeli obiekty zaalokujesz raz, przy starcie aplikacji to nie powinieneś mieć żadnych problemów z fragmentacją pamięci. Taki obiekt na stercie będzie zajmował tylko wielkość 1 wskaźnika pamięci więcej, a dodatkowo nie ryzykujesz przepełnienia stosu.

Podobne pytania

0 głosów
2 odpowiedzi 221 wizyt
pytanie zadane 17 października 2015 w C i C++ przez timati Bywalec (2,060 p.)
0 głosów
1 odpowiedź 535 wizyt
+1 głos
1 odpowiedź 282 wizyt

92,555 zapytań

141,404 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...