Warning: присваивание делает целое число из указателя без литого в C

Вот мой код:

int dim_y, dim_x;
int **map_boundaries;
int **map;

int main( int argc, char* args[] ){

 int i;

 scanf("%d",&dim_x);
 scanf("%d",&dim_y);

 map_boundaries = (int **)calloc(dim_y + 40,sizeof(int*)); 
 for(i = 0; i < dim_y + 40; i++){
 map_boundaries[i] = (int *)calloc(dim_x + 40,sizeof(int));
 }

 (*map)[dim_x+40] = (int(*)[dim_x+40])&map_boundaries[20][20];
}

Предупреждение для последней строки, как должна быть последняя строка?

Когда у меня это так, он отлично работает:

#define dim_y 500
#define dim_x 600

int map_boundaries[dim_y+40][dim_x+40];
int (*map)[dim_x+40] = (int(*)[dim_x+40])&map_boundaries[20][20];

Но я хочу, чтобы значения "dim_x" и "dim_y" были предоставлены пользователем, а "map" - глобальными.

2 ответа

Во-первых, нам нужно знать, чего вы хотите достичь. В последней строке есть что-то явно неправильное, но, не зная вашего намерения, мы только угадаем, как это исправить. Проанализируйте свой код.

  1. В настоящее время вы разыменовываете (неинициализированный) (int**) variable ((int*)), а затем используете его как массив - это предполагает, что вы намереваетесь, чтобы map была указателем на массив int s.

  2. Вы динамически выделяете 2-мерный массив map_boundaries с размером (dim_x+40) x (dim_y+40) - обратите внимание, что действительные индексы будут соответственно 0... dim_x + 40-1 и 0... dim_y + 40-1,

Из вашего редактирования я понимаю, что вы хотите использовать map_boundaries качестве помощника для динамического выделения глобальной map.

Действительно, вы можете распределять таблицу так, как вы. Чтобы назначить весь массив map_boundaries для map вам нужно только сделать map = map_boundaries; как @********. Затем вы можете сделать map_boundaries локальными.

int dim_y, dim_x;
int **map;

int main( int argc, char* args[] ){
 int **map_boundaries;

 scanf("%d",&dim_x);
 scanf("%d",&dim_y);

 map_boundaries = (int**) calloc(dim_y+40, sizeof(int*)); 
 for(int i = 0; i < dim_y+40; i++){
 map_boundaries[i] = (int*) calloc(dim_x+40, sizeof(int));
 }

 map = map_boundaries;
}

Предупреждение возникает, потому что:

  1. (*map)[dim_x+40] - тип int (и вы получаете его путем разыменования нераспределенной памяти, но компилятор не может этого знать).

  2. (int(*)[dim_x+40]) является (если я не ошибаюсь) типа array of pointers to int ((int*)[]) - компилятор неявно отбрасывает его в int поскольку вы шутите данные о литье в недопустимый тип,

Если это не то, что вы хотели сделать, пожалуйста, уточните, чего вы на самом деле пытались достичь, поскольку это не очевидно.

РЕДАКТИРОВАТЬ:

Обрезка map_boundaries для map (один из способов сделать это):

int trimmed_dim_y_start = 0;
int trimmed_dim_y_size = 20;
int trimmed_dim_x_start = 0;
int trimmed_dim_x_size = 20;

// ...

map = (int**) calloc(trimmed_dim_y_size, sizeof(int*));
for (int i = 0; i < trimmed_dim_y_size; i++) {
 map[i] = map_boundaries[ trimmed_dim_y_start + i ] + trimmed_dim_x_start;
}

Обратите внимание, что в этом варианте вам придется снова делать глобальными map_boundaries так как если вы не освободите весь этот calloc, вы получите утечку памяти. Может быть, не так плохо в этой конкретной программе, но это все еще важная практика для очистки вещей.


Удалите скобу из int (*) и поместите все int * в скобки.

(*map)[dim_x+40] = ((int*)[dim_x+40])&map_boundaries[20][20];

licensed under cc by-sa 3.0 with attribution.