tiles[x][y+1]
, если y
является максимальным допустимым значением, не будет NULL
, кроме как по милости. Это выходит за пределы, и как только вы выходите за пределы, все ставки прекращаются. Вы вызвали неопределенное поведение , и почти все может произойти. Даже то, что вы ожидали.
То же самое относится к сообщенному месту крушения, tiles[x - 1][y - 1]
.
Единственный способ, кроме взятия и сброса всего сайта с орбиты, состоит в том, чтобы проверить индекс, чтобы убедиться, что он не пробивает границы массива перед использованием индекса в массиве. Возможно, вам понадобится функция, чтобы справиться с этим.
void assign_if(Type & neighbour, int x, int y)
{
if(x >= 0 && x < width && y >= 0 && y < height)
neighbour = tiles[x][y];
}
и назовите его
assign_if(neighbours[0], x, y+1);
и позже
assign_if(neighbours[0], x-1, y-1);
Невозможно вернуть сырой массив из функции. Массив выходит из области видимости и указатель на него становится недействительным. Либо передайте массив в качестве другого параметра, либо используйте std::array
или std::vector
, оба из которых могут быть возвращены. Благодаря Copy Elision умный компилятор, вероятно, уменьшит затраты на копирование.
Пример:
std::array TileManager::GetNeighbours(int x, int y)
{
std::array neighbours;
...
return neighbours;
}
std::array TileManager::GetNeighbours(int c, int r)
{
std::array neighbours;
const int y[] = { -1, -1, -1, 1, 1, 1, 0, 0 };// 8 shifts to neighbors
const int x[] = { -1, 0, 1, -1, 0, 1, -1, 1 };// used in functions
for (int i = 0; i < 8; ++i)// visit the 8 spaces around it
if (inField(r + y[i], c + x[i]))
neighbours[i] = tiles[r + y[i]][c + x[i]];
else
neighbours[i] = Tile::Type::Void;
return neighbours;
}
bool TileManager::inField(int r, int c)
{
if (r < 0 || r >= 25) return false;
if (c < 0 || c >= 25) return false;
return true;
}
Этот ответ напрямую связан с решением поставленной задачи. Смотрите ответ Kaz для описания более практичного решения, которое торгует немного памяти, чтобы полностью исключить необходимость тестирования и генерации массива neighbours
.
Amazon S3 реализован с помощью архитектуры, описанной в Газете Динамо:
http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html
Бумага объясняет последовательное хеширование, и как и почему гарантия является "возможной непротиворечивостью".
Разрешение конфликтов, о котором они говорят для Динамо, не выставляется пользователям S3. Это используется внутренне в приложениях Amazon, но для S3, единственное разрешение конфликтов является последними победами записи.
Править: Werner Vogels сказал, что "Динамо непосредственно не выставляется внешне как веб-сервис; однако, Динамо и подобные технологии Amazon привыкли к частям питания нашей Amazon Web Services, таким как S3". http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html
Я подчеркнул бы, что он не говорит, что компоненты доли S3 и Динамо, явно говорит, что само Динамо является одной из технологий то питание S3. Все, что я видел от S3, включая протесты, составляется путем предположения, что S3 является необычной оберткой веб-сервисов вокруг Динамо с аутентификацией, учетом и твердостью конфликта последних побед записи, которая невидима для пользователя.
Исходный вопрос был о механизме базовой системы хранения для S3. Это - явно не распределенная файловая система как HDFS или нереляционная база данных как CouchDB. Динамо исполняет эту роль.
Это ближе к 2, хотя с содержимым, сохраненным как «BLOB», без заботы о системе о содержании, в то время как CouchDB делает. Внутреннее хранилище использует локальную БД (BDB?) Для узлов кластеров, используемых для хранения нескольких копий. Чтения могут идти на любой узел, имеющий копию, как и записи, но записи должны быть разрешены, чтобы избавиться от конфликтов. Как упоминает Кевин, это гарантирует «возможную согласованность», но не дает строгих гарантий того, когда или какой выигрыш при записи (из внешнего POV; внутренне это определено).
Чтение документов Dynamo полезно для понимания многих концепций, но Реализация AFAIK отличается. Динамо используется внутри Amazon для других целей. Есть также реализации с открытым исходным кодом обоих; CouchDB, очевидно, тоже очень интересен.