[Issue 1718] New: obscure exit with error code 5

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Dec 9 04:37:37 PST 2007


http://d.puremagic.com/issues/show_bug.cgi?id=1718

           Summary: obscure exit with error code 5
           Product: D
           Version: 2.008
          Platform: PC
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla at digitalmars.com
        ReportedBy: adolf.mathias at googlemail.com


The attached solver for the "escape from zurg" riddle doesn't compile with
versions 2.007 and 2.008 anymore. Instead (from within emacs compilation mode)
I get "compilation exited abnormally with code 5".

Modifying the function writecrossing as follows

void writecrossing(const Entry *e)
{ foreach(v;toys)
    if(e.cross&v.mask) writef("%s(%d), ",v.name, v.time);
  auto h = e.goal?"escape":"return";
  writefln("%s; %d minutes left", h, e.timeleft);
}

solves the problem.

Here the version of the program that doesn't compile.
I've tried without success to produce a substantially shorter program that
shows the same error. It seems to depend on the circumstances.

import std.stdio;

struct Toy {
  ulong mask;
  invariant(char)[] name;
  int time;
};

Toy[4] toys = [{1,"Buzz",5},{2,"Woody",10},{4,"Rex",20},{8,"Hamm",25}]; 

struct Entry {
  int timeleft;
  bool goal;   // true means that here is the goal of the escape
  ulong cross, // masks of characters that have just crossed
        here, there;
};

ulong alltoys = (1<<toys.length)-1;

void writecrossing(const Entry *e)
{ foreach(v;toys)
    if(e.cross&v.mask) writef("%s(%d), ",v.name, v.time);
  writefln("%s; %d minutes left", e.goal?"escape":"return", e.timeleft);
}

Entry[64] stack;
Entry* p=&stack[0],q=&stack[1];
int solcnt = 0, timeoutcnt = 0, crosscnt = 0;
void cross()
{ ++crosscnt;
  q.goal = !p.goal;  q.here = p.there | q.cross; q.there = p.here & ~q.cross;
  if(q.goal && q.here==alltoys) {
    writefln("\nSolution %d",++solcnt);
    foreach(e;stack[2..q+1-&stack[0]]) writecrossing(&e);
  } else {
    p = q; q++;
    foreach(k,v;toys) {
      if(p.here&v.mask) {
        q.cross = v.mask; q.timeleft = p.timeleft - v.time;
        if(q.timeleft<0) timeoutcnt++; else if(q.cross!=p.cross) cross();
        foreach(w;toys[k+1..length]) {
          if(p.here&w.mask) {
            q.cross = v.mask|w.mask;
            if(w.time>v.time) q.timeleft = p.timeleft - w.time;
            if(q.timeleft<0) timeoutcnt++; else if(q.cross!=p.cross) cross();
          }
        }
      }
    }
    q = p; p--;
  }
}

int main ()
{ q.timeleft = 60;
  p.there = alltoys; p.here = 0; p.goal = true; q.cross = 0;
  cross();
  writef("\ncross() called %d times; timeout reached %d times", crosscnt,
timeoutcnt);
  return 0;
}


-- 



More information about the Digitalmars-d-bugs mailing list