Skocz do zawartości

Sprawdzenie liczby wierszy/kolumn tablicy


Pomocna odpowiedź

Napisano

Witajcie, mam do was takie pytanko.

Dajmy przykład, ze mam tablice do której wpisuje jakieś wartości do kolumn i wierszy.

Teraz chciałbym sprawdzić programowo ile ta tablica ma kolumn i wierszy, i zapisać wartość do zmiennej z tą liczbą. Program ma działać na atmedze, a zmienna ma mi posłużyć do wartości którą wprowadzę w pętlę for. Pozdrawiam

No ale przecież już sam zapis do tablicy 2-wymiarowej wymaga wiedzy o liczbie kolumn lub wierszy. W C odpowiednie obliczenia podczas dostępu do tablicy robi za Ciebie kompilator. Rozmiar musi być znany z góry i dlatego podajesz wszystkie wymiary w deklaracji zmiennej. Lepiej powiedz wprost co chcesz zrobić naprawdę.

No ale przecież już sam zapis do tablicy 2-wymiarowej wymaga wiedzy o liczbie kolumn lub wierszy. W C odpowiednie obliczenia podczas dostępu do tablicy robi za Ciebie kompilator. Rozmiar musi być znany z góry i dlatego podajesz wszystkie wymiary w deklaracji zmiennej. Lepiej powiedz wprost co chcesz zrobić naprawdę.

Program ma złączyć kilka tablic o takiej samej ilości wierszy w jedną z większą ilością kolumn.

Pętla for będzie potem wpisywać pokolei wartości z tablicy do zmiennych, a ma się wykonać tyle razy ile będzie kolumn tej nowej utworzonej tablicy, dlatego muszę jakoś sprawdzic ile kolumn ona będzie posiadać gdyż sam nie będę tego z góry zakładał.

Dziś miałem podobny problem. Lata kodzenia w językach wysokiego poziomu robią człowiekowi wodę z mózgu i gdy się wraca do języków niskopoziomowych, to mamy zimny kubeł wody na głowę.

C generalnie gubi informację o kolumnach i rzędach. int tablica[3][4]; zostanie zamieniona na ciurek 12 intów i nie masz możliwości sprawdzenia czy to było [3][4], [4][3] czy może [2][6]. Musisz sobie to gdzieś na boku zapisywać.

Problem prawdopodobnie powinien być rozwiązywany inaczej i wymiary tablicy należałoby trzymać w zmiennych, albo samej tablicy np. Wykorzystując strukturę lub klasę.

Ale też nie do końca prawdą jest, że C gubi informację o kolumnach i rzędach.

Tablice dwuwymiarowe w C są to tablice tablic. Pisząc:

int tablica[3][4];

Dostajemy więc 3 elementową tablicę, 4-elementowych tablic.

Możemy odczytać ile bajtów pamięci zajmuje tablica, albo inna struktura np.

int x;

sizeof(x) // 4 (załóżmy że kompilujemy na 32 bitowej maszynie)

int y[4];

sizeof(y) // 16 (4 * sizeof(int))

int tablica[3][4];

sizeof(tablica) // 48 = 3 * 16)

Mając takie informacje możemy w miarę łatwo "odzyskać" dane o wymiarach tablicy. Poniżej przykładowy kod:

include <stdio.h>

int main(int argc, char* argv[])
{
   char tab[3][4];

   printf("%d\n", sizeof(tab));  // 48
   printf("%d\n", sizeof(tab) / sizeof(tab[0])); // 3 
   printf("%d\n", sizeof(tab[0]) / sizeof(tab[0][0])); // 4

   return 0;
}

"..ma się wykonać tyle razy ile będzie kolumn tej nowej utworzonej tablicy.."

Kiedy będziesz tę tablicę tworzyć? Przecież już w jej deklaracji musisz podać wymiar więc już wtedy musisz go znać 😐

Można sobie wyobrazić utworzenie wirtualnej tablicy n-wymiarowej np. w pamięci przyznawanej dynamicznie (na stercie), ale będzie to wymagało zrobienia kompletu podstawowych funkcji (metod) dostępu do niej bez wykorzystania typowych mechanizmów języka. Np. zamiast prostego:

x = tablica_statyczna[4][7];

korzystającego (niejawnie) z mnożenia i podwójnego dodawania będziesz musiał użyć:

x = odczytaj_tablicę(wskaznik_poczatku, index_row, index_col, size_row, size_col);

Taka funkcja powinna na bieżąco obliczać położenie komórki [index_row][index_col] na podstawie otrzymanych rozmiarów tablicy size_row i size_col oraz adresu bazowego otrzymanego z funkcji żądającej przydziału pamięci na stercie malloc(). Teraz wystarczy znać wyliczone w trakcie działania programu maksymalne rozmiary nowej tablicy, pomnożyć je przez siebie (i przez wielkość typu danych) żeby mieć ilość pamięci potrzebnej do zmieszczenia nowej tablicy, zaalokować tę pamięć malloc'em i otrzymany wskaźnik zapamiętać jako bazę (wskaźnik początku) położenia tablicy.

To wydaje się proste, choć mam wrażenie, że wszystko co planujesz da się zrobić bez upiornego przepisywania wielu małych tablic z jednego miejsca w drugie.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...