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

Typ przechowujacy typ ?

Object Storage Arubacloud
0 głosów
392 wizyt
pytanie zadane 4 października 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)
Witam, pisze wiekszy projekt oczywiscie obiektowo ale zanim zaczne pisac obiekty to napisze sobie proste funkcje wyswietlanie, tworzenie zmiennych itp. wszystko jest mi potrzebne do metod klas.

Jestem w trakcie pisania funkcji ktora bedzie mi generowala tablice dynamiczne. Pewnie spytacie ale dlaczego kiedy mozesz zadeklarowac taka tablice przy pisaniu metody no wlasnie z doswiadczenia juz wiem ze jakiekolwiek uzycie pamieci dynamicznej przy wywolaniu jakies metody obiektu zawsze mi wywalal przestrzenie std.

I moje pytanie jest takie funkcja posiada 3 zmienne lokalne.

int wymiary; //przechowuje wymiary np. jezeli chce miec tablice 2x wymiarowa to wymiary=2

int *wielkosc=new int[wymiary]

string nazwa;

I tu sie zaczyna problem bo tablica musi przechoywac zmienne o jakims typie i powinienem dodac jakas zmienna ktora przechowuje typ.

I kolejna rzecz jako ze jestem niedowswiadczony w tablicahc wielwymiarowych to czy moglby mi ktos wytlumaczyc analogie takich tablic, bede generowal wymiary za pomaca petli.

Z gory dzieki pozdrawiam.

5 odpowiedzi

+2 głosów
odpowiedź 4 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

Czyli chcesz samemu określać typ tablicy zwracanej przez funkcję? Da się to zrobić za pomocą szablonów funkcji:

template<class Typ>
Typ* dajTablice(int wielkosc)
{
    Typ* tablica = new Typ[wielkosc];
    return tablica;
}

 

komentarz 4 października 2015 przez 0xf Dyskutant (8,180 p.)
co oznacza template oraz <class typ> chodzi o te dziubki nie rozumiem do czego sa.

Dzieki za pomoc
komentarz 4 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

Tak wygląda deklaracja szablonu funkcji (czyli takiej funkcji, w której może zmieniać to i owo, tworząc różne jej wersję, bez kopiowania tego samego kodu z małymi zmianami), czyli:

template<class NaszTyp, ...> // trójkropek to inne argumenty (może być ich wiele)

Potem możesz korzystać z typów dostarczonych w argumentach szablonu w różnych miejscach funkcji (czy to zwracany typ, typ zmiennej wewnątrz funkcji itp.)

Potem wywołanie takiego szablonu wygląda tak:

mojaFunkcja<int>();
// lub tak
mojaFunkcja<float>();
// lub możemy nawet skorzystać z własnej klasy
mojaFunkcja<MojaKlasa>();

 

komentarz 4 października 2015 przez 0xf Dyskutant (8,180 p.)
:D o to mi chodzilo wspaniale, ja typy bede deklarowal juz w kodzie za pomoca funkcji poprostu bede im dawal zmienne, a czy takie deklarowanie typy jest mozliwe podczas dzialania programu ?
komentarz 4 października 2015 przez Patrycjerz Mędrzec (192,320 p.)
Nie rozumiem. Deklarowanie typów, czyli...?
+2 głosów
odpowiedź 4 października 2015 przez Szykem2 Nałogowiec (29,510 p.)

Z tego co rozumiem typ tej tablicy może być różny w różnych instancjach klasy? Jeśli tak to musisz zapoznać się z szablonami klas działa to na takiej zasadzie

template<typename T>
class A
{
public:
    //....
private:
    T tablica;
};

//a tu deklaracja zmiennej typu A
A<int*> zmienna; // typ zmiennej tablica to int*

A co do tablic to nie rozumiem o jakie analogie chodzi. Możesz rozwinąć?

+1 głos
odpowiedź 4 października 2015 przez Ehlert Ekspert (212,670 p.)

Co do wielowymiarowych masz tutaj odpowiedź.

Co do typów itp. myślę, że to może Ci pomóc, chociaż wydaje mi się, ze nie do końca zrozumiałem ideę tego co chcesz zrobić. 

 

+1 głos
odpowiedź 4 października 2015 przez Bondrusiek Maniak (61,370 p.)
Witam serdecznie,

Tak deklarujemy tablice n wymiarowe :

1-wymiarowa + int tablica[5] = {1,2,3,4,5} ;

2-wymiarowa + int tablica[5][5] = {{1,2,3,4,5},{1,2,3,4,5}};

n-wymiarowa + int tablica[5][5]....[n] = {{{...n, }}}..n ;

Tak wypełniamy tablice n-wymiarowe :

1-wymiarowa :

for(int i = 0 ; i < 5 ; i++)

tablica[i] = i ;

2-wymiarowa :

for(int i = 0 ; i < 5 ; i++)

{for(int k = 0 ; k<5 ; k++)

tablica[i][k] = //jakaś wartość}
komentarz 4 października 2015 przez 0xf Dyskutant (8,180 p.)
rozumiem a da sie jakos zrobic tablice ktore jakby polem czyli wielkosc=wymiar1*wymiar2 ?
komentarz 4 października 2015 przez Bondrusiek Maniak (61,370 p.)

Nie za bardzo rozumiem. Możesz spróbować użyć funkcji switch(){} . Najpierw podajasz wartość zmiennej wartość

cin >> wielkosc ;
switch(wielkosc)
{
case 1 :
int tablica[wymiar1];
break;
case 2 :
int tablica[wymiar1][wymiar2] ;
break ;
case 3:
int tablica[wymiar1][wymiar2][wymiar3];
break ;
//itd
}

 

0 głosów
odpowiedź 4 października 2015 przez hit02 Nałogowiec (33,970 p.)

Nie jestem pewien, czy dobrze zrozumiałem pytanie, ale moim zdaniem możesz tam nie podawać konkretnego typu. Wystarczy, że funkcja będzie zwracała void pointer. Taki wskaźnik można bez problemu zrzutować na dowolny inny typ, tylko musisz pamiętać, że rozmiar tablicy podajesz nie w ilości typu, tylko w bajtach, czyli jak chcesz zadeklarować tablicę int tabl[100], to wywołujesz mniejwięcej coś takiego:

int * tab = (int*)createTable(100 * sizeof(int));

gdzie createTable jest tak zadeklarowana:

void * createTable(int size);

 

komentarz 4 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

To jest chyba sposób à la C, w C++ chyba lepiej stosować szablony.

komentarz 4 października 2015 przez hit02 Nałogowiec (33,970 p.)

Bardzo możliwe, bo zazwyczaj piszę w C. smiley

Podobne pytania

0 głosów
1 odpowiedź 176 wizyt
pytanie zadane 29 grudnia 2017 w Java przez Kabuuz Bywalec (2,820 p.)
0 głosów
1 odpowiedź 235 wizyt
pytanie zadane 18 sierpnia 2020 w Java przez amtrax Dyskutant (9,630 p.)
0 głosów
0 odpowiedzi 287 wizyt
pytanie zadane 2 lutego 2022 w Nasze projekty przez adzikowski Nowicjusz (140 p.)

92,555 zapytań

141,402 odpowiedzi

319,545 komentarzy

61,939 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!

...