В настоящее время я выполняю задание, которое должно продемонстрировать мое понимание того, как эффективно использовать указатели и арифметику указателей в двумерном массиве.Назначение функции, приведенной ниже, состоит в том, чтобы получить доступ и проверить окружающие местоположения в массиве для любого заданного местоположения.Если окружающие местоположения находятся за пределами границ, местоположение игнорируется и не проверяется.К сожалению, когда вызывается функция, это приводит к ошибке сегментации (дамп памяти ядра).
После запуска отладчика и документирования моих результатов, которые можно найти [здесь] [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
*/