Haifisch7734

Macierze POSIX

Nov 26th, 2014
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.62 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <fcntl.h>
  4. #include <sys/mman.h>
  5. #include <sys/stat.h>
  6. #include <sys/types.h>
  7. #include <unistd.h>
  8.  
  9. typedef struct {
  10.     int mat_size;
  11.     int submat_size;
  12.     int* submatA;
  13.     int* submatB;
  14.     int* submatC;
  15. } matrix_struct;
  16.  
  17. int* createMatrix(char *nazwa, int size) {
  18.     int *matrix = NULL;
  19.     int fd;
  20.     if ((fd = shm_open(nazwa, O_RDWR | O_CREAT, 0666)) == -1)
  21.         perror("Błąd otwarcia SHM");
  22.     if ((ftruncate(fd, size)) == -1)
  23.         perror("Błąd ustalenia wielkości SHM");
  24.     if ((matrix = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED)
  25.         perror("Błąd mapowania pamięci");
  26.     close(fd);
  27.     return matrix;
  28. }
  29.  
  30. void loadMatrix(int fd, int msize, int* matrix) {
  31.     lseek(fd, 1, SEEK_CUR);
  32.     int i, j, n;
  33.     for (i = 0; i < msize; i++)
  34.         for (j = 0; j < msize; j++) {
  35.             read(fd, &n, 1);
  36.             n = n - 48;
  37.             matrix[msize * i + j] = n;
  38.             lseek(fd, 1, SEEK_CUR);
  39.         }
  40. }
  41.  
  42. matrix_struct loadMatrixes(char* filename) {
  43.     matrix_struct matrix;
  44.     matrix.mat_size = 0;
  45.     int size, i, j;
  46.     int fd = open(filename,O_RDONLY);
  47.     read(fd, &matrix.mat_size, 1);
  48.     matrix.mat_size = matrix.mat_size - 48;
  49.     lseek(fd, 1, SEEK_CUR);
  50.    
  51.     size = matrix.mat_size * matrix.mat_size * sizeof(int);
  52.    
  53.     matrix.submatA = createMatrix("/shm_matrix1", size);
  54.     matrix.submatB = createMatrix("/shm_matrix2", size);
  55.     matrix.submatC = createMatrix("/shm_matrix3", size);
  56.     loadMatrix(fd, matrix.mat_size, matrix.submatA);
  57.     loadMatrix(fd, matrix.mat_size, matrix.submatB);
  58.     for (i = 0; i < matrix.mat_size; i++)
  59.         for (j = 0; j < matrix.mat_size; j++)
  60.             matrix.submatC[matrix.mat_size * i + j] = 0;
  61.     return matrix;
  62. }
  63.  
  64.  
  65. void showMatrix(int *matrix, int msize, int mvo, int mho, int size) {
  66.     int i, j;
  67.  
  68.     for (i = mvo; i < mvo + size; i++) {
  69.         for (j = mho; j < mho + size; j++)
  70.             printf("[%3d] ", matrix[msize * i + j]);
  71.         puts("");
  72.     }
  73.     puts("");
  74. }
  75.  
  76. void multiplyMatrixes(matrix_struct matrix) {
  77.     int i, j, k, tmp;
  78.    
  79.     for (i = 0; i < matrix.submat_size; i++)
  80.         for (j = 0; j < matrix.submat_size; j++) {
  81.             tmp = 0;
  82.             for (k = 0; k < matrix.submat_size; k++)
  83.                 tmp += matrix.submatA[matrix.mat_size * i + k] * matrix.submatB[matrix.mat_size * k + j];
  84.             matrix.submatC[matrix.mat_size * i + j] = tmp;
  85.         }
  86. }
  87.  
  88. int main (int argc, char* argv[]) {
  89.     matrix_struct matrix = loadMatrixes("mac.txt");
  90.    
  91.     matrix.submat_size = matrix.mat_size;
  92.     multiplyMatrixes(matrix);
  93.     showMatrix(matrix.submatA, matrix.mat_size, 0, 0, matrix.mat_size);
  94.     showMatrix(matrix.submatB, matrix.mat_size, 0, 0, matrix.mat_size);
  95.     showMatrix(matrix.submatC, matrix.mat_size, 0, 0, matrix.mat_size);
  96.    
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment