Как передать динамический 2d массив строк в качестве параметра в C ++ - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь реализовать двоичное дерево в виде 2-мерного массива.Я хочу, чтобы пользователь ввел нужную высоту дерева, и программа должна дать соответствующий размер массива.Затем я хочу напечатать массив, поэтому мне нужно передать его в качестве параметра.Однако я получаю следующую ошибку:

arrayTree / main.cpp | 19 | ошибка: невозможно преобразовать 'std :: __ cxx11 :: string ** (*) [maxNumberOfNodes] {aka std ::__cxx11 :: basic_string ** (*) [maxNumberOfNodes]} 'в' std :: __ cxx11 :: string ** {aka std :: __ cxx11 :: basic_string **} 'для аргумента' 1 'в'void printTree (std :: __ cxx11 :: string *)' |

Пожалуйста, что является причиной ошибки и как ее исправить?

#include <iostream>
#include <string>
#include <math.h>

using namespace std;
void printTree(string** tree);
int main()
{
    int treeHeight = 0;
    int maxNumberOfNodes = 1;
    cout << "enter tree height";
    cin >> treeHeight;
    cout << treeHeight<< "\n";

    //create an array that can hold every combination for a given tree height
    maxNumberOfNodes = pow(2,treeHeight) - 1;
    string** tree [3][maxNumberOfNodes];
    cout << maxNumberOfNodes;
    printTree(tree);

}

 void printTree(string** tree){
//not fully implemented yet
    for(int i=0; i < sizeof(tree);  i++){
        cout << "*" << " ";
    }
}

Ответы [ 3 ]

3 голосов
/ 20 марта 2019
string** tree [3][maxNumberOfNodes];

- это синтаксис статического 2D-массива типа string **, где оба измерения должны быть объявлены как const.

Разница между статическим и динамическим массивом показана здесь: Многомерный массив переменных размеров в C ++

Вместо этого вы хотите написать что-то вроде

string** tree = new string*[3];
for(int i = 0; i < 3; i++)
   tree[i] = new string[maxNumberOfNodes];

Как прокомментировал @Remy Lebeau: на каждый случай new[] необходимо ответить вызовом delete[], например:

for (int i = 0; i < 3; i++)
    delete tree[i];
delete[] tree;

для удаления динамического выделения из кучи.

Как указал @drescherjm, sizeof(tree) недопустим, поскольку tree является просто указателем и не включает информацию о размере массива.

Вы можете решить эту проблему, дополнительно передав ему размеры вашего массива:

void printTree (string** tree, int dim, int dim2)

и переписать цикл в

for(int i = 0; i < dim; i++){
  for(int j = 0; j < dim2; j++){
    cout << tree[i][j]; //...
  }
}
1 голос
/ 20 марта 2019
string** tree [3][maxNumberOfNodes];

Здесь объявляется двумерный массив из string** указателей.Это не то, что вы хотите.Вместо этого вам нужен двумерный массив из string объектов, поэтому отбросьте указатели:

string tree [3][maxNumberOfNodes];

Кроме того, ваш printTree() не реализован правильно.Это должно быть реализовано более следующим образом:

void printTree(string** tree, int height) {
    for(int i = 0; i < 3;  i++) {
        for(int j = 0; j < height; j++) {
            // use tree[i][j] as needed ...
        }
    }
}

При этом, поскольку значение maxNumberOfNodes неизвестно до времени выполнения, синтаксис string tree [3][maxNumberOfNodes] объявляет переменную длину Массив , который официально не поддерживается стандартом C ++, только как расширение несколькими компиляторами C ++.Вместо этого вам нужно использовать new[], чтобы выделить 2-е измерение:

string* tree [3];
for(int i = 0; i < 3; ++i)
    tree[i] = new string[maxNumberOfNodes];

printTree(tree, maxNumberOfNodes);

for(int i = 0; i < 3; ++i)
    delete[] tree[i];

Или лучше использовать std::vector вместо:

std::vector<string> tree [3];
for(int i = 0; i < 3; ++i)
    tree[i].resize(maxNumberOfNodes);

Хотя в этом последнем случае вы выигралиневозможно передать tree параметру функции string**, поэтому вам придется соответствующим образом изменить код.

0 голосов
/ 20 марта 2019

вызов метода задается как

printTree(tree [3][maxNumberOfNodes]);

это работает для меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...