• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablica dwuwymiarowa

Object Storage Arubacloud
0 głosów
289 wizyt
pytanie zadane 7 grudnia 2022 w C i C++ przez Janchess Początkujący (480 p.)
edycja 7 grudnia 2022 przez Janchess

Dlaczego w takiej sytuacji otrzymuje komunikat "t": brak indeksu dolnego ? Co robię nie tak ?

void wypelnijTablice(int t[][], int m, int n, int a);

1 odpowiedź

+2 głosów
odpowiedź 7 grudnia 2022 przez Jaaqob Stępień Użytkownik (760 p.)
Opisz dokładniej. Użyj konferencji VLA, czyli najpierw długość tablicy potem wskaźnik do tablicy. Chyba że piszesz w C++ to wtedy nie powinieneś używać tablic tylko wektorów, a długość jest w sektorze.
komentarz 7 grudnia 2022 przez Janchess Początkujący (480 p.)
Pisze w C i generalnie zadanie zakłada, że nie znam jeszcze wskaźników
komentarz 7 grudnia 2022 przez Jaaqob Stępień Użytkownik (760 p.)

Tym bardziej powinieneś użyć konwencji VLA. Twoja deklaracja jest nie zrozumiała, bo funkcja przyjmuje wskaźnik na wskaźnik na liczbę całkowitą i trzy liczby całkowite.

void wypelnijTablice(int m, int n, int t[m][n], int a);

Jeśli dobrze rozumiem twoje zamiar to tak wygląda twoja deklaracja w konwencji VLA. Jest to bardzo zrozumiałe dla ludzi i kompilatorów z obsługą C99 (polecam Clang ewentualnie GCC). Może to rozwiązać twój powinien..

komentarz 7 grudnia 2022 przez Janchess Początkujący (480 p.)

Jestem trochę zielony. Mógłbyś uprościć czym jest konwencja VLA ? 

void wypelnijTablice(int m, int n, int t[m][n], int a);

To niestety nie przechodzi, ponieważ pierwszym argumentem ma być tablica.

komentarz 7 grudnia 2022 przez Jaaqob Stępień Użytkownik (760 p.)
VLA to tablice zmiennej długości wprowadzone w C99 i wczesnej w rozszerzeniach GNU. Konwencja VLA to pisanie kodu tak żeby myślę było do funkcji przekazać VLA.

Podaj treść polecenia.
komentarz 7 grudnia 2022 przez Janchess Początkujący (480 p.)
Funkcja wypelnijTablice, która wypełnia tablicę podaną w czwartym argumencie wartością. Mam posługiwać się wyłącznie tablicami statycznymi. To jest całe polecenie do tej funkcji. Mam zrobić taką funkcje, która będzie wypełniała tablice dwuwymiarową wartością podaną w czwartym argumencie.
1
komentarz 7 grudnia 2022 przez Jaaqob Stępień Użytkownik (760 p.)
Polecanie nie określa czy wskaźnik ma tablice na być pierwszym czy trzecim argumentem. Podejście VLA działa też przy tablicach statycznych. Standardowo dla tablic statycznych określa się ich wymiary w definicji funkcji, co jest bez sensu gdy funkcja ma przyjmować 3 parametry. Możesz rozpłaszczyć tablice statyczne, ale VLA jest bardziej eleganckie. Użyj nagłówka który napisałem, chyba że masz to na ocenę do szkoły dla nauczyciela który utknął 24 lata temu.
komentarz 8 grudnia 2022 przez Oscar Nałogowiec (29,320 p.)
Tablica wielowymiarowa (dla uproszczenia dwuwymiarowa) to tablica tablic (jednowymiarowych). Ponieważ indeksowanie tablicy to przesunięcie wskaźnika o wielkość elementu, to ta wielkość musi być znana. Deklarując parametr tablicowy trzeba podać to tak, by znany był rozmiar elementu tablicy a więc jeśli to tablica dwuwymiarowa musi być znany jeden z rozmiarów. Kompilator musi wiedzieć jak interpretować tab[1] - jako wskaźnik na drugi rządek tablicy.

Inne podejście to zbudowanie tablicy dwuwymiarowej jako jawnej tablicy wskaźników do poszczególnych wierszy, które same są tablicami 1-wymiarowymi. Ale skoro wskaźników jeszcze nie było, to odpada.
komentarz 8 grudnia 2022 przez Jaaqob Stępień Użytkownik (760 p.)
edycja 8 grudnia 2022 przez Jaaqob Stępień

Czytaj cała dyskusję (cyce że ta odpowiedz nie jest kierowana do mnie). Przy konwencji VLA kompilator zna oba wymiary. Patrz kod niżej.

void wypelnijTablice(int m, int n, int t[m][n], int a);

To co proponujesz to jest statyczne określenie wymiaru tablicy w kodzie funkcji co jest bez sensu, jeśli funkcja przyjmuje oba wymiary jako parametry. Chyba że w kodzie będziemy traktować tablice j jako płaską co jest bardzo nie intuicyjne i odradzanie w standardzie C. Nie chcę tumaczyć całego działania tablic w języku C bez wskaźników, bo uważam to za nie musiał. Konwencja VLA rozwiązuje wspominany problem, co prawda nie tłumaczy go, ale na to przyjdzie czas przy wskaźnikach.

komentarz 8 grudnia 2022 przez Janchess Początkujący (480 p.)

Chce napisać dwie funkcję, która wypełni mi tablice oraz wypisze ją na ekran. Zrobiłem zatem coś takiego i nie wiem co dalej począć z tymi tablicami. Jeżeli wpisze t[][N] to problem znika, ale pozostaje mi deklaracja int tab[][] w której pojawia się błąd. Dodam, że nie mogę zmienić kolejności argumentów, ani używać wskaźników.

#include <stdio.h>
#define M 10
#define N 10

void wypelnijtab(int t[][], int w, int k, int a);
void wypisztab(int t[][], int w, int k);

int main() {
	int tab[][];
	wypelnijtab(tab, M, N, 1);
	wypisztab(tab, M, N);

	return 0;
}
void wypelnijtab(int t[][], int w, int k, int a) {
	for (int i = 0; i < w; i++) {
		for (int j = 0; j < k; j++) {
			t[i][j] = a;
		}
	}
}
void wypisztab(int t[][], int w, int k) {
	for (int i = 0; i < w; i++) {
		for (int j = 0; j < k; j++) {
			printf("%d", t[i][j]);
		}
		printf("\n");
	}
}

 

komentarz 8 grudnia 2022 przez j23 Mędrzec (194,920 p.)
Przekazując tablicę dwuwymiarową w parametrze funkcji musisz podać jej szerokość, bo inaczej kompilator nie jest wstanie wygenerować kodu (musi wiedzieć przy indeksowaniu, o ile bajtów ma przeskakiwać przy indeksowaniu wierszy).
komentarz 8 grudnia 2022 przez Janchess Początkujący (480 p.)
czyli t[][N] gdzie N - to liczba kolumn załatwi sprawę jeśli chodzi o parametr funkcji ?
komentarz 8 grudnia 2022 przez j23 Mędrzec (194,920 p.)

Tak, tylko N musi być stała.

komentarz 8 grudnia 2022 przez Janchess Początkujący (480 p.)
Ok, jest w porządku. Dziękuje.

Podobne pytania

0 głosów
1 odpowiedź 293 wizyt
+1 głos
4 odpowiedzi 471 wizyt
pytanie zadane 1 lutego 2021 w C i C++ przez forok Nowicjusz (160 p.)
0 głosów
1 odpowiedź 188 wizyt

92,620 zapytań

141,474 odpowiedzi

319,814 komentarzy

62,004 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...