Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Rozmiar tablicy dwuwymiarowej [ANSI C]

Kubbaz 30 Cze 2011 12:18 2777 8
  • #1 30 Cze 2011 12:18
    Kubbaz
    Poziom 26  

    Witam wszystkich Elektrodowiczów!

    Jak zmierzyć rozmiar dwuwymiarowej tablicy, w której zdefiniowano 2 kolumny, natomiast nie zdefiniowano liczby wierszy, bo wie wiadomo ile ona będzie miała tych wierszy (na pewno nie więcej niż ok. 500). Zrobiłem to początkowo przez "sizeof (Tablica);", ale funkcja ta zwraca zawsze wartość 4 bajtów, domyślam się że liczy ona to w sposób następujący:
    (2 kolumny->) 2 * 16 bitów = 32 bity => 32 bity/8 bitów = 4 bajty, a nie jest to osiągnięcie zamierzonego celu. Potrzebuje znać rozmiar tablicy zdeklarowanej wcześniej po to, aby wiedzieć ile razy wykonać pętlę for - ile razy iterować inną tablicę do której wpisuję dane.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 8
  • #2 30 Cze 2011 13:15
    szelus
    Specjalista - Mikrokontrolery

    Jeżeli musisz przekazywać tablicę jako argument, to przekaż także jej rozmiar jako argument. sizeof(Tablica) dla globalnej zmiennej Tablica (tej wypełnionej) zwróci poprawny rozmiar. Ale argument funkcji maskuje głobalna zmienną. Rozmiar argumentu będzie zawsze 4, bo tak jest zdefiniowany.

    0
  • Pomocny post
    #4 30 Cze 2011 15:35
    szelus
    Specjalista - Mikrokontrolery

    Nie da rady. Zwróć uwagę, że w zasadzie typ argumentu funkcji nie jest taki sam, jak typ zmiennej globalnej (tablica), a tylko kompatybilny (de-facto wskaźnik na tablicę, chociaż to taka namiastka referencji w C).
    Jedynie możesz "zenkapsulować" obiekt, tzn. stworzyć globalną strukturę ze wskaźnikiem na tablicę i rozmiarem i coś takiego przekazać do funkcji.

    0
  • #5 30 Cze 2011 17:11
    przemo_wielki
    Poziom 23  

    A spróbuj:

    TablicaSize = sizeof (Tablica) / sizeof*(Tablica);

    //zbyt pobieżnie przeczytałem Twój post, przykład powyżej nie zadziała w końcu bazujesz na zmiennej lokalnej (stąd stały rozmiar 4b), @szelus ma 100% racji

    0
  • #6 01 Lip 2011 01:03
    sebap123
    Poziom 8  

    Według mnie nie możesz ze względu na ograniczenia języka przekazując do funkcji tablicę sprawdzić jej rozmiar. Tak na prawdę, nie przekazujesz tablicy, a jedynie wskaźnik na nią - w tym wypadku ma on strukturę *(*(Tablica)+2) (na 98% jestem tego pewien) dlatego rozmiar tablicy to tak na prawdę jest rozmiar wskaźnika na nią. Możesz co najwyżej spróbować, ale nie mam pomysłu do końca jak i czy w ogóle to ruszy - iterować tablicę do wyczerpania się elementów i zliczać je do zmiennej pomocniczej.

    EDIT:
    Po chwili namysłu dochodzę do wniosku, że to chyba nie jest możliwe, bo w końcu wylecisz za tablice i będziesz skakał po pamięci. Tak więc raczej rozmiar tablicy musisz przekazać. A najlepiej jak nie wiesz ile ma być elementów to robić wszystko na wskaźnikach i po pobierać tylko rozmiar od użytkownika, czy tez jakiegoś pliku konfiguracyjnego i funkcją malloc alokować na nią pamieć. Tak jest moja opinia.

    0
  • #7 01 Lip 2011 10:30
    winuser2
    Poziom 17  

    Panowie zamiast rzucać domysłami zajrzelibyście do jakiejś książki na temat języka C.

    To co próbujesz zrobić, zwraca ci rozmiar wskaźnika na twojej platformie (czyli 4 bajty). Nie ma możliwości sprawdzenia rozmiaru tablicy wskaźników przy użyciu sizeof. Możesz albo utworzyć strukturę danych która będzie przechowywała wskaźnik na tablicę a obok zmienną przechowującą rozmiar albo przy tworzeniu użyć innej zmiennej do zapamiętania rozmiaru.

    0
  • #8 01 Lip 2011 10:38
    sebap123
    Poziom 8  

    To coś takiego już zostało przez mnie powiedziane. No może ja nie powiedziałem tylko o strukturze. Tak więc powtarzasz się.

    0
  • #9 01 Lip 2011 11:43
    winuser2
    Poziom 17  

    Cytat:
    iterować tablicę do wyczerpania się elementów i zliczać je do zmiennej pomocniczej.


    Nie wiem jak rozumiesz pojęcie "aż do wyczerpania elementów", bo on może iterować długo długo, jeśli tylko chce odczytywać elementy i tak naprawdę nie będzie wiedział kiedy jest ostatni element. Ba już dawno będzie poza zakresem i nawet tego nie zauważy.

    0