Skocz do zawartości

Sprawdzenie liczby wierszy/kolumn tablicy


Harion

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

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ę.

Link do komentarza
Share on other sites

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ł.

Link do komentarza
Share on other sites

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ć.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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;
}
Link do komentarza
Share on other sites

"..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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.