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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
| typedef struct s_vector {
float* data;
size_t size;
} t_vector;
// vector->data is 0-indexed
unsigned char vector_add(t_vector* vector, size_t index, float value) {
unsigned char ret;
if ((vector != NULL) && (vector->size > 0) && (index < vector->size)) {
value->data[index] = value;
ret = 1;
} else {
ret = 0;
}
return ret;
}
// vector->data is 0-indexed
unsigned char vector_at(t_vector* vector, size_t index, float* value) {
unsigned char ret;
if ((vector != NULL) && (vector->size > 0) && (index < vector->size)) {
(*value) = (value->data + index);
ret = 1;
} else {
ret = 0;
}
return ret;
}
unsigned char vector_create(t_vector* vector, size_t size) {
unsigned char ret;
if ((vector != NULL) && (size > 0) && (vector->data != NULL)) { // maybe destroy vector here
vector->data = malloc(size * sizeof(float));
if (vector->data != NULL) {
vector->size = size;
ret = 1;
} else {
ret = 0;
}
} else {
ret = 0;
}
return ret;
}
void vector_destroy(t_vector* vector) {
if (vector != NULL) {
if (vector ->data != NULL) { free(vector ->data); }
vector_init(vector);
}
}
unsigned char vector_get_size(t_vector* vector, size_t* size) {
unsigned char ret;
if ((vector != NULL) && (size != NULL)) {
(*size) = vector->size;
ret = 1;
} else {
ret = 0;
}
return ret;
}
void vector_init(t_vector* vector) {
if (vector != NULL) {
vector->data = NULL;
vector->size = 0;
}
}
// example
#define TEST_AND_ADD(INDEX, VALUE, MESG) \
if (has_no_error ) { \
has_no_error = vector_add(&vector, INDEX, VALUE)); \
} else { \
/* error - MESG */ \
}
t_vector vector;
vector_init(&vector);
if ( vector_create(&vector, 4) ) {
size_t index, vector_size;
unsigned char has_no_error;
has_no_error = vector_add(&vector, 0, 1.2));
TEST_AND_ADD(1, 2.5, "vector_add index 0");
TEST_AND_ADD(2, 15.8, "vector_add index 1");
TEST_AND_ADD(3, 75.0, "vector_add index 2");
if (has_no_error ) {
has_no_error = vector_get_size(&vector, &vector_size);
} else {
/* error - vector_add index 3 */
}
if ((has_no_error ) && (vector_size > 0)) {
float value;
for(index=0; index < vector_size; ++index) {
if (vector_at(&vector, index, &float value) {
printf("%02d: %f", (index + 1), value);
} else {
printf("%02d: error", (index + 1));
}
}
} else {
/* error - get_size or size == 0 */ \
}
vector_destroy(&vector);
} else {
/* error - vector_create */ \
} |
Partager