2016-04-01 2 views
0

Я работаю над проектом домашней работы, где мне нужно сделать измененный обход предварительного порядка через дерево на основе массива, и мне нужно передать массив к функции для ее использования, но я продолжаю получать ошибку в функции, заявляя, что это неверное преобразование от int до int(*)[4], и я не могу понять, почему.Ошибка: неверное преобразование из int в int (*) [4] при вызове функций

Вот копия моего кода:

#include <iostream> 
    #include <fstream> 

    char code[10]; 

    void preOrder(int tree[][4], int index, int treeDepth) 
    { 
      int tempIndex; 
      if(tree[index][2] == -1 && tree[index][3] == -1) 
      { 
        std::cout << char(tree[index][1]) << ": "; 

        for(int i = 0; i < treeDepth; i++) 
          std::cout << code[i]; 

        std::cout << "\n" 
      } 
      else 
      { 
        for(int i = 0; i < 2; i++) 
        { 
          code[treeDepth] = 0; 
          tempIndex = tree[index][2]; 
          preOrder(tree[index][2], tempIndex, treeDepth + 1); 
          code[treeDepth] = 1; 
          tempIndex = tree[index][2]; 
          preOrder(tree[index][3], tempIndex, treeDepth + 1); 
        } 
      } 

      return; 
    } 

    int main() 
    { 
      int numNodes = 0, i = 0, j = 0; 
      int root = 0, treeDepth = 0; 
      int numcols = 4; 

      std::fstream inFile; 
      inFile.open("tree.dat"); 

      inFile >> root; 
      inFile >> numNodes; 

      int huffmanTree[numNodes][numCols]; 

      for(i = 0; i < numNodes; i++) 
        for(j = 0; j < numCols; j++) 
          inFile >> huffmanTree[i][j]; 

      preOrder(huffmanTree, root, treeDepth); 

      inFile.close(); 
      return 0; 
    } 

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

Ошибки:

ola.cpp: In function ‘void preOrder(int (*)[4], int, int)’: 
ola.cpp:28:53: error: invalid conversion from ‘int’ to ‘int (*)[4]’ [-fpermissive] 
ola.cpp:10:6: error: initializing argument 1 of ‘void preOrder(int (*)[4], int, int)’ [-fpermissive] 
ola.cpp:31:53: error: invalid conversion from ‘int’ to ‘int (*)[4]’ [-fpermissive] 
ola.cpp:10:6: error: initializing argument 1 of ‘void preOrder(int (*)[4], int, int)’ [-fpermissive] 
ola.cpp: In function ‘int main()’: 
ola.cpp:67:39: error: cannot convert ‘int (*)[(((sizetype)(((ssizetype)numCols) + -1)) + 1)]’ to ‘int (*)[4]’ for argument ‘1’ to ‘void preOrder(int (*)[4], int, int)’ 
+3

Выражение 'tree [index] [2]' является 'int', а не' int (*) [4] ', я не уверен, что ошибка может быть более четкой. – user657267

+0

Вот ошибки: – Jab2ak

+0

'numCols' в вашем коде не объявлен. Это опечатка, или есть больше ошибок, о которых вы нам не рассказываете? –

ответ

0

Что касается вашей ошибки в строке 67: в стандарте C++ это не допускается:

int huffmanTree[numNodes][numCols]; 

только константные выражения могут быть использованы в качестве размерности массива.

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

Возможно, это исправит вашу проблему, вместо этого используйте const int numcols = 4;.


Ошибки на линии 28 и 31 связаны с вызовом preOrder(tree[index][2]. Ваш первый аргумент - int, но функция ожидает указатель на массив. Если вы пытаетесь создать срез массива, начиная с определенной строки и столбца, это фактически невозможно. Вы должны были бы передать tree, index, 2, tempIndex, treeDepth + 1 вместо этого, добавив еще 2 параметра к вашей функции, которые указывают начальную точку; и соответственно модифицирует логику функций.

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