int colIsValid(int **board, int col, int size){ int i; int colary[size]; for(i=0; i<size; i++){ colary[i] = board[i][col]; } return rowIsValid(colary, size); }
XLL_DEC OPER *ohRemoveInvalidRows(OPER *xInputRange) { // initialize Function Call object boost::shared_ptr<reposit::FunctionCall> functionCall; reposit::Xloper xMulti; static OPER xRet; xRet.val.array.lparray = 0; try { functionCall = boost::shared_ptr<reposit::FunctionCall> (new reposit::FunctionCall("ohRemoveInvalidRows")); Excel(xlCoerce, &xMulti, 2, xInputRange, TempInt(xltypeMulti)); int numValidRows = countValidRows2(xMulti()); if (!numValidRows) return 0; int numCols = xMulti->val.array.columns; xRet.val.array.rows = numValidRows; xRet.val.array.columns = numCols; xRet.val.array.lparray = new OPER[numValidRows * numCols]; xRet.xltype = xltypeMulti | xlbitDLLFree; int i2 = 0; for (int i=0; i<xMulti->val.array.rows; ++i) { if (rowIsValid(xMulti(), i)) { for (int j=0; j<numCols; ++j) { int indexSource = i * numCols + j; int indexTarget = i2 * numCols + j; operToOper(&xRet.val.array.lparray[indexTarget], &xMulti->val.array.lparray[indexSource]); } i2++; } } return &xRet; } catch (const std::exception &e) { // free any memory that may have been allocated if (xRet.xltype & xltypeMulti && xRet.val.array.lparray) { for (int i=0; i<xRet.val.array.columns * xRet.val.array.rows; ++i) { if (xRet.val.array.lparray[i].xltype & xltypeStr && xRet.val.array.lparray[i].val.str) delete [] xRet.val.array.lparray[i].val.str; } delete [] xRet.val.array.lparray; } // log the exception and return a null pointer (#NUM!) to Excel reposit::RepositoryXL::instance().logError(e.what(), functionCall); return 0; } }
int boxIsValid(int **board, int r, int c){ int rcorner = r - r%3; int ccorner = c - c%3; int i, j, count; int boxary[9]; for(i=0, count=0; i<3; i++){ for(j=0; j<3; j++, count++){ boxary[count] = board[rcorner+i][ccorner+j]; } } return rowIsValid(boxary, 9); }
int validAtSquare(int **board, square sq){ int r = sq.r; int c = sq.c; return colIsValid(board, c, 9) && rowIsValid(board[r], 9) && boxIsValid(board, r, c); }
int countValidRows2(const OPER &xMulti) { int ret = 0; for (int i=0; i<xMulti.val.array.rows; ++i) ret += rowIsValid(xMulti, i); return ret; }