Consider an implementation of n-dimensional vectors using the structure
typedef struct {int size; double* data;} vector;
Implement a set of functions to deal with these vectors.
The declarations must be kept in the header file vector.h,
#ifndef HAVE_VECTOR_H /* for multiple includes */
#define HAVE_VECTOR_H
typedef struct {int size; double* data;} vector;
vector* vector_alloc (int n); /* allocates memory for size-n vector */
void vector_free (vector* v); /* frees memory */
void vector_set (vector* v, int i, double value); /* v_i ← value */;
double vector_get (vector* v, int i); /* returns v_i */
double vector_dot_product (vector* u, vector* v); /* returns dot-product */
/* optional */
void vector_print (char* s, vector* v); /* prints s and then vector */
void vector_set_zero (vector* v); /* all elements ← 0 */
int vector_equal (vector* a, vector* b); /* 1, if equal, 0 otherwise */
void vector_add (vector* a, vector* b); /* a_i ← a_i + b_i */
void vector_sub (vector* a, vector* b); /* a_i ← a_i - b_i */
void vector_scale (vector* a, double x); /* a_i ← x*a_i */
/* */
#endif
The implementations of the functions must be in the file
vector.c. You should #include"vector.h"
in vector.c to allow the compiler to check the declarations.
Like this,
#include<stdio.h>
#include<assert.h>
#include"vector.h"
vector* vector_alloc(int n){
vector* v = malloc(sizeof(vector));
(*v).size = n;
(*v).data = malloc(n*sizeof(double));
if( v==NULL ) fprintf(stderr,"error in vector_alloc\n");
return v;
}
void vector_free(vector* v){ free(v->data); free(v);} /* v->data is identical to (*v).data */
void vector_set(vector* v, int i, double value){
assert( 0 <= i && i < (*v).size )
(*v).data[i]=value;
}
double vector_get(vector* v, int i){
assert( 0 <= i && i < (*v).size )
return (*v).data[i];
}
/* ... */
#include "vector.h"
#include "stdio.h"
#include "stdlib.h"
#define RND (double)rand()/RAND_MAX
int main()
{
int n = 5;
printf("\nmain: testing vector_alloc ...\n");
vector *v = vector_alloc(n);
if (v == NULL) printf("test failed\n");
else printf("test passed\n");
printf("\nmain: testing vector_set and vector_get ...\n");
double value = RND;
int i = n / 2;
vector_set(v, i, value);
double vi = vector_get(v, i);
if (double_equal(vi, value)) printf("test passed\n");
else printf("test failed\n");
printf("\nmain: testing vector_add ...\n");
vector *a = vector_alloc(n);
vector *b = vector_alloc(n);
vector *c = vector_alloc(n);
for (int i = 0; i < n; i++) {
double x = RND, y = RND;
vector_set(a, i, x);
vector_set(b, i, y);
vector_set(c, i, x + y);
}
vector_add(a, b);
vector_print("a+b should = ", c);
vector_print("a+b actually = ", a);
if (vector_equal(c, a)) printf("test passed\n");
else printf("test failed\n");
vector_free(v);
vector_free(a);
vector_free(b);
vector_free(c);
return 0;
}