2016-04-01 13 views
0

Ich arbeite an einem Hausaufgaben-Projekt, wo ich eine modifizierte Preorder Traversal durch einen Array-basierten Baum tun muss, und ich muss das Array übergeben zu der Funktion, um es zu benutzen, aber ich erhalte einen Fehler in der Funktion, die sagt, dass es eine ungültige Umwandlung von int zu int(*)[4] ist und ich kann anscheinend nicht herausfinden, warum.Fehler: ungültige Konvertierung von int zu int (*) [4] in Funktionsaufrufe

Hier ist eine Kopie meines Code:

#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; 
    } 

Jede Hilfe wäre sehr dankbar. Und auch ich kann Zeiger nicht verwenden und ich kann HuffmanTree auch als global deklarieren, aber konnte nicht herausfinden, wie man das auch zum Arbeiten bringt. Und auch Entschuldigung für die Art, wie alles platziert wurde. Dies ist meine erste Zeitbuchung.

Die Fehler sind:

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

Der Ausdruck 'tree [index] [2]' ist ein 'int', kein' int (*) [4] ', ich bin nicht sicher, ob der Fehler klarer sein könnte. – user657267

+0

Hier sind die Fehler: – Jab2ak

+0

'numCols' in Ihrem Code ist nicht deklariert. Ist das ein Tippfehler oder gibt es mehr Fehler, von denen Sie uns nichts erzählen? –

Antwort

0

In Bezug auf Ihre Fehler in Zeile 67: in Standard C++ dies ist nicht zulässig:

int huffmanTree[numNodes][numCols]; 

Nur konstante Ausdrücke wie Array-Dimensionen verwendet werden können.

Einige Compiler implementieren eine nicht standardmäßige Erweiterung, um diese Art von Array zuzulassen, aber nicht sehr gut: Es scheint, dass diese Erweiterung für Ihren Compiler nicht auf eine Funktion erweitert, die ein Array von erwartet feste Breite

Möglicherweise würde es Ihr Problem beheben, stattdessen const int numcols = 4; zu verwenden.


Die Fehler auf der Leitung 28 und 31 sind durch preOrder(tree[index][2] zu nennen. Ihr erstes Argument ist ein int, aber die Funktion erwartet Zeiger auf Array. Wenn Sie versuchen, einen Teil des Arrays ab einer bestimmten Zeile und Spalte zu erstellen, ist das nicht möglich. Sie müssten stattdessen tree, index, 2, tempIndex, treeDepth + 1 übergeben, indem Sie Ihrer Funktion zwei weitere Parameter hinzufügen, die den Startpunkt angeben. und Modifizieren der Funktionslogik entsprechend.

Verwandte Themen