Странные границы матрицы в c++

171
13 января 2019, 17:00

Вот есть функция:

int checkField(int chessPlate[8][8], int x, int y) {
    int near = 4;
    if (chessPlate[x][y + 1] == 1) {
        near--;
        cout << "1";
    }
    if (chessPlate[x][y - 1] == 1) {
        near--;
        cout << "2";
    }
    if (chessPlate[x + 1][y] == 1) {//здесь что-то не так
        near--;
        cout << "3";
        cout << chessPlate[x + 2][y] << " " << x + 1;
    }
    if (chessPlate[x - 1][y] == 1) {
        near--;
        cout << "4";
    }
    return near;
}

есть матрица 8х8,и в позиции 7,7 есть 1 (остальные ячейки 0).В функцию передаю эту матрицу,и числа 7 и 7.Должно вернуть 4,но возвращает 3.Как так?

Вот весь код:

#include "pch.h"
#include <iostream>
using namespace std;
int checkField(int chessPlate[8][8], int x, int y) {
    int near = 4;
    if (chessPlate[x][y + 1] == 1) {
        near--;
        cout << "1";
    }
    if (chessPlate[x][y - 1] == 1) {
        near--;
        cout << "2";
    }
    if (chessPlate[x + 1][y] == 1) {//здесь что-то не так
        near--;
        cout << "3";
        cout << chessPlate[x + 2][y] << " " << x + 1;
    }
    if (chessPlate[x - 1][y] == 1) {
        near--;
        cout << "4";
    }
    return near;
}
int main()
{
    int NumOfPix;
    cin >> NumOfPix;
    int chessPlate[8][8] = { {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0} };
    int **Pos= new int*[NumOfPix];
    for (int i = 0; i < NumOfPix; i++)//записываем в матрицу значения
    {
        Pos[i] = new int[2];
        cin >> Pos[i][0] >> Pos[i][1];
        Pos[i][0]--;
        Pos[i][1]--;
        chessPlate[Pos[i][0]] [Pos[i][1]] = 1;
    }
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            cout << chessPlate[i][j] << " ";
        }
        cout << endl;
    }
    int res = 0;
    for (int i = 0; i < NumOfPix; i++)//выщитываем периметр
    {
        res+=checkField(chessPlate, Pos[i][0], Pos[i][1]);
    }
    cout << res; 
}

res должен быть равен 4 при вводе 1,8 8

Answer 1

Вы пишете, что передаете в функцию матрицу и числа 7 и 7 - все верно? Смотрим что вы написали в той функции:

if (chessPlate[x][y + 1] == 1) {

это вторая строчка. Подставляем ваши значения:

if (chessPlate[7][7 + 1] == 1) {

как видим вы пытаетесь обратиться к элементу матрицы [7][8] но ваша матрица размерностью 8 на 8, тобишь самый нижний правый элемент это [7][7]. Тобишь у вас налицо выход за пределы массива.

READ ALSO
c++ взаимодействие с fortran

c++ взаимодействие с fortran

Как можно использовать фортран функций в С++?

185
Оптимизация алгоритма

Оптимизация алгоритма

Никак не могу выполнить задачу, заданную в ВУЗе - мой алгоритм не работает для больших значенийПодскажите какой-нибудь другой алгоритм для...

170
C++ Win API Как получить обьект из другого потока?

C++ Win API Как получить обьект из другого потока?

Создаю поток методом CreateThreadКак из основного потока получить доступ к обьекту созданому во втором потоке и вызвать его метод?

166