2016-04-01 18 views
0

Dizine dayalı bir ağaç üzerinden değiştirilmiş bir ön sipariş geçmesi gereken bir ev ödevi üzerinde çalışıyorum ve diziyi geçmem gerekiyor işlevi kullanmak için ancak int için int(*)[4] geçersiz bir dönüşüm olduğunu söyleyerek bu işlevin bir hatayı almaya devam ediyorum ve neden olduğunu anlayamıyorum. Herhangi bir yardım büyük takdirHata: int işlevinden int'e int (*) [4] arasındaki geçersiz dönüşüm

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

:

İşte benim kod kopyası. Ve ayrıca işaretçileri kullanamıyorum ve ayrıca huffmanTree'yi global olarak ilan edebilirim ancak bunu nasıl çalıştıracağımı anlayamadım. Ve her şey yolunda için üzgünüm. Bu benim ilk kez gönderim. Standart C++, bu izin verilmez: hat 67 üzerinde bir hata ile ilgili

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]' ifadesi 'int' değil, int (*) [4]' dir, hatanın daha açık olup olmadığından emin değilim. – user657267

+0

İşte hatalar: Kodunuzdaki – Jab2ak

+0

'numCols' eksik. Bu bir yazım hatası mı, yoksa bize söylemediğin daha fazla hata var mı? –

cevap

0

:

hatalardır

int huffmanTree[numNodes][numCols]; 

sadece sabit ifadeler dizinin boyut olarak kullanılabilir.

Bazı derleyiciler, bu tür bir diziye izin vermek için standart olmayan bir uzantı uygularlar, ancak çok iyi değildir: derleyici için bu uzantı diziyi bir dizi diziyi bekleyen bir işleve iletmeye uzanmaz. sabit genişlik.

Muhtemelen, const int numcols = 4; kullanmak yerine sorununuzu giderir. hat 28 ve 31


hataları preOrder(tree[index][2] arayarak kaynaklanmaktadır. İlk bağımsız değişkeniniz bir int ancak işlev işaretçiyi diziden bekler. Belirli bir satır ve sütunda başlayan dizinin bir dilim oluşturmaya çalışıyorsanız, bu aslında mümkün değildir. Bunun yerine, tree, index, 2, tempIndex, treeDepth + 1'u geçmek zorundasınız, fonksiyonunuza başlangıç ​​noktasını gösteren 2 tane daha parametre ekleyiniz; ve işlev mantığını buna uygun olarak değiştirmek.

İlgili konular