2016-06-30 2 views
1

Я искал решение, но не смог использовать без ошибок. Im пытается нарисовать карту в консоли, используя мультидисциплинарный массив. Я хочу иметь больше карт, но я не могу это сделать без спама бесполезного кода. Это карта:Пытаясь использовать многомерные указатели массивов

char map2[11][15] = { 
"###^######^###", 
"#L   #", 
"^S   #", 
"#S   #", 
"# K  #", 
"########### #", 
"#G   #", 
"#  #### #", 
"#  #M #", 
"# @  # #", 
"## ########^##"}; 

и это перемещение сценария:

void Game::showing_different_maps() 
{ 
    differentmap= true; 
    while (differentmap) 
    { 
     system("cls"); 
     for(int i = 0; i < 81; i++) // i < map2[y][] 
     { 
      cout << somemap[i] << endl; // drawing a map !THIS CAUSES CRASH! 
     } 
    system("pause>nul"); // this line prevent lagging somehow 

     if(GetAsyncKeyState(VK_UP)) // arrows to move on axis (y, x) 
     { 
      mapka.move(-1, 0);      
     } 
     if(GetAsyncKeyState(VK_DOWN)) 
     { 
      mapka.move(1, 0); 
     } 
     if(GetAsyncKeyState(VK_RIGHT)) 
     { 
      mapka.move(0, 1); 
     } 
     if(GetAsyncKeyState(VK_LEFT)) 
     { 
      mapka.move(0, -1); 
     } 

    } 

} 

и вот что я смог найти в Интернете.

Wut wut(3, 13); 
    Maps *wsk; 
    pointer = &wut; 

    char (*somemap)[81] = new char[81][81]; 
    somemap= &map2[81]; 

    pointer = &wut; 
    pointer -> get_in_area(); 

, что я хочу сделать, это: в какой-то части кода, я хочу указатель быть map2. Мне удалось сделать указатель «указатель», чтобы показать void get_in_area() в классах Maps, но Console падает, когда я хочу нарисовать карту с указателем somemap во втором примере кода. Он работает, когда вместо somemap [i] я помещаю map2 [i]. Мне очень жаль, что я что-то пропустил, я начинаю, а английский не является моим первым языком. Я сделал этот сценарий с этим уроком: https://www.youtube.com/watch?v=7gpH7bOS350

+0

Beacause вы принимаете границы массива == 81? он сработает, как только неопределенное поведение пойдет, оно должно потерпеть крах – Neijwiert

+0

также в C++ попытаться избежать как можно большего количества необработанных массивов и обернуть их внутри класса или использовать один из существующих классов, чтобы это не сработало с чистым исключением – Neijwiert

+0

I пытался повсюду редактировать 81, но это никогда не помогало. карты будут отличаться по размеру, а максимальный размер - 81x81, поэтому я просто написал 81 везде. спасибо за совет, но образец кода находится в классе, я просто не вставлял весь код – Pinet

ответ

1

Это, как вы бы создать 2-мерный массив:

typedef int T; 
void f() 
{ 

    T ** map = new T*[10]; 

    for (int i = 0; i < 10; i++) 
    { 
     map[i] = new T[10]; 
    } 

    for (int i = 0; i < 10; i++) 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      map[i][j] = i*j; 
     } 
    } 

    for (int i = 0; i < 10; i++) 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      std::cout << map[i][j] << "\t"; 
     } 
     std::cout << std::endl; 
    } 
} 

Это будет выводить общую таблицу умножения.

Если вы хотите больше размеров вы бы просто добавить еще один шаг в создании:

T*** map = new T**[10]; 

for (int i = 0; i < 10; i++) 
{ 
    map[i] = new T*[10]; 
} 
... 
0

Вы должны знать, как передать параметры вместо использования глобальных (map2) или статические (81) переменные. Если вы объявляете:

void Game::showing_different_maps(int n, int m, char map[n][m]) 
{ 
String differentmap= true; 
    while (differentmap) 
    { 
     system("cls"); 
     for(int i = 0; i < n; i++) // i < map2[y][] 
     { 
      cout << somemap[i] << endl; // drawing a map !THIS CAUSES CRASH! 
     } 

вы больше не должны врезаться ...

Но в любом случае, для такого использования, я хотел бы использовать указатель на указатель вместо 2d массива:

char *map2[]= { 
    "###^######^###", 
    "#L   #", 
    "^S   #", 
    "#S   #", 
    "# K  #", 
    "########### #", 
    "#G   #", 
    "#  #### #", 
    "#  #M #", 
    "# @  # #", 
    "## ########^##"}; 

А затем

void Game::showing_different_maps(int n, char **map) 
+0

Большое спасибо, у меня были некоторые проблемы с пониманием, поэтому я не мог понять предыдущую помощь, но через некоторое время мне удалось использовать указатель на рекомендации указателя, но я столкнулся с другой проблемой. Приложения запускаются, но когда карта нарисована и я нажимаю клавишу, она сработает. Отладчик сказал мне только это: «Программный сигнал SIGSEGV, ошибка сегментации». Из Интернета я понял только «вы никогда не выделяете пространство, необходимое для хранения переменных», но я не знаю, что с ним делать. Я добавил больше кода на мой вопрос. Еще раз спасибо за то, что вы сделали до этого момента. – Pinet

+0

Это не должно быть редактирование этого вопроса, а новый вопрос, потому что теперь это другая проблема, и текущие ответы теперь не связаны с этой новой частью. –

+0

О, ладно, я сделаю новый вопрос, тем не менее спасибо – Pinet

Смежные вопросы