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):

Pro realizaci použijte (doplňte) vzor uvedený na konci tohoto souboru. Hlavičkový soubor vytvořte sami.



(související kapitoly skript:

kapitola 5.2.24 – 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 1D pole. Pole ukazatelů je možné brát například jako pole ukazatelů na řádky (přístupné pomocí prvního indexu) a druhé indexy jako prvky v poli doublů jako pozice sloupců. Samozřejmě lze představit i „obrácenou“ variantu – zaměnit v předešlém sloupce<=>řádky.

Alokace pole tedy vypadá tak, že naalokujeme pole ukazatelů na double, které má velikost shodnou s počtem řádků/sloupců. Pro každý z prvků tohoto pole je dále naalokováno pole prvků double o délce rovné počtu sloupců/řádků.

Přístup k řádkům je PPP[i], přístup k prvkům pole (sloupci v daném řádku) je PPP[i][j] – jedná se tedy o postupnou indexaci ukazatelů.

(pozn. Zakomentované příkazy příkladu měly smysl v DOS. V příkladu mohou být drobné „testovací“ chyby, které bude nutno ve vzoru upravit.

Pro procvičení můžete nejprve zkusit překládat soubory s názvy matice.c a hlavni.c a potom v novém projektu s příponami cpp. Prostředí podle přípony volí typ překladače C/C++. Ozřejmili byste si tedy některé rozdíly mezi C a C++

V případě nejasností zkuste dotazy. )

============= 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
}

void transp(int ***mat) 
{
 // transpozice matice
}

============== 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);
  transp(&c); 
  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í změna 2007-09-03