2016-04-01 13 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を宣言することもできますが、どちらかを動作させる方法を理解できませんでした。そしてそれが置かれたすべての方法にも申し訳ありません。これは私の初めての投稿です。標準C++ではこれは許可されていません:ライン67上の誤りについて

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(*)[4]'ではなく 'int'です。エラーが明確になるかどうかはわかりません。 – user657267

+0

ここにエラーがあります: – Jab2ak

+0

あなたのコードの 'numCols'は宣言されていません。それはタイプミスですか、それともあなたに私たちに言っていないエラーが増えていますか? –

答えて

0

誤りがある

int huffmanTree[numNodes][numCols]; 

だけ定数式は、配列の次元として使用することができます。

一部のコンパイラでは、このような配列を許可するために非標準の拡張を実装していますが、それほどうまくいきません。この拡張は、配列を必要とする関数に渡すまで拡張されていません。固定幅。

代わりにconst int numcols = 4;を使用するように問題を修正する可能性があります。


ライン28と31のエラーがpreOrder(tree[index][2]を呼び出すことによるものです。あなたの最初の引数はintですが、関数は配列へのポインタを期待しています。特定の行と列から始まる配列のスライスを作成しようとしている場合は、実際には不可能です。 tree, index, 2, tempIndex, treeDepth + 1を代わりに渡し、開始点を示す2つのパラメータを関数に追加する必要があります。それに応じて機能ロジックを変更すること。

関連する問題