2013-04-08 21 views
0

我被這個EXC_BAD_ACCESS錯誤困住了。我正在使用zlib壓縮並保存函數deflateReadOut中的數組ch中的一些數據,該函數從函數generate中調用。該程序在標記行上的fwrite失敗。EXC_BAD_ACCESS在使用矢量類的底層數組進行fwrite時的錯誤

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); 
} 

非常感謝您提供任何幫助。

回答

0

我想通了。我試圖寫入一個不存在的目錄,我認爲它會自動創建它,如果它不存在。