传递指针以更改其值但保持不变

发布于 2024-12-01 07:56:58 字数 949 浏览 0 评论 0原文

传递指针来更改其值但保持不动

我正在使用 allegro 库开发 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的返回值?

passing pointer to change its value but stay still

I am working on C++ with allegro library.

there is draw_tiles function.

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

}

and loadTilemap function.

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

I expect

following code change TileMap to points somewhere

loadTilemap(s_world->tilemap,TileMap); 

but after loadTilemap, the TileMap variable stay still.

the following code works very well

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

tileLayer points 0x003f93f8

How to fix my code to TileMap points return value of load_bitmap?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

挽你眉间 2024-12-08 07:56:58

您正在按值传递指针,因此会创建指针的副本。在 loadTilemap 中,您正在为指针的副本分配一个新值 - 但这不会影响原始指针。

尝试通过将 loadTilemap 函数签名更改为以下内容来通过引用传递指针:

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

You are passing the pointer by value, so a copy of the pointer is created. Inside loadTilemap, you are assigning a new value to the copy of the pointer - but that doesn't affect the original pointer.

Try passing the pointer by reference by changing the loadTilemap function signature to this:

void loadTilemap(int i,BITMAP *& tileLayer);
慕巷 2024-12-08 07:56:58

您需要传递一个指向指针的指针来实现这一点:

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

loadTilemap(s_world->tilemap, &TileMap); 

假设 TileMap 的类型为 BITMAP *

或者,您可以简单地返回 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 中的其他任何内容(即它只是一个输出参数)。

You need to pass a pointer to pointer to achieve that:

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

loadTilemap(s_world->tilemap, &TileMap); 

That's assuming TileMap is of type BITMAP *.

Alternatively, you could simply return the BITMAP* pointer as a result of 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);

This would allow you to get rid of tileLayer parameter altogether, as you don't seem to be using it for anything else in loadTileMap (i.e. it's only an output parameter).

就像说晚安 2024-12-08 07:56:58

试试这个:

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

Try this:

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


loadTilemap(s_world->tilemap, &TileMap); 

The problem was that you pass the pointer to the BITMAP by value. To get the new pointer value out of loadTilemap, you have to pass it by reference.

EDIT:

On the other hand: why don't you just return the pointer to the newly created BITMAP?

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

...

TileMap = loadTilemap(s_world->tilemap);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文