Wpis z mikrobloga

Wracam po długiej przerwie do C++ i mam pytanie:
Tworzę sobie dynamiczną tablice unsigned long long:

unsigned long long* tab = new usigned long long[n]
gdzie n jest intem przekazanym w parametrze. Potem przekazuję tablicę gdzie indziej i tam chcę sobie na szybko od nowa obliczyć jej wielkość korzystając z:

int n = sizeof(tab) / sizeof(unsigned long long)
lecz zawsze otrzymuję tu liczbę 1, nieważne jakiej wielkości stworzyłem tablicę.
Co jest nie tak? Coś pewnie głupiego robię źle, ale jeszcze nie wiem co.

#cpp #naukaprogramowania
  • 11
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@TenAnonToKlopoty: Nie działa, bo działa tylko z typem, który przechowuje wewnątrz w sposób ciągły tylko te elementy. sizeof w C++ daje tylko i wyłącznie stałą wartość na podstawie typu, oznacza to, że nie dowiesz się jakiej wielkości jest polimorficzny obiekt, tak samo, jak ile elementów zostało stworzonych poprzez new[].
  • Odpowiedz
@TenAnonToKlopoty: sizeof(tab) == sizeof(void*) == 8 jeśli kompilujesz pod 64 bity. A sizeof(unsigned long long) to też 8, stąd n == 1. Także, oprócz tab, musisz też przekazać n.
Aby lepiej to zrozumieć możesz też pobawić się tym kodem:

int n = 4;
unsigned long long *tab1 = new unsigned long long[n];
  • Odpowiedz
@TenAnonToKlopoty: tu też nie sugeruję abyś porzucił new i zastosował VLA, bo pewnie w definicji funkcji masz unsigned long long* tab jako parametr, więc w samej funkcji sizeof(tab) == sizeof(void*) == 8, niezaleźnie od tego czy podasz tab1 czy tab2 z mojego przykładu.
Lepiej to widać w tym kawałku kodu:

#include

void f(unsigned
  • Odpowiedz
@TenAnonToKlopoty: podsumowując, jak przekazujesz tablicę gdzie indziej, to musisz także przekazać ile ma elementów i tyle. Sposób, który podałeś do obliczenia ile tablica ma elementów jest nieprawidłowy.
  • Odpowiedz
@TenAnonToKlopoty: Odpowiedzią na twoje smutki jest std::array https://en.cppreference.com/w/cpp/container/array de facto jest to taka tablica która ma być kompatybilna z elementami z STL które operują na konretnerach(vector) i udostępnia ona funkcję size także twój problem rozwiązuje się sam. Ale i tak lepiej użyj vectora. Co do używania VLA, w zeszłym tygodniu ogłoszono sukces, pozbyto się tego badziewia z j---a linuxa.
  • Odpowiedz