2017-03-09 84 views
-1

我試圖編寫一個數獨程序來驗證已完成的棋盤。這是我到目前爲止的代碼:無法將'int *'轉換爲'int *(*)[9]'作爲參數'1'

#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <pthread.h> 

using namespace std; 

int *board[9]; 
int row, col; 
void is_row_ok(int* board[9][9]); 
void is_col_ok(int* board[9][9]); 
void is_square_ok(int* board[9][9]); 

int main() 
{ 
    for (int i = 0; i < 9; ++i) 
    { 
     board[i] = new int[9]; 
    } 

    string line; 
    ifstream myFile("Testfile1.txt"); 

    for (int row = 0; row < 9; ++row) 
    { 
     string line; 
     getline(myFile, line); 

     stringstream iss(line); 
     cout << endl; 

     for (int col = 0; col < 9; ++col) 
     { 
      string val; 
      getline(iss, val, ','); 
      if (!iss.good()) 
       break; 

      stringstream convertor(val); 
      convertor >> board[row][col]; 
      cout << board[row][col] << " "; 
     } 
    } 
    is_row_ok(&board[9][9]); //<-- error happens here 
    pthread_create(thread1, NULL, is_row_ok, board[9][9]); 
    //pthread_create(thread1, NULL, is_col_ok, board[9][9]); 
    //pthread_create(thread1, NULL, is_square_ok, board[9][9]); 

    cout << endl; 
    return 0; 
    } 

void is_row_ok(int board[9][9]) 
{ 
    int element_count = 0; 
    char element_value; 
    for (int i = 0; i < 9; ++i) 
    { 
     for (int j = 0; j < 9; ++j) 
     { 
      element_count = 0; 
      element_value = board[i][j]; 
      if (element_value != ' ') 
      { 
       for (int k = 0; k < 9; ++k) 
       { 
        if (board[i][k] == element_value) 
         element_count++; 
       } 
      } 
      if (element_count >= 2) 
      { 
       cout << "Row " << i << " is invalid." << endl; 
      } 
      else 
      { 
       cout << "Row " << i << " is valid." << endl; 
      } 
     } 
    } 
    //pthread_exit(NULL); 
} 

,我發現了以下錯誤:

attempt.cpp:45:24: error: cannot convert ‘int*’ to ‘int* (*)[9]’ for argument ‘1’ to ‘void is_row_ok(int* (*)[9])’ 
    is_row_ok(&board[9][9]); 

我不知道發生了什麼事。我在這裏和其他網站上看到了一堆類似的情況,我試圖實現他們的解決方案,但都沒有工作。如果任何人可以請幫助我找出我需要改變,這將不勝感激。

P.S.函數is_col_ok()和is_square_ok()與is_row_ok()函數非常相似,因此它們不包含在內。

P.P.S.如果你也可以看看我的pthread創建函數,並告訴我我是否已經正確地完成了它,如果不是,我需要更改

P.P.S.如果您需要任何額外的代碼,請不要猶豫,要求它

+0

發生此錯誤的原因是:board [9] [9]'解析爲int類型的值。所以你把這個地址取出來,然後用一個指向'int'的指針,也就是'int *'。這與您嘗試調用的函數期望的參數的值類型不匹配,因此編譯器錯誤。 – user268396

+0

'is_row_ok(&board [9] [9]);' - 你想說什麼? – AnT

+0

http://stackoverflow.com/questions/8767166/passing-a-2d-array-to-a-c-function – stark

回答

1

你混淆INTS的二維陣列,即int board[9][9]爲您board -parameter的類型is_row_ok與指針的一維數組到1D int的數組,即int *board[9]作爲您的董事會的類型。

這是確定的定義您的board爲指針的一維數組int[9]並初始化它爲你做的事:

int *board[9]; 
int main() { 
    for (int i = 0; i < 9; ++i) { 
     board[i] = new int[9]; 
    } 
    ... 

但你必須聲明+定義is_row_ok - 函數作爲

void is_row_ok(int* board[9]); 
... 
void is_row_ok(int* board[9]) { ... 

,並把它

is_row_ok(board); 

請注意,在原始代碼聲明中void is_row_ok(int* board[9][9]);void is_row_ok(int board[9][9]) { ...的定義不匹配,因此您有兩個(重載)函數is_row_ok,一個在main之前聲明但未定義的函數,另一個函數具有在之後定義的不同參數類型main

相關問題