Указатель выходит за границы, что приводит к ошибке сегментации c ++ - PullRequest
0 голосов
/ 18 октября 2018

В настоящее время я выполняю задание, которое должно продемонстрировать мое понимание того, как эффективно использовать указатели и арифметику указателей в двумерном массиве.Назначение функции, приведенной ниже, состоит в том, чтобы получить доступ и проверить окружающие местоположения в массиве для любого заданного местоположения.Если окружающие местоположения находятся за пределами границ, местоположение игнорируется и не проверяется.К сожалению, когда вызывается функция, это приводит к ошибке сегментации (дамп памяти ядра).

После запуска отладчика и документирования моих результатов, которые можно найти [здесь] [1], я смог определить, чтоошибка заключается в bottom = *boardArr. Моим исходным аргументом для установки bottom, равного * boardArr, было установить bottom на начальный адрес boardArr, чтобы я мог проходить через другие места рядом с ним, чтобы я мог проверить их с помощью арифметики указателей,но это не так.Я также попытался установить bottom = nullptr, но ничего не возвращает на консоль.Если бы кто-то мог указать мне правильное направление, как решить мою проблему, я был бы очень признателен.

Обновление: инструкции для правил можно найти ниже:

Правила SimBacteria

  • Каждая ячейка имеет не более 8 соседей (ячейки на краю мира будут иметьменьше)
  • Если клетка содержит организм и имеет менее 2 соседей, организм умирает от одиночества.o Сосед - это организм в одной из 8 точек (или меньше, если на краю) вокруг клетки
  • Если клетка содержит организм и имеет более 3 соседей, она умирает от перенаселенности.
  • Если в пустом месте ровно три соседа, в этом месте рождается организм.
  • Все рождения и смерти происходят одновременно.o В мире нельзя вносить
    изменений до тех пор, пока не будут протестированы все ячейки.

// Симуляторы остаются популярным жанром видеоигр, и вы решили воспользоваться их успехом, разработав дизайнSimBacteria.// Учитывая область, случайно населенную одноклеточными организмами, игроки смогут наблюдать за тем, как их культуры процветают (или умирают) на протяжении многих поколений бактерий.// Ваша программа будет управлять симуляцией и отображать каждое поколение перед записью последнего поколения в файл.

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



using namespace std;
bool  inbounds( int &rows, int &cols, int i, int j);
void rules(char** boardArr, int cols,  int rows, char** updateArr);
int update(char**boardArr);
char tmp;
int main()
{

    char**boardBegin;//reset pointers
    char**UboardBegin;//resets pointers
    char**updateArr;
    char**boardArr;
    char*ptr;
    int gen;
    char check;
    fstream inFile;//open file
    int rows=0;
    int cols =0;
    string line;//read each char from file
    cout <<"\t"<< "Bacteria Generation Simulation" << "\n\n";

    inFile.open("simbac.txt", ios::in |ios::out);
//input validation
    if (inFile.fail())
    {
        cout << "Unable to open file";
        exit(1);
    }

    cout<<"Enter generation amount: ";
    cin>>gen;
    while(gen <= 0 || gen > 10) //input validation
    {
        //acount for char entry later
        cout<<"Error, try again\n";
        cin>>gen;
    }
    //cout<<"Before loop"<<endl;



//determine number of cols and rows

    while (getline(inFile, line))
    {
        cols = line.length();
        rows++;
    }

//parsing file into boardArr
        boardArr = new char*[rows];
        updateArr = new char*[rows];
        boardBegin = boardArr;
        UboardBegin = updateArr;
        for(int i =  0; i < rows; i++, boardArr++,updateArr++)
        {
            boardArr[i] = new char[cols];
            updateArr[i] = new char[cols];

            inFile.clear();//resets file read
            inFile.seekg(0, ios::beg);//resets pos of file read
        }

        boardArr = boardBegin;//Resets pointer
        updateArr=  UboardBegin;//Resets pointer
        //cout<<"Entering "<<endl;
        inFile.seekg(0, ios::beg);

//Inserting stuff into 2d arry
        for(int i = 0; i <= rows; i++) //rows
        {

            //cout<<"Inside inserting stuff into 2d arry"<<endl;

            ptr = *boardArr;
            //cout<< i<<endl;
            for(int j = 0; j <= cols; j++) //cols
            {
                cout<<*ptr;
                ptr++;//moves to the next address
            }

            cout<<endl;
            }
            //run until reaches gen amount
for(int i = 0 ; i <= gen; i++)
  {
      //cout<<"Entering "<< i<<endl;

    rules(boardArr,cols, rows, updateArr);


  }
  return 0;
    }







//move through string by parsing  to insert each char into array element position

void rules(char** boardArr,int cols, int rows, char**updateArr)
{
  char *current;
  char *pos;
  char *upos;
  char n;
  char* top = nullptr;
  char* bottom = nullptr;
  //cout<<"Before  for loop"<<endl;

  for(int i = 0; i < rows; i++, boardArr++,updateArr++) //rows
  {
      char ncount = 0;
      if(i < rows -1)
      {

          boardArr++;
         // bottom = *boardArr;
          boardArr--;//resets
      }
      else
      {
          bottom = nullptr;
      }
      pos = *boardArr;//
      //cout<<"Before  for loop"<<endl;

      for(int j = 0; j < cols; j++, pos++, upos++) //cols
      {
          //<<"Inside for loop"<<endl;

          //n = *pos;
          *upos = n;
          if(j != 0)
          {
              pos--;
              if(*pos = '*')
              {
                  ncount++;
                  //moves to the right
              }
              pos++;
              if(j != cols -1)
              {
                  pos++;
                  if(*pos = '*')
                  {
                      ncount++;

                  }
                  pos--;
              }
          }
          else
          {
              pos++;
              if(*pos = '*')
              {
                  ncount++;

              }
              pos++;
          }


          if(top != nullptr)
          {
              pos = j + top;//moves to the top right
              if(*pos = '*')
              {
                  ncount++;

              }
              pos++;

              if(j != 0)
              {
                  pos--;
                  if(*pos = '*')
                  {
                      ncount++;
                      //moves to the right
                  }
                  pos++;
                  if(j != cols -1)
                  {
                      pos++;
                      if(*pos = '*')
                      {
                          ncount++;

                      }
                      pos--;
                  }
              }
              else
              {
                  pos++;
                  if(*pos = '*')
                  {
                      ncount++;

                  }
                  pos++;
              }
          }

          if(bottom != nullptr)
          {
              pos = j + bottom;
              if(*pos = '*')
              {
                  ncount++;

              }
              pos++;

              if(j != 0)
              {
                  pos--;
                  if(*pos = '*')
                  {
                      ncount++;
                      //moves to the right
                  }
                  pos++;
                  if(j != cols -1)
                  {
                      pos++;
                      if(*pos = '*')
                      {
                          ncount++;

                      }
                      pos--;
                  }
              }
              else
              {
                  pos++;
                  if(*pos = '*')
                  {
                      ncount++;

                  }
                  pos++;
              }


          }
          //If a cell contains an organism and has fewer than 2 neighbors, the organism dies of loneliness.
          if(ncount < 2 || ncount > 3)
          {
              *upos = ' ';
          }
          else if(ncount == 3)
          {
              *upos = '*';
          }






      }
      top = *boardArr;

  }
}
/*
bool  inbounds( int &rows, int &cols, int i, int j)
{
if();


}

int update(char**boardArr)
{
// boardArr = uboardArr;//copies content from old board into new board

//make changes to uboardArr here


//return UboardArr;
}
//open file print

*/
...