Итак, я пытаюсь создать двумерный массив указателей на объект типа Piece. Проблема в том, что когда я пытаюсь назначить указатель на кусок массиву, я получаю ошибку сегментации. Я понял, что мне нужно инициализировать массив до того, как я начну выделять, но я не могу понять это правильно.Невозможно выделить память для двумерного массива указателей C++
Вот файл заголовка Карты, который содержит 2-мерный массив указателей.
#ifndef MAP_H
#define MAP_H
#include <iostream>
#include <vector>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <string>
#include <cstring>
#include "Player.h"
#include "Sprite.h"
#include "Piece.h"
#include "Messages.h"
#include "PieceType.h"
using namespace std;
class Map
{
private:
Piece*** pieces;
int startingX;
int startingY;
int width;
int height;
string mapName;
public:
Map(string);
~Map();
void printMap() const;
Piece* pieceType(char);
void setSprite(Piece*);
void firstMove();
void resetMap(string);
bool moveUp(int, int);
bool moveDown(int, int);
bool moveLeft(int, int);
bool moveRight(int, int);
int getHeight();
int getWidth();
};
#endif
Массив, о котором я говорю, это куски.
Я пытаюсь выделить это в конструкторе Карты.
Map::Map(string name)
{
ifstream map;
string line;
string dimention;
mapName = name;
map.open(name.c_str());
if (map.good())
{
getline (map, line);
int i = 0;
while(line[i] != 'X')
{
dimention[i] = line[i];
i++;
}
stringstream convert(dimention);
convert >> width;
int temp = i;
dimention = "";
i = 1;
while(line[(i + temp)] != '\0')
{
dimention[i] = line[(i + temp)];
i++;
}
stringstream convertTwo(dimention);
convertTwo >> height;
for (int i = 0; i < height; i++)
{
if (!(map.eof()))
{
getline (map, line);
}
else
{
cout << "Error with file" << endl;
break;
}
for (int j = 0; j < width; j++)
{
pieces[i][j] = pieceType(line[j]); //This is where I'm getting the segmentation fault
cout << "assigned" << endl;
if ((pieces[i][j])->getType() == WAYPOINT)
{
if (pieces[i][j]->getWaypointType() == 0)
{
startingX = j;
startingY = i;
}
}
else
{
(pieces[i][j])->setXCordinate(j);
(pieces[i][j])->setYCordinate(i);
}
}
}
}
}
Если имя - это строка, содержащая имя файла, в котором содержится информация для загрузки определенной карты.
Кроме того, функция pieceType выглядит следующим образом:
Piece* Map::pieceType(char type)
{
Piece* temp;
if (type == '.')
{
return NULL;
}
if (type == 'S')
{
temp = new Waypoint(0);
return temp;
}
if (type == 'E')
{
temp = new Waypoint(1);
return temp;
}
}
Точку является производным классом шт.
Я предполагаю, что размер массива неизвестен во время компиляции? Есть ли ограничение на размер массива? – rdans
вы отбрасываете «куски» перед тем, как выделить его, даже если это указатели, вам нужно выделить указатели. еще лучше, используйте std: vector вместо этого, чтобы отслеживать, что и когда удалять ваши указатели, например. 'vector> pieces;' –
'pieces [i] [j] = pieceType (строка [j]); это не распределение памяти, это назначение значения. – ipinak