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