File: Stare vježbe/vjezbe10/63a__malloc_2Dpolja.c

  1. /*
  2.   63a__malloc_2Dpolja.c
  3.   Rad s dinamicki alociranim dvodimenzionalnim poljima -- 1. metoda,
  4.   Upoznavanje kljucne rijeci typedef
  5.   -----
  6.   Ova metoda koristi identifikaciju dvodimenzionalnog polja s
  7.   pokazivacem na jednodimenzionalno polje od MAXSTUP elemenata.
  8.   Nezgodna strana ovakvog pristupa jest to sto nam da bismo mogli
  9.   alocirati memoriju za dvodimenzionalno polje velicina retka (odnosno
  10.   maksimalni broj stupaca) mora biti poznata prilikom compiliranja.
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <malloc.h>
  16.  
  17. #define MAXSTUP 20
  18.  
  19. /* Naredba typedef sluzi za definiciju novog tipa. Obicno ju koristimo
  20.   kako bismo uveli pokratu za neki slozeni tip podatka.
  21.   Sintaksa: typedef slozeni_tip pokrata
  22.   Slijedecom linijom redak ce postati tip koji predstavlja jednodimenzionalno
  23.   polje od MAXSTUP elemenata. */
  24. typedef float redak[MAXSTUP];
  25.  
  26. void check(void* p) {
  27. if(p == NULL) {
  28. printf("Greska u alokaciji memorije!\n");
  29. exit(1);
  30. }
  31. }
  32.  
  33. void unos(redak* A, int m, int n) {
  34. int i, j;
  35. for(i=0; i<m; i++)
  36. for(j=0; j<n; j++) {
  37. printf("A[%d][%d]=", i, j);
  38. scanf("%f", &A[i][j]);
  39. }
  40. }
  41.  
  42. void ispis(redak* A, int m, int n) {
  43. int i, j;
  44. for(i=0; i<m; i++) {
  45. for(j=0; j<n; j++)
  46. printf("%.2f ", A[i][j]);
  47. printf("\n");
  48. }
  49. }
  50.  
  51. int main() {
  52. int m, n, i;
  53. /* Deklariramo dvodimenzionalno polje kao pokazivac na redak, odnosno
  54.   pokazivac na jednodimenzionalno polje od MAXSTUP elemenata. */
  55. redak* A;
  56.  
  57. printf("Unesite broj redaka matrice A: ");
  58. scanf("%d", &m);
  59. printf("Unesite broj stupaca matrice A: ");
  60. scanf("%d", &n);
  61.  
  62. /* Alociramo memoriju za matricu A s m redaka i unaprijed odredjenih
  63.   MAXSTUP stupaca */
  64. A = (redak*) malloc(m*MAXSTUP*sizeof(float));
  65. check(A);
  66.  
  67. for(i=0; i<m; i++)
  68. printf("Adresa %d. retka: %d\n", i, A[i]);
  69.  
  70. printf("\n");
  71. unos(A, m, n);
  72. printf("\n");
  73. ispis(A, m, n);
  74.  
  75. /* Oslobadjanje alocirane memorije */
  76. free(A);
  77.  
  78. return 0;
  79. }
  80.