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

Dynamiczna tabliczka mnożenia

Object Storage Arubacloud
0 głosów
181 wizyt
pytanie zadane 6 kwietnia 2023 w C i C++ przez Zuzan Początkujący (390 p.)
edycja 8 kwietnia 2023 przez Zuzan

Witam, mam do napisania program o następującej treści:

Napisz program, który alokuje pamięć na tablicę dwuwymiarową o wymiarach 10 x 10 liczb typu int. Tablicę należy alokować partiami - jako jednowymiarową tablicę wskaźników (tablica wierszy) oraz 10 tablic liczb int (tablice danych wierszy).

Utworzoną tablicę wypełnij wartościami w taki sposób, aby zapisana w nich była tabliczka mnożenia, a następnie wyświetl ją czytelnie w konsoli tak, aby jedności liczb poszczególnych kolumn tablicy były pod sobą. Zwróć uwagę na justowanie liczb.

Wypełnianie i wyświetlanie ma odbywać się w osobnych pętlach.

W przypadku, kiedy nie uda się zaalokować pamięci program powinien wyświetlić komunikat Failed to allocate memory, zwolnić zaalokowaną wcześniej pamięć i zakończyć działanie z kodem błędu 8.

Przykładowe wyjście:

 1   2   3   4   5   6   7   8   9  10
 2   4   6   8  10  12  14  16  18  20
 3   6   9  12  15  18  21  24  27  30
 4   8  12  16  20  24  28  32  36  40
 5  10  15  20  25  30  35  40  45  50
 6  12  18  24  30  36  42  48  54  60
 7  14  21  28  35  42  49  56  63  70
 8  16  24  32  40  48  56  64  72  80
 9  18  27  36  45  54  63  72  81  90
10  20  30  40  50  60  70  80  90 100

Przykładowa interakcja z programem -- brak pamięci:

Limit sterty: 420 bajtów

Failed to allocate memory⏎

Wyjaśnienie: Wysokość 10 elementów to 10 wskaźników po 8 bajtów każdy (architektura 64 bitowa). Każdy z 10 wierszy ma szerokość 10 kolumn, zatem to 10 bloków po 4 bajty każdy. Stąd 10 x 8 + 10 * 10 * 4 = 480 bajtów sterty wymagane, aby program zadziałał poprawnie. Dostępne 420 bajty są niewystarczające.

Uwagi

  • W programie nie wolno korzystać z operatora []!
  • Pamiętaj, że Dante działa na maszynie 64 bitowej. Oznacza to długość wskaźnika równą 8 bajtom.

 

Działa on poprawnie jednak testy zwracają mi taki błąd: 

PORAŻKA: <strong>Wykryto uszkodzenie pamięci starty. Któraś z poprzednich operacji wyszła po za swój zakres pamięci.</strong>. Opis: Zamazany początek bloku opisującego zasób (RVE_INVALID_MAGIC1)]⏎

Byłabym wdzięczna za wszelkie wskazówki do rozwiązania tego problemu.

2 odpowiedzi

+1 głos
odpowiedź 6 kwietnia 2023 przez tangarr Mędrzec (154,860 p.)

Problem polega na tym, że przy dostępie do komórek zakładasz, że cała tablica jest przetrzymywana w ciągłym bloku pamięci

*(p + i*10 + j) = (i+1) * (j+1)

To raczej powinno być

*(*(tab+i)+j) = (i+1) * (j+1)
komentarz 6 kwietnia 2023 przez tangarr Mędrzec (154,860 p.)

I dodatkowo źle zwalniasz pamięć. Powinno być

free(*(tab+i));

 

komentarz 6 kwietnia 2023 przez Zuzan Początkujący (390 p.)
Dziękuję bardzo
+1 głos
odpowiedź 6 kwietnia 2023 przez mokrowski Mędrzec (155,460 p.)
edycja 6 kwietnia 2023 przez mokrowski

Zacznij od poprawnej alokacji i dealokacji tablicy:

int ** allocate_table(size_t rows, size_t cols) {
	int ** table = (int **) malloc(rows * sizeof(*table));
	if (table == NULL) {
		fprintf(stderr, "Failed to allocate memory\n");
		goto exit_0;
	}
	unsigned row = 0;
	for (; row < rows; ++row) {
		*(table + row) = (int *) malloc(cols * sizeof(**table));
		if (*(table + row) == NULL) {
			fprintf(stderr, "Failed to allocate memory\n");
			goto exit_1;
		}
	}

	return table;

exit_1:
	do {
		free(*(table + row));
	} while(row--);

	free(table);

exit_0:
	return NULL;
}

void free_table(int ** table, size_t rows) {
	for (unsigned row = 0; row < rows; ++row) {
		free(*(table + row));
	}
	free(table);
}

 

komentarz 6 kwietnia 2023 przez Zuzan Początkujący (390 p.)
Dziękuję bardzo

Podobne pytania

0 głosów
1 odpowiedź 1,506 wizyt
+1 głos
2 odpowiedzi 1,883 wizyt
pytanie zadane 30 października 2020 w C i C++ przez ifuknowme555 Początkujący (410 p.)
0 głosów
1 odpowiedź 1,584 wizyt
pytanie zadane 28 marca 2019 w C i C++ przez sznycel Nowicjusz (220 p.)

92,579 zapytań

141,427 odpowiedzi

319,654 komentarzy

61,962 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!

...