Как можно задать размер map через консоль, чтоб не использовать const int (Алгоритм А стар)?

Вот ссылка на общий код алгоритма А стар: code.activestate.com/recipes/577457-a-star-shortest-path-algorithm/

Попробовал использовать динамические массивы(сделал следующие изменения):

int n;
int m;
static int **map;
static int **closed_nodes_map;
static int **open_nodes_map;
static int **dir_map;
....

int main()
{
cout<<"enter n"<>n;
cout<<"enter m"<>m;

map = new int* [n];
for(int i = 0; i < n; i++)
{
map[i] = new int [m];
}
closed_nodes_map = new int* [n];
for(int i = 0; i < n; i++)
{
closed_nodes_map[i] = new int [m];
}
open_nodes_map = new int* [n];
for(int i = 0; i < n; i++)
{
open_nodes_map[i] = new int [m];
}
dir_map = new int* [n];
for(int i = 0; i < n; i++)
{
dir_map[i] = new int [m];
...
И при запуске, после ввода n и m, возникает ошибка: Необработанное исключение в "0x010d29fb" в "TestAStar.exe": 0xC0000005: Нарушение прав доступа при записи "0xfdfdfe25". Как решить эту проблему?

Заранее спасибо!
  • Вопрос задан
  • 2632 просмотра
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
// reset the node maps
    for(y=0;y<m;y++)
    {
        for(x=0;x<n;x++)
        {
            closed_nodes_map[x][y]=0;
            open_nodes_map[x][y]=0;
        }
    }

/******  после этих циклов x == n и y == m  *******/

    // create the start node and push into list of open nodes
    n0=new node(xStart, yStart, 0, 0);
    n0->updatePriority(xFinish, yFinish);
    pq[pqi].push(*n0);

/******  и эта запись -- мимо массива  *******/
    open_nodes_map[x][y]=n0->getPriority(); // mark it on the open nodes map
Ответ написан
Teivaz
@Teivaz
Для такого массива нужно выделять память в цикле, или сразу одним большим блоком, но записывать в массив указатели с шагом в строку.
int** Allocate2dArray(int w, int h)
{
	int** a;
	// сначала выделяем память под указатели на столбцы
	a = new int*[w];
	for (int i = 0; i < w; ++i)
	{
		// выделяем память под каждый столбец
		a[i] = new int[h];
	}
	return a;
}

или так
int** Allocate2dStraight(int w, int h)
{
	int** a;
	a = new int*[w];
	// одним махом выделяем память под все столбцы
	*a = new int[w * h];
	for (int i = 1; i < w; ++i)
	{
		// и просто раздаём адреса
		a[i] = a[i-1] + w;
	}
	return a;
}

и удалять в обратном порядке.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
cout<<"enter n"<>n;
cout<<"enter m"<>m;

Что это такое? Подозреваю, что либо кто-то пожевал разметку, либо n и m остались неинициализированными.
Дальнейший код вроде ок.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы