Thanks I had some debugging printf in the code but I deleted them from my post to make it a little less messy but yours where better. This is kind of odd in that it looks like tinx is changing at random during execution. 4 := (0 - 0) + 40 := 4 < 0 0 := testtran: ../PPDict1.cpp:65: virtual void PPDict1::getData(int, int, unsigned char*): Assertion `tinx >= 0' failed. As you can see tinx is set to the value of four in the first statement then it throws and Assertion on the next statement! There is no assignments happening between the two statements. On 7/11/07, John Love-Jensen <eljay@xxxxxxxxx> wrote:
Here's what I'd do... first grade debugging. Add in these diagnostic lines: void PPDict1::getData(int position, int size, unsigned char *buffer) { int fsize = getDataLength(); if ((position + size) > fsize) { memset(buffer, 0, size); return; } int tinx=(position-getIndexOffset())+size; // Which of these things has the unexpected value? assert(tinx >= 0); assert(getIndexSize() >= 0); assert(getIndexOffset() >= 0); bool const haveMoreTinx = tinx < getIndexSize(); bool const isPtrNonZero = indexPTR_ != 0; std::cerr << tinx << " := (" << position << " - " << getIndexOffset() << ") + " << size; std::cerr << haveMoreTinx << " := " << tinx << " < " << getIndexSize() << '\n'; std::cerr << isPtrNonZero << " := " << indexPtr_ << " != 0\n"; std::cerr << haveMoreTinx << " && " << isPtrNonZero << '\n'; if((tinx<getIndexSize())&&(indexPTR_!=0)){ inxcount_++; void * tPtr=indexPTR_+position-getIndexOffset(); memcpy(buffer, tPtr, size); }else{ dictStream_.seekg(position); dictStream_.read((char *)buffer, size); profcount_++; } } HTH, --Eljay