Wpis z mikrobloga

Hejko, cplusplusowe świry. Nie wiem jak Wy to lubicie, ale pomagam bratanicy z LO w zadaniach z C++ i mam pytanko.

pseudo kodem:

int wielkoscTablicy = sizeof(jakasTablica)/sizeof(jakasTablica[0]);
Może mi ktoś wyjasnić dlaczego wielkość tablicy wyciąga się w taki dziwny sposób? Ja jestem #csharp king, więc proszę bez śmieszkowania. Sam sizeOf pokazuje mi wielkość x 4


  • 21
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@WielkiElektronig: to jest slaby pomysl, dziala tylko na tablicach statycznych i w miejscu ich deklaracji, jak przekazesz do funkcji to nie dziala. Podastawa w c++, albo przekazujesz wielkosc tablicy, albo uzywasz std::vector. To co jest pokazane to nie do konca dziala poprawnie.
  • Odpowiedz
bo dzielisz rozmiar tablicy w pamieci przez rozmiar jednej komorki w pamieci


@hanabira: ach, uroki niskopoziomowego (można tak w ogóle o C++ powiedzieć?) programowania

Ale dzięki, to mi rozjaśniło.

Jak najlepiej taki Array.Length znaleźć?
  • Odpowiedz
via Wykop Mobilny (Android)
  • 3
@WielkiElektronig: sizeof zwraca rozmiar tablicy w bajtach, int ma rozmiar 4 bajtów, tablica 10 elementów a typu int ma bajtów 40 i tyle też zwrócić sizeof, więc dzielimy go przez rozmiar elementu (4 bajty) i mamy wielkość tablicy, czyli 10
  • Odpowiedz
@WielkiElektronig: nie - zadziala w tablicy statycznej, ktora jest w tym samym miejscu, jak przekazesz juz do funkcji to tam nie zadziala - tam juz widziany jest tylko wskaznik. Tak wiec bedziesz mial wielkosc wskaznika (w zaleznosci od systemu 2, 4, 8) / przez wielkosc danych.

jak uzyjesz np std::vector - to masz tam metody do wielkosci.
  • Odpowiedz
A ogólnie to uczenie C++ w LO powinno być traktowane jako znęcanie się.


@Hauleth: Pełna zgoda. Słaby wybór na naukę algorytmów, chociaż jak ja byłem na studiach, to rozgrzewka była w Pascalu i potem przez to były problemy z C. Ale fakt, że nauka C++ bez chociaż spojrzenia do C, czy assemblera, bez znajomości struktur danych czy zrozumienia jak komputer to interpretuje, to chory pomysł. Zapisują coś i nie wiedzą
  • Odpowiedz
@Defined: w C tak jak w C++ tez zadziala tylko czasami. Metoda slaba i raczej lepiej jej nie uzywac. Do takich celow, mozesz uzyc const-a z wiekoscia tablicy, bo i tak tylko na takich tablicach metoda zadziala. Ktos kto promuje taka metode i to dla poczatkujacych moim zdaniem nadaje sie na chloste i to nie zaleznie, czy w C czy w C++, bo uzywane bez znania szczegolow prowadzic bedzie do
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@WielkiElektronig: przeciez proste apki w c# czy nawet jakieś wpfy czy uwpy to miód malina a koleś im wrzuca czysty C++ - w tym wieku dzieciaki jara jak im coś działa a nie jakieś tablice i inne diabły których nie rozumieją
  • Odpowiedz
@Koliat: to nie jest czysty c++, to sa zle nawyki wymyslone przez kogos, do jakiegos usprawnienia konkretnego kodu, gdzie to ma prawo sie sprawdzic, gdzie deklaruje zapewne tablice dopisuja w trakcie pisania jej elementy i deklarujac w specyficzny sposob. Ale do ogolnego nauczania to jest "myk" z ktorego nie nalezy korzystac!
  • Odpowiedz
@WielkiElektronig: No cóż, tak to się robiło w C, jest to wielkość całej tablicy w bajtach podzielona przez wielkość rozmiaru. Niestety jak podasz wskaźnik, to po prostu obliczy głupotę.
A jako że nie uczą w szkołach nowoczesnego C++ to nie dowiesz się, że w C++17 służy do tego std::size, które to na zasadzie szablonu przypasowującego rozmiar tablicy do definicji typu więc nie ma powodu do pomyłki.
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@WielkiElektronig: co do Array.Length to w c++ tablice są mniej obudowane, bo mają zajmować jak najmniej pamięci, więc nie ma tu dosłownie nic.
W dodatku wyróżnia się dwa rodzaje: statyczne i dynamiczne alokowaną. Ty pokazałeś przykład statycznie alokowanej tablicy i twoje sprytne rozwiązanie jest ok na wymagania licealne. W dzisiejszych czasach używa się takich oszczędnych tablic tylko tam gdzie występuje taka potrzeba.
Jeżeli chcesz znać wielkość to najlepiej przechowuj zmienną
  • Odpowiedz
Jak najlepiej taki Array.Length znaleźć?


@WielkiElektronig: Jeśli używasz kolekcji typu vector czy array to jest dość podobnie jak w twoim C#. Ale jak lecą gołymi alokacjami to tak prosto nie ma. Jak alokujesz tablicę dynamicznie jakimś new int[size] to sam sobie ten size musisz pamiętać i nie ma zmiłuj, bo taka operacja po prostu alokuje pewien obszar pamięci i nie ma tam żadnej semantyki że to jest jakaś tablica.
  • Odpowiedz