18 const char *stype =
"unknown";
19 if ( isfp && elemsize==8 ) stype =
"double";
20 else if ( isfp && elemsize==4 ) stype =
"float";
21 else if ( !isfp && elemsize==8 ) stype =
"int64";
22 else if ( !isfp && elemsize==4 ) stype =
"int32";
23 else if ( !isfp && elemsize==2 ) stype =
"int16";
24 else if ( !isfp && elemsize==1 ) stype =
"int8";
25 printf(
"Writing %s array of length %d to binary file %s\n",
26 stype, length, filename);
27 FILE *fp = fopen(filename,
"wb");
28 if ( fp == 0 )
return -1;
32 fwrite(&isfp,
sizeof(
int), 1, fp);
33 fwrite(&elemsize,
sizeof(
int), 1, fp);
34 fwrite(&length,
sizeof(
int), 1, fp);
35 fwrite(array, elemsize, length, fp);
41 #ifdef TEST_ARRAY_STANDALONE 46 typedef long long int int64;
60 FILE *fp = fopen(filename,
"rb");
61 if ( fp == 0 )
return -1;
63 int isfp, elemsize, length;
65 fread(&isfp,
sizeof(
int), 1, fp);
66 fread(&elemsize,
sizeof(
int), 1, fp);
67 fread(&length,
sizeof(
int), 1, fp);
68 void *buffer = malloc(elemsize * length);
69 fread(buffer, elemsize, length, fp);
74 *p_elemsize = elemsize;
82 void TestArray_free_memory(
93 double TestArray_read_elem_double(
void *buf,
int i,
int sz) {
95 void *p = (
void *) ((
const char *) buf + i*sz);
105 "Unrecognized element size %d for floating point array\n", sz);
114 int64 TestArray_read_elem_int(
void *buf,
int i,
int sz) {
116 void *p = (
void *) ((
const char *) buf + i*sz);
132 "Unrecognized element size %d for integer array\n", sz);
138 int main(
int argc,
const char *argv[]) {
139 if (
sizeof(
int8) != 1 ||
140 sizeof(
int16) != 2 ||
141 sizeof(
int32) != 4 ||
142 sizeof(
int64) != 8) {
143 fprintf(stderr,
"Integer sizes are incorrect. Must rebuild.\n");
147 fprintf(stderr,
"Compare two binary files created using TestArray.\n");
148 fprintf(stderr,
"Syntax: %s file1 file2 [first_index] [last_index]\n",
152 const char *fname1 = argv[1];
153 const char *fname2 = argv[2];
156 if (argc > 3) first = atoi(argv[3]);
157 if (argc > 4) last = atoi(argv[4]);
159 char *label1, *label2;
160 void *buffer1, *buffer2;
162 int elemsize1, elemsize2;
163 int length1, length2;
165 if ( TestArray_read(fname1, &label1, &buffer1,
166 &isfp1, &elemsize1, &length1) ) {
167 fprintf(stderr,
"Unable to read first file %s\n", fname1);
171 if ( TestArray_read(fname2, &label2, &buffer2,
172 &isfp2, &elemsize2, &length2) ) {
173 fprintf(stderr,
"Unable to read second file %s\n", fname2);
177 if ( isfp1 != isfp2 ) {
178 fprintf(stderr,
"Trying to compare floating point and integer data\n");
182 if (last >= length1) last = length1-1;
183 if (last >= length2) last = length2-1;
185 printf(
"%s\n%s\n", label1, label2);
187 printf(
"%6s %14s %14s %14s %14s\n",
188 "index",
"file1",
"file2",
"abserr",
"relerr");
189 for (
int i=first; i <= last; i++) {
190 double a = TestArray_read_elem_double(buffer1, i, elemsize1);
191 double b = TestArray_read_elem_double(buffer2, i, elemsize2);
192 double abserr = a - b;
193 double relerr = (a != 0 ? fabs(abserr) / fabs(a) : 0);
194 printf(
"%6d %14.8f %14.8f %14.8f %14e\n",
195 i, a, b, abserr, relerr);
199 printf(
"%6s %14s %14s %14s\n",
200 "index",
"file1",
"file2",
"abserr");
201 for (
int i=first; i <= last; i++) {
202 int64 a = TestArray_read_elem_int(buffer1, i, elemsize1);
203 int64 b = TestArray_read_elem_int(buffer2, i, elemsize2);
204 int64 abserr = a - b;
205 printf(
"%6d %14ld %14ld %14ld\n", i, a, b, abserr);
209 TestArray_free_memory(label1, buffer1);
210 TestArray_free_memory(label2, buffer2);
215 #endif // TEST_ARRAY_STANDALONE int TestArray_write_helper(const char *filename, const char *label, const void *array, int elemsize, int length, int isfp)
static const int LABEL_SIZE
int main(int argc, char *argv[])