-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paths_matrix.c
106 lines (94 loc) · 2.15 KB
/
s_matrix.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
* MagicSQ - Magic Square Filler.
* (c) 2000 by Vasian CEPA. All rights reserved.
*
*/
#include "s_matrix.h"
/*****************************************
Start of S_MATRIX class member functions:
*****************************************/
/* private methods */
static void setSize(S_MATRIX* , int);
#ifdef DEBUG
static void checkBound(S_MATRIX* , int, int);
#endif
/* constructor */
S_MATRIX* create_S_MATRIX(int dimension){
S_MATRIX* m = NULL;
if(dimension < 1) return NULL;
m = (S_MATRIX*)malloc(sizeof(S_MATRIX));
if(m == NULL) return m;
m->getElement = &getElement;
m->setElement = &setElement;
m->getSize = &getSize;
m->print = &print;
m->m = (int*)malloc(dimension * dimension * sizeof(int));
if(m->m == NULL){
setSize(m,0);
puts("Oops! Allocation of memory failed!");
} else{
setSize(m, dimension);
memset((void*)m->m, 0, dimension * dimension * sizeof(int));
}
return m;
}
/* destructor */
void destroy_S_MATRIX(S_MATRIX* m){
if(m == NULL) return;
if(m->getSize(m) != 0)
free((void*)m->m);
free((void*)m);
}
int getElement(S_MATRIX* m, int i, int j){
#ifdef DEBUG
checkBound(m, i, j);
#endif
return *(m->m + i*(m->getSize(m)) + j);
}
void setElement(S_MATRIX* m, int i, int j, int value){
int p = 0;
#ifdef DEBUG
checkBound(m, i, j);
#endif
p = (i * m->getSize(m) + j);
*( m->m + p) = value;
}
/* it is an integer square matrix */
int getSize(S_MATRIX* m){
return m->n;
}
/* private */
static void setSize(S_MATRIX* m, int n){
m->n = n;
}
#ifdef DEBUG
/* private */
static void checkBound(S_MATRIX* m, int i, int j){
int ib = (i<0 || i > m->n - 1) ? 0 : 1;
int jb = (i<0 || i > m->n - 1) ? 0 : 1;
if(!ib || !jb){
fprintf(stderr,"Array Index Out of Bounds! (%d, %d)", i, j);
destroy_S_MATRIX(m);
exit(2);
}
}
#endif
void print(S_MATRIX* m){
int i,j;
int n = m->getSize(m);
fprintf(stderr,"MagicSQ - (c) 2000 by Vasian CEPA - \n");
for(i = 0; i<n; i++){
printf("\n");
for(j=0; j< n; j++){
char *f;
if(j == n - 1)
f = "%d";
else
f = "%d,";
printf(f, m->getElement(m,i,j));
}
}
}
/*************************************
END of S_MATRIX class implementation.
*************************************/