www.pudn.com > lib.zip > debug.C
#include#include #include "private.h" #include "complex.h" #include "debug.h" #define MAXTICKS 300 struct db_tick { char ch; int ptr; }; static void findrange(float*, int, float&, float&); debugger::debugger(int nr, int nc) { if (nr > 4) nr = 4; nrows = nr; ncols = nc; for (int i = 0; i < nrows; i++) vec[i] = new float[ncols]; ticks = new db_tick[MAXTICKS]; reset(); } void debugger::insert(float f1, float f2, float f3, float f4) { if (ptr < ncols) { if (nrows >= 1) vec[0][ptr] = f1; if (nrows >= 2) vec[1][ptr] = f2; if (nrows >= 3) vec[2][ptr] = f3; if (nrows >= 4) vec[3][ptr] = f4; ptr++; } } void debugger::tick(char ch) { if (nticks < MAXTICKS) { ticks[nticks].ch = ch; ticks[nticks].ptr = ptr; nticks++; } } debugger::~debugger() { for (int i = 0; i < nrows; i++) delete vec[i]; delete ticks; } void debugger::print(char *fn) { FILE *fi = fopen(fn, "w"); if (fi != NULL) { for (int pn = 0; pn < nrows; pn++) { float ym, dy; findrange(vec[pn], ptr, ym, dy); int n = 0, nxt = 0; while (n < ptr) { int n1 = n + 500; if (n1 > ptr) n1 = ptr; fprintf(fi, ".sp 0.5i\n"); fprintf(fi, "pn=%d; %d ... %d\n", pn, n, n1-1); fprintf(fi, ".G1 8i\n"); fprintf(fi, "ticks bot out 0.1 from %d to %d by 100 \"%%g\"\n", n, n+500); fprintf(fi, "ticks bot out 0.05 from %d to %d by 10 \"\"\n", n, n+500); fprintf(fi, "ticks left from %g to %g by %g\n", -ym, +ym, dy); if (nxt < nticks && ticks[nxt].ptr >= n && ticks[nxt].ptr <= n1) { int tn = 0; fprintf(fi, "ticks bot in 0.1 at "); while (nxt < nticks && ticks[nxt].ptr <= n1) { if (tn++ > 0) fprintf(fi, ", "); fprintf(fi, "%d \"%c\"", ticks[nxt].ptr, ticks[nxt].ch); nxt++; } putc('\n', fi); if (ticks[nxt-1].ptr == n1) nxt--; /* include last tick again on next page */ } fprintf(fi, "new solid\n"); for (int i = n; i < n1; i++) fprintf(fi, "%d %g\n", i, vec[pn][i]); fprintf(fi, ".G2\n.bp\n"); n = n1; } } fclose(fi); } else fprintf(stderr, "can't create %s\n", fn); } static void findrange(float *vec, int num, float &ym, float &dy) { float ymax = -1.0; for (int i=0; i < num; i++) { float y = fabsf(vec[i]); if (y > ymax) ymax = y; } if (ymax > 0.0) { int m = (int) (100.0 + log10f(ymax)) - 100; /* round downwards */ float ym1 = powf(10.0, m); int nt = 10; ym = ym1; while (ymax > ym) { ym = 2.0*ym1; if (ymax > ym) { ym = 3.0*ym1; nt = 6; } if (ymax > ym) { ym = 5.0*ym1; nt = 10; } if (ymax > ym) { ym1 *= 10.0; ym = ym1; } } dy = ym/nt; } else ym = 0.0; }