2014-10-25 7 views
0

Я использую TMX парсер для разбора файла, у меня есть 2D массив называется map1,
, если я объявляю его статическим, т.е. int map1[w][h] программа работает нормально.
Но об объявлении его в динамике (через таНос & 2D указатель), я получаю ошибку сегментации:Сегментация Неисправность оператора возврата

int main() 
{ 
    Tmx::Map map; 
    int width,height; 
    map.ParseFile("new.tmx"); 
    if (map.HasError()) 
    { 
     cerr<<"Error loading map:"<< map.GetErrorText(); 
     return 1; 
    } 
    const Tmx::Layer* current_layer = map.GetLayer(0); 
    width = current_layer->GetWidth();; 
    height = current_layer->GetHeight(); 
    cout<<"\n\n"; 

// int map1[height][width];   
    int **map1; 
    map1=(int**)malloc(height*sizeof(int*)); 
    for(int i=0;i<width;i++) 
     map1[i]=(int*)malloc(width*sizeof(int)); 

    for (int i = 0; i < width; i++) 
     for (int j = 0; j < height; j++) 
      map1[j][i] = current_layer->GetTileId(i, j); 

    for(int i=0;i<height;i++) 
    { 
     for(int j=0;j<width;j++) 
     {  
      cout.width(3); 
      cout<< map1[i][j]<<" "; 
     } 
     cout<<"\n"; 
    } 
    return 0; 
} 

я пытался отладки с помощью GDB, я узнать, что «оператор возврата» является причиной ошибки ,

(gdb) backtrace 
#0 malloc_consolidate (av=0xb7e83420 <main_arena>) at malloc.c:4151 
#1 0xb7d4bbab in _int_free (av=0xb7e83420 <main_arena>, p=<optimized out>, have_lock=0) at malloc.c:4057 
#2 0xb7eed9df in operator delete(void*)() from /usr/lib/i386-linux-gnu/libstdc++.so.6 
#3 0xb7eeda2b in operator delete[](void*)() from /usr/lib/i386-linux-gnu/libstdc++.so.6 
#4 0xb7fcf0eb in Tmx::Layer::~Layer()() from /home/user/Documents/TMX/tmxparser-master/build/libtmxparser.so.1 
#5 0xb7fc9b3f in Tmx::Map::~Map()() from /home/user/Documents/TMX/tmxparser-master/build/libtmxparser.so.1 
#6 0x08048d4a in main() at main.cpp:69 
(gdb) frame 6 
#6 0x08048d4a in main() at main.cpp:69 
69  return 0; 
+2

Вам необходимо перекомпилировать из-за предупреждения «Исходный файл является более поздним, чем исполняемый». Не используйте 'malloc' в C++, используйте стандартные контейнеры, такие как' std :: vector' –

+0

@BasileStarynkevitch здесь используется матрица 2d, чтобы сохранить простую информацию, я временно избегал вектора; вы пытаетесь сказать, что malloc является причиной segfault? можете ли вы подробнее рассказать о malloc в контексте этого кода? –

+0

Вы также можете использовать одномерные массивы, добавить к ним доступ с помощью 'arr [i * width + j]' для элемента матрицы (i, j) –

ответ

1

Первый цикл должен итерацию до height, а не width.

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