0

I am stumped with this EXC_BAD_ACCESS error. I am using zlib to compress and save some data from the array ch in the function deflateReadOut which is called from the function generate. The program fails at the fwrite on the marked line.

class WSUMap {
public:


vector<vector <unsigned char> > chunk;
int xComp[4];
int yComp[4];
vector<int> priority;
Hash hashChunk;

WSUMap()
{
    chunk.resize(4);
    chunk[0] = vector<unsigned char>(CHUNK);
    chunk[1] = vector<unsigned char>(CHUNK);
    chunk[2] = vector<unsigned char>(CHUNK);
    chunk[3] = vector<unsigned char>(CHUNK);
    priority.push_back(0);
    priority.push_back(1);
    priority.push_back(2);
    priority.push_back(3);
    xComp[0] = -1;
    xComp[1] = -1;
    xComp[2] = -1;
    xComp[3] = -1;
    yComp[0] = -1;
    yComp[1] = -1;
    yComp[2] = -1;
    yComp[3] = -1;
}

void generate() {
    for (int i = 0; i<CHUNK; i++) {
        chunk[0][i]=100;
    }
    for (int i = 0; i < 16; i++) {
        for (int j = 0; j < 16; j++) {
            cout << chunk[0][0] << endl;
            unsigned char* ch = &chunk[0][0];
            cout << ch[0] << endl;
            deflateReadOut(i, j, &chunk[0][0]);
        }
    }
}

void deflateReadOut(int x, int y, unsigned char* ch) {
    int ret, flush;
    unsigned have;
    z_stream strm;
    vector<unsigned char> out = vector<unsigned char>(CHUNK);
    out.resize(CHUNK);

    /* allocate deflate state */
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    ret = deflateInit(&strm, Z_DEFAULT_COMPRESSION);
    if (ret != Z_OK) assert(true);
    //return ret;

    ostringstream oss;
    oss << "map/" << x << "x" << y;
    string str = oss.str();
    cout << str << endl;
    FILE* dest = fopen(str.c_str(), "w");

    /* run deflate() on input until output buffer not full, finish
       compression if all of source has been read in */
    do {
        strm.avail_out = CHUNK;
        strm.avail_in = CHUNK;
        strm.next_in = ch;
        strm.next_out = &out[0];

        ret = deflate(&strm, Z_FINISH); /* no bad return value */
        assert(ret != Z_STREAM_ERROR); /* state not clobbered */

        have = CHUNK - strm.avail_out;
        if (fwrite(&out[0], 1, have, dest) != have || ferror(dest)) {//ERROR HERE
            (void) deflateEnd(&strm);
            //return Z_ERRNO;
        }

    } while (strm.avail_out == 0);
    assert(strm.avail_in == 0); /* all input will be used */

    /* clean up and return */
    (void) deflateEnd(&strm);
}

Thank you for any help you can provide.

ymom11
  • 1
  • 1

1 Answers1

0

I figured it out. I was trying to write to a directory that did not exist and I thought it would automatically create it if it did not exist.

ymom11
  • 1
  • 1