2011-08-24 37 views
0

傳遞指針來改變其價值,但仍然停留傳遞指針來改變其價值,但仍然停留

我工作的C++用快板圖書館。

有draw_tiles函數。

void draw_tiles(def_small_world * s_world,BITMAP * dest){ 
    BITMAP *TileMap=NULL; 

    loadTilemap(s_world->tilemap,TileMap); 
    for(int y = 0;y<SIGHTY*2+1;y++) 
    { 
     for(int x = 0;x<SIGHTX*2+1;x++) 
     { 
      pasteTile(s_world->tile[y][x].kind,TileMap,dest,x,y); 
     } 
    } 

} 

和loadTilemap函數。

void loadTilemap(int i,BITMAP * tileLayer){ 
    char c[128]; 
    sprintf(c,TILEPATHFORMAT,i); 
    tileLayer= load_bitmap(c,NULL); 
} 

我希望

下面的代碼改變tilemap的給分的地方

loadTilemap(s_world->tilemap,TileMap); 

但loadTilemap之後,tilemap的變量仍然停留。

下面的代碼工作得很好

char c[128]; 
sprintf(c,TILEPATHFORMAT,i); 
tileLayer= load_bitmap(c,NULL); 

tileLayer點0x003f93f8

如何修復我的代碼tilemap的點返回load_bitmap的價值?

+0

什麼是load_bitmap的返回類型? – Daniel

回答

2

您正在按值傳遞指針,因此會創建指針的副本。在loadTilemap的內部,您正在爲指針的副本分配一個新值 - 但這不會影響原始指針。

嘗試通過引用傳遞指針通過改變loadTilemap函數簽名這樣的:

void loadTilemap(int i,BITMAP *& tileLayer); 
+0

+1引用指針而不是指向指針的指針 - 這是C++,我們有引用。 –

0

你需要傳遞一個指針的指針來實現的是:

void loadTilemap(int i,BITMAP ** tileLayer){ 
    char c[128]; 
    sprintf(c,TILEPATHFORMAT,i); 
    *tileLayer= load_bitmap(c,NULL); 
} 

loadTilemap(s_world->tilemap, &TileMap); 

這是假設TileMapBITMAP *類型。

或者,你可以簡單地返回BITMAP*指針的loadTilemap結果:

BITMAP* loadTilemap(int i,BITMAP * tileLayer){ 
    char c[128]; 
    sprintf(c,TILEPATHFORMAT,i); 
    return load_bitmap(c,NULL); 
} 

TileMap = loadTilemap(s_world->tilemap, TileMap); 

這將讓你得到完全擺脫tileLayer參數的,因爲你似乎沒有使用它的任何東西否則在loadTileMap(即它只是一個輸出參數)。

0

試試這個:

void loadTilemap(int i,BITMAP ** tileLayer){ 
    char c[128]; 
    sprintf(c,TILEPATHFORMAT,i); 
    *tileLayer = load_bitmap(c,NULL); 
} 


loadTilemap(s_world->tilemap, &TileMap); 

的問題是,按值傳遞的指針BITMAP。要從loadTilemap中獲得新的指針值,必須通過引用來傳遞它。

編輯:

在另一方面:你爲什麼不直接返回指針到新創建的BITMAP

BITMAP * loadTilemap(int i* tileLayer){ 
    char c[128]; 
    sprintf(c,TILEPATHFORMAT,i); 
    return load_bitmap(c,NULL); 
} 

... 

TileMap = loadTilemap(s_world->tilemap);