#c
#c #указатели #null
Вопрос:
передача указателя для изменения его значения, но оставаться на месте
Я работаю над C с библиотекой allegro.
существует функция 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?
Комментарии:
1. Какой тип возвращаемого значения load_bitmap ?
Ответ №1:
Вы передаете указатель по значению, поэтому создается копия указателя. Внутри loadTilemap
вы присваиваете новое значение копии указателя, но это не влияет на исходный указатель.
Попробуйте передать указатель по ссылке, изменив сигнатуру loadTilemap
функции на эту:
void loadTilemap(int i,BITMAP *amp; tileLayer);
Комментарии:
1. 1 для ссылки на указатель вместо указателя на указатель — это C , у нас есть ссылки.
Ответ №2:
Для этого вам нужно передать указатель на указатель:
void loadTilemap(int i,BITMAP ** tileLayer){
char c[128];
sprintf(c,TILEPATHFORMAT,i);
*tileLayer= load_bitmap(c,NULL);
}
loadTilemap(s_world->tilemap, amp;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
(т. Е. Это Всего лишь выходной параметр).
Ответ №3:
Попробуйте это:
void loadTilemap(int i,BITMAP ** tileLayer){
char c[128];
sprintf(c,TILEPATHFORMAT,i);
*tileLayer = load_bitmap(c,NULL);
}
loadTilemap(s_world->tilemap, amp;TileMap);
Проблема заключалась в том, что вы передавали указатель на значение BITMAP
by . Чтобы получить новое значение указателя из loadTilemap
, вы должны передать его по ссылке.
Редактировать:
С другой стороны: почему бы вам просто не вернуть указатель на вновь созданный BITMAP
?
BITMAP * loadTilemap(int i* tileLayer){
char c[128];
sprintf(c,TILEPATHFORMAT,i);
return load_bitmap(c,NULL);
}
...
TileMap = loadTilemap(s_world->tilemap);