Práce s ukazateli – dvourozměné pole
Napište program, který bude realizovat tyto činnosti pomocí funkcí (v jiném modulu, než je funkce main):
Naalokování dvourozměrného pole (matice) s inicializací všech prvků na danou hodnotu
výpis (tisk) dvourozměrného pole (matice)
součet matic
odalokování dvourozměrného pole (matice)
Použijte vzor uvedený na konci tohoto souboru.
(kapitola 5.2.24 skript – dvourozměrná pole – základní práce
kapitola 5.2.18 – ukazatel a pole – použití ukazatele pro práci s polem
kapitola 5.2.17 – ukazatel a funkce – jak předávat paměťové odkazy z a do funkce
kapitola 5.2.16 – dynamická paměť – jak získat a vrátit paměťový blok
kapitola 5.2.15 – základní vlastnosti a práce s ukazateli)
Pozn.:
Dvourozměrné pole PPP je typu double **. To znamená, že se jedná o ukazatel na (pole) ukazatel(ů). Každý z ukazatelů v tomto poli dále ukazuje na prvky pole. Pole ukazatelů je možné brát například jako řádky a indexy v poli prvků jako sloupce.
Alokace pole tedy vypadá tak, že naalokujeme pole ukazatelů na double, které má velikost shodnou s počtem sloupců. Pro každý z prvků tohoto pole je dále naalokováno pole prvků double o délce rovné počtu sloupců.
Přístup ke sloupcům je PPP[i], přístup k prvkům pole je PPP[i][j] – jedná se tedy o postupnou indexaci ukazatelů.
(pozn. Zakomentované příkazy měly smysl v DOS. Nevylučuji drobné „testovací“ chyby, které bude nutno ve vzoru upravit. V případě nejasností zkuste dotazy -> tj. Tento soubor se průběžně může doplňovat o odpovědi na otázky kolegů. )
============= vzor ==================
============= matice.cpp ==============
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
int init_matrix (int ***mat,int x, int y,int value)
{
// Dyn. alokace dvourozmern. pole velikosti x,y
// s prvky nastavenymi na hodnotu value
// vraci: 1 kdyz ok, jinak 0
return (1); // Vse je vporadku
}
void print_matrix (int** mat,int x,int y)
{
// Vytisknuti pole mat o velikosti x,y
}
void soucet_matrix (int** mat_a,int** mat_b,int *** mat_c,int x,int y)
{
// Soucet mat_c=mat_a+mat_b o velikosti x,y
}
void disp_matrix (int*** mat,int x, int y)
{
// Dealokace dvourozmer. pole o velikosti x,y
}
============== hlavni.cpp =========================
#define X 5
#define Y 6
int main (void)
{
int **a =NULL;
int **b =NULL;
int **c =NULL;
// clrscr();
// printf("Volna pamet Near Heapu %lu bytu.\nVolna pamet Far Heapu %lu bytu.\n",(unsigned long)coreleft(),(unsigned long)farcoreleft());
printf("\nAlokuju.........\n");
if (init_matrix (&a,X,Y,2)==0) { printf("Nedostatek pameti.\n");return; }
if (init_matrix (&b,X,Y,3)==0) { printf("Nedostatek pameti.\n");return; }
if (init_matrix (&c,X,Y,0)==0) { printf("Nedostatek pameti.\n");return; }
// printf("Volna pamet Near Heapu %lu bytu.\nVolna pamet Far Heapu %lu bytu.\n",(unsigned long)coreleft(),(unsigned long)farcoreleft());
a[0][0]=4; // Pristup do pole
print_matrix (a,X,Y);
print_matrix (b,X,Y);
soucet_matrix(a,b,&c,X,Y);
print_matrix (c,X,Y);
printf("\nDealokuju.........\n");
disp_matrix(&a,X,Y);
disp_matrix(&b,X,Y);
disp_matrix(&c,X,Y);
// printf("Volna pamet Near Heapu %lu bytu.\nVolna pamet Far Heapu %lu bytu.\n",(unsigned long)coreleft(),(unsigned long)farcoreleft());
return 0;
}
=========== konec vzoru ===============
Poslední úpravy 2005-10-15