0

Я новичок в C++ и пытаюсь написать код для многомерного массива с использованием двойных указателей. Это мой код:Сбой кода на C++ при попытке присвоить значение

Класс Декларация:

class magicMat{ 

    private: 
     int** ptrnum; 

    public: 
     void init(int); 
     void Display(int); 
     void set(int); 
     void message(); 
     void errorhandling(int);  
}; 

Функция определения:

void magicMat::init(int input) 
{  
    ptrnum=new int*[input]; 

    for (int row=0;row<input;row++) 
     ptrnum[row]=new int[input]; 

    for(int x=0;x<input;x++) 
    { 
     for (int y=0;y<input;y++) 
     { 
      *(ptrnum[x]+y)=0; 
     } 
    } 
} 

void magicMat::set(int input) 
{ 
    int row=1,col=input/2,otherdiag=0; 

    for(int value=1;value<=input*input;value++) 
    { 
     if (*(ptrnum[row]+col)>0) 
     { 
      row=row+2; 
      if(row>input) 
       row=row-input; 

      col--; 
      if(col<1) 
       col=input; 
     } 
     *(ptrnum[row]+col)+=value; 
     *(ptrnum[0]+col)+=value; 
     *(ptrnum[row]+0)+=value; 

     if (row==col) 
      *(ptrnum[0]+0)+=value;   

     if (row+col==input+1) 
      otherdiag+=value;     
/*                  */ 
/*  Determine where new row and col are        */ 
/*                  */ 
     row--; 
     if (row < 1)      /* If row exceeds side then */ 
      row = input;     /* goto other side.   */ 
     col++; 
     if (col > input)     /* If col exceeds side then */ 
      col = 1; 
    }  
} 

Основная функция:

int main() 
{ 
    int num; 
    magicMat newMat; 
    newMat.message(); 
    while(1) 
    { 
     cin>>num; 
     if (cin.good()) 
     { 
      newMat.errorhandling(num); 
     } 
     else if (!isdigit(num)) 
     { 
      cout<<"Please enter only digits"<<endl; 
     }  
     newMat.init(num); 
     newMat.set(num); 
     newMat.Display(num); 
    } 
    cout<<"\nBye bye!\n"<<endl; 
    return 0; 
} 

Он работает в функции init, но когда в set function Я пытаюсь проверить значение, которое он ломает на первом if заявление в функции данных set.

+2

Попробуйте просто 'ptrnum [x] [y]'. Если нет никакой реальной причины, не используйте вектор векторов. Это намного безопаснее. 'vector > matrix;' – chris

+0

Ну, меня попросили использовать двойные указатели. Это домашнее задание. Корри не помечал его как HW. Теперь он – SB26

+1

. Кстати, использование функции «init», как правило, противоречит духу C++. Объекты должны быть инициализированы с помощью конструкторов - таким образом невозможно случайно * забыть * инициализировать их. http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming) – HostileFork

ответ

0

Вы выходите за пределы своего массива. Подобно тому, как, например, если я запускаю свой код и ввести 5 как моя первая цифра, которая устанавливает значение input к 5, посмотрите на эти строки в конце вашего set функции:

row--; 
if (row < 1) 
    row = input; 

В конце первый раз через цикл в вашей функции set, прямо перед этими строками, row равен 1. Эти три строки выполняются, и в результате row устанавливается равным 5.

В начале следующего цикла в set, вы делаете это:

if (*(ptrnum[row]+col)>0) 

Проблема заключается в том, что ptrnum является массив 5х5, что означает действительные индексы 0-4. Однако в конце предыдущего цикла вы устанавливаете row равным 5, и, как результат, вы индексируете за пределами ptrnum и таким образом разбиваете свою программу.

Я настоятельно рекомендую либо выполнить свой код в отладчике, либо если вы не знаете, как это сделать, по крайней мере, введите в команду cout операторы в вашей функции set, чтобы вы могли проверить, что переменные устанавливаются к тому, что, по вашему мнению, они должны получить.

Удачи вам!