2013-02-25 3 views
0

Я пытаюсь построить класс, который работает с матрицами ширины. В своем конструкторе он хочет знать высоту и ширину массива и хочет сам массив, а затем должен иметь возможность печатать массив и перегружать некоторые операторы. Массив должен быть массивом поплавков. Это то, что я до сих пор: Два определенные параметры:Работа с многомерными массивами

#define HEIGHT 3 
#define WIDTH 3 

Making массив:

void Assignment_1::start(){ 
    float **matrix = new float *[HEIGHT]; 
    for (int i = 0; i < HEIGHT; i++){ 
     matrix[i] = new float[WIDTH]; 
    } 
    // 5 6 11 
    // 7 2 8 
    // 5 1 4 
    matrix[0][0]=5; 
    matrix[0][1]=6; 
    matrix[0][2]=11; 
    matrix[1][0]=7; 
    matrix[1][1]=2; 
    matrix[1][2]=8; 
    matrix[2][0]=5; 
    matrix[2][1]=1; 
    matrix[2][2]=4; 
    Matrix * matrixA = new Matrix(HEIGHT,WIDTH,matrix); 
    matrixA->printMatrix(); 
} 

Сейчас я понимаю, что C++ двумерный массив а существует нормального массива HEIGHT указателей , каждый из которых указывает на массив размера WIDTH.

Конструктор и глобальные вары:

Matrix::Matrix(int width, int height, float **array){ 
    this->height = height; 
    this->width = width; 
    this->array = array; 
} 
//in Matrix.h: 
int width, height; 
float ** array; 

До этого момента все в порядке. Теперь я хочу, чтобы на самом деле использовать массив, напечатав его:

void Matrix::printMatrix(){ 
    for (int h = 0; h < height; h++){ 
     for (int w = 0; w < width;w++){ 
      std::cout <<array[height][width]<<" "; 
     } 
     std::cout << std::endl; 
    } 
} 

И это, где это идет не так: программа просто вылетает. Я почему-то понимаю, почему он сбой: я думаю, мне нужно получить, какой массив [h] указывает на (который представляет собой массив с плавающей точкой ширины), но попытка сделать это дает мне ошибку: невозможно преобразовать float * в float [] *. Что мне нужно сделать?

+5

массива [высота] [ширина] -> массив [ч] [ш]. Кроме того, std :: vector. Кроме того, boost.multiarray. Также https://gist.github.com/rmartinho/3959961 –

+0

Ох. Опечатка. После того, как я полностью пойму многомерный массив, я буду смотреть в векторы, но Im все еще учится, поэтому я не хочу спешить с шаблонами, пока не узнаю основы. – Cheiron

+1

std :: vector * is * основы. Ручное управление памятью - это передовой материал. –

ответ

3

The robot already answered your question:

for (int h = 0; h < height; h++){ 
    for (int w = 0; w < width;w++){ 
     std::cout <<array[height][width]<<" "; 
        //  ^^^^^^ ^^^^^ 
    } 
    std::cout << std::endl; 
} 

Какие записи вы доступ? Ну, всегда array[height][width]. Однако array содержит только height элементов, поэтому этот доступ приводит к неопределенному поведению. Просто применить переменный контур h и w:

for (int h = 0; h < height; h++){ 
    for (int w = 0; w < width;w++){ 
     std::cout << array[h][w]<<" "; 
    } 
    std::cout << std::endl; 
} 

Но все-таки, это далеко от оптимального. Вы должны использовать тип, который легче использовать, например std::vector:

typedef std::vector<float> float_vector; 
typedef std::vector<float_vector> float_matrix; 
float_matrix matrix(HEIGHT,float_vector(WIDTH)); 

std::vector является одним из наиболее важных видов. Освоить.

1

Это потому, что 2-мерный массив и указатель на указатель не совпадают. Можете ли вы попробовать

float ** array to float (* array) [size]?

и изменение массива [высота] [ширина] массиву [ч] [ш]

1
void Matrix::printMatrix(){ 
    for (int h = 0; h < height; h++){ 
     for (int w = 0; w < width;w++){ 
      std::cout <<array[h][w]<<" "; 
     } 
     std::cout << std::endl; 
    } 
} 

не высота и ширина - это размер вас массив, использовать вас итераторы ч, ш

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