Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [C++] f-cja zwracająca ilość elementów w tablicy - zastosowanie sizeof()
blooregard
post 26.11.2009, 22:27:26
Post #1


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Z potrzeby chwili napisałem prosty szablon funkcji, którego zadaniem jest zwracanie ilości elementów tablicy o dowolnym typie elementów (czyli klasyczne sizeof(tablica)/sizeof(typ_elementu)).

Jednakże pojawił się mały problem:
Cytat
//f-cja zwracajaca ilosc elementow tablicy

template <class T> T array_sizeof(const T * array) {
return sizeof(array)/sizeof(T);
}//array_sizeof


Czy jest możliwe takie użycie parametru T w szablonie funkcji, tzn., jako argumentu dla sizeof() ?
Bo niestety nie działa to w ten sposób.

Ten post edytował blooregard 27.11.2009, 00:36:41


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
thek
post 26.11.2009, 22:41:23
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A to nie lepiej użyć STL i funkcji size() na predefiniowanych vector czy list? Po co wymyślać koło na nowo smile.gif Masz tam wiele gotowych funkcji oraz iteratory a także parę innych dodatków. Moim zdaniem komplikujesz sobie życie niepotrzebnie smile.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
blooregard
post 26.11.2009, 23:15:01
Post #3


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




@thek, z pewnością masz rację, ale w tej chwili nie chodzi o zastosowanie STL, tylko o sam fakt - czy mozna użyć T jako argumentu dla sizeof() ?


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
antyqjon
post 27.11.2009, 00:03:09
Post #4





Grupa: Zarejestrowani
Postów: 77
Pomógł: 27
Dołączył: 24.03.2002
Skąd: Tarnów

Ostrzeżenie: (0%)
-----


A może coś w ten deseń:
  1. #include <iostream>
  2.  
  3. template <typename T, unsigned int N>
  4. unsigned int arr_size(const T(&tab)[N])
  5. {
  6. return N;
  7. }
  8.  
  9. int main()
  10. {
  11. char t[5555];
  12. std::cout << arr_size(t);
  13. return 0;
  14. }


--------------------
Zbyszek 'antyqjon' Siciarz

siciarz.net | Aquila DSP C++
Go to the top of the page
+Quote Post
Speedy
post 27.11.2009, 00:26:09
Post #5





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

Ostrzeżenie: (0%)
-----


W C++ i tak musisz podać rozmiar tablicy podczas jej tworzenia, żeby zarezerwować odpowiedni rozmiar pamięci, więc tworzenie takiej funkcji jest bez sensu. Zresztą widać to w przykładzie mojego przedmówcy. Chyba, że mylisz pojęcia i piszesz np. o liście dynamicznej lub czymś w tym stylu.


--------------------
Sygnatura niezgodna z regulaminem.
Go to the top of the page
+Quote Post
blooregard
post 27.11.2009, 00:35:20
Post #6


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Dzięki, @antyqjon.
W tym momencie zadziałała również moja wersja (z sizeof(typ)), z tym, że w teraz traci sens zastosowanie takiej konstrukcji:

  1. #include <iostream>
  2.  
  3. // @antyqjon
  4. template <typename T, unsigned int N> unsigned int arr_size(const T(&tab)[N])
  5. {
  6. return N;
  7. }
  8.  
  9. // moja
  10. template <typename T, unsigned int N>unsigned int array_sizeof(const T (&array)[N]) {
  11. return sizeof(array)/sizeof(T);
  12. }//array_sizeof
  13.  
  14. int main()
  15. {
  16. char t[5555];
  17. std::cout << arr_size(t)<<std::endl;
  18.  
  19. int z[2345];
  20. std::cout<<array_sizeof(z);
  21.  
  22. return 0;
  23. }


wyjście:
Cytat
5555
2345


Cytat
W C++ i tak musisz podać rozmiar tablicy podczas jej tworzenia, żeby zarezerwować odpowiedni rozmiar pamięci, więc tworzenie takiej funkcji jest bez sensu. Zresztą widać to w przykładzie mojego przedmówcy. Chyba, że mylisz pojęcia i piszesz np. o liście dynamicznej lub czymś w tym stylu.


Nie chodzi mi w tym momencie o sam problem sprawdzenia rozmiaru takiej tablicy, bo to można rozwiązać na milion sposobów, lecz zastosowania parametru szablonu jako argumentu dla sizeof().


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 10.05.2025 - 06:06