Проблема с 2D-массивом

#c #arrays #multidimensional-array

#c #массивы #многомерный массив

Вопрос:

Я пытаюсь отобразить сетку судоку, используя 2D-массив на C . Я тестировал код, сравнивая входные данные с «дампом» 2d-массива. Массив имеет размер 9×9. Моя проблема в том, что все первые 8 столбцов идеальны. Но последний столбец кажется неправильным в восьми из 9 случаев. Почему это может быть?

код:

 #include <iostream>
#include <fstream>
#include <string>

int i = 0;
int j = 0;
const char test[12] = {'e', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*'};
std::string abc = "";

// Class to map out a sudoku grid
class grid {

    public:

    char board[8][8];

    void mapChars(std::string fileName) {

            int x = 0;
            int y = 0;  

            std::string line;
            std::ifstream myfile (fileName.c_str());

            if (myfile.is_open()) {
                while (getline(myfile,line)) {
                    for(std::string::size_type i = 0; i < line.size();   i) {
                        if(strchr(test, line[i]) != NULL){
                            if (line[i] == 'e') {
                                y  ; x=0;
                            } else {
                                    board[y][x] = line[i];
                                    x  ;

                            }
                        }
                    }   
                } myfile.close();
            }
    }

    void dumpMap() {
        while(j < 9){
            while(i < 9){

            std::cout << board[j][i] << ' ';
              i;            

            } 
            std::cout << std::endl;
              j;
            i = 0;
        }
    }
} sudoku;

int main() {

    sudoku.mapChars("easy1.map");
    sudoku.dumpMap();
    std::cin >> abc;
    return 0;

}
 

Комментарии:

1. Разве доска судоку не должна определяться 9x9 массивом?

2. «массив имеет размер 9×9» Или НЕТ?

3. как объясняет @wolfPack88, я запутался между объявлением и индексацией

Ответ №1:

Здесь вы объявляете массив размером 8 на 8: char board[8][8] . Если вы хотите, чтобы оно было 9 на 9, используйте char board[9][9] . Я предполагаю, что вы перепутали объявление с индексацией. При объявлении char board[8][8] board имеет первый индекс, который начинается с 0..7 и аналогичного второго индекса.

Причина, по которой вы получаете вывод значения вместо ошибки, заключается в том, что вывод и индексирование доступа вне границ не определены. Когда ваш код пытается получить доступ board[i][j] , исполняемый файл использует значения, которые вы ему дали, i и j определяет, из какой части памяти он должен извлекать данные. Если i и j находятся за пределами, ваш исполняемый файл выводит память, с которой board на самом деле вообще не связан, и фактически является мусорными значениями, с которыми вы столкнулись.

Комментарии:

1. Ах… Такая ошибка новичка. Так почему же он фактически вернул значение?

2. Это неопределенное поведение. Я отредактирую свой ответ, чтобы объяснить это немного подробнее.