/* * dvector2.c * $Id: dvector2.c,v 1.1 2009/10/30 16:31:40 daichi Exp $ * */ #include #include #include "dvector2.h" double * dvector (int size) { double *v; v = (double *)calloc(size + 1, sizeof(double)); if (v == NULL) { perror("dvector"); return NULL; } /* record size */ *((int *)v) = size; v += 1; return v; } void free_dvector (double *v) { free(v - 1); } double * resize_dvector (double *v, int newsize) { int i, size = vsize(v); v = (double *)realloc(v - 1, (newsize + 1) * sizeof(double)); if (v == NULL) { perror("resize_dvector"); return NULL; } /* record size */ *((int *)v) = newsize; v += 1; for (i = size; i < newsize; i++) v[i] = 0; /* zero clear */ return v; } void alloc_dvector (double **v, int newsize) /* guarantee v has size newsize */ { if (newsize > vsize(*v)) *v = resize_dvector(*v, newsize); } #if 0 int main (int argc, char *argv[]) { int i, n = atoi(argv[1]); double *v = dvector(n); printf("size = %d\n", vsize(v)); for (i = 0; i < vsize(v); i++) v[i] = i / 10.0; for (i = 0; i < vsize(v); i++) printf("v[%d] = %lg\n", i, v[i]); v = resize_dvector(v, 20); printf("size = %d\n", vsize(v)); for (i = 0; i < vsize(v); i++) printf("v[%d] = %lg\n", i, v[i]); return 0; } #endif