Лично я пошел бы с опцией не использования размещения, нового на массиве, и вместо этого использовал бы размещение, новое на каждом объекте в массиве индивидуально. Например:
int main(int argc, char* argv[])
{
const int NUMELEMENTS=20;
char *pBuffer = new char[NUMELEMENTS*sizeof(A)];
A *pA = (A*)pBuffer;
for(int i = 0; i < NUMELEMENTS; ++i)
{
pA[i] = new (pA + i) A();
}
printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);
// dont forget to destroy!
for(int i = 0; i < NUMELEMENTS; ++i)
{
pA[i].~A();
}
delete[] pBuffer;
return 0;
}
Независимо от метода Вы используете, удостоверьтесь, что Вы вручную уничтожаете каждый из тех объектов в массиве перед удалением pBuffer поскольку Вы могли закончить с утечками;)
Примечание : Я не скомпилировал это, но я думаю, что это должно работать (я нахожусь на машине, которой не установили компилятор C++). Это все еще указывает на точку:) Надеюсь, что это помогает в некотором роде!
<час>Редактирование:
причина, которую это должно отслеживать число элементов, состоит в том так, чтобы это могло выполнить итерации через них, когда Вы звоните, удаляют на массиве и удостоверяются, что деструкторы называют на каждом из объектов. Если бы это не знает, сколько существует это, не был бы в состоянии сделать это.
Пролог - это другой способ мышления о программах: вы должны мыслить логически.
Прежде всего A: - B, C, D
означает A истинно (успешно), если B, C и D истинны .
Фрагмент кода, который вы опубликовали, проверяет правильность головоломки судоку, есть три условия:
Как это работает?
судоку (строки) верно, если:
длина (строки, 9)
-> в строках 9 элементов maplist (_length (9), Rows)
-> maplist
проверяет предикат (первый параметр) для каждого элемента списка (второй параметр). Это означает, что каждая строка должна иметь длину 9. maplist (all_distinct, Rows)
-> то же, что и раньше, но мы проверяем, есть ли в каждой строке отдельные (не равные попарно) элементы. transpose (Rows, Columns), maplist (all_distinct, Columns)
-> мы транспонируем строки в столбцы, чтобы проверить, не все различны, также выбрав их по вертикали Rows = [A, B, C, D, E, F, G, H, I]
-> разбивает список строк и помещает каждую в разные переменные A, B, C, D ... так что A будет первой строкой, B второй и так далее блоки (A, B, C), блоки (D, E, F), блоки (G, H , I)
-> этот предикат должен быть истинным для троек строк. Давайте поговорим о части блоков
, которую довольно забавно понять. Мы хотим проверить, что каждый блок 3x3 содержит разные значения. Как мы можем это сделать?
Предположим, у нас 3 строки, условие должно выполняться для первых трех элементов каждой строки (первый блок 3x3), для элементов с 4-го по 6-й (второй блок) и с 7-го по 9-й (третий блок).
Итак, мы можем мыслить рекурсивно: блоков ( [], [], [])
тривиально верно, у нас есть пустые списки.
case блокирует ([A, B, C | Bs1], [D, E, F | Bs2], [G, H, I | Bs3])
выбирается, когда вы вызываете предикат блоков
с параметрами, которые являются списком с ТОЛЬКО 3 элементами. Таким образом, мы можем проверить, все ли A, B, C, D, E, F, G, H, I различны, затем мы вызываем блоки
рекурсивно, используя в качестве параметров списки остатков (без первых трех элементов) . Это то, о чем идет речь в Prolog!
Итак, блоки
будут вызываться первыми с тремя строками по 9 элементов, он проверит, что первые 3 каждой строки отличны, и вызовет себя с 3 списками из 6 элементов,
sudoku / 1 в основном описывает ограничения, которым должно удовлетворять решение судоку, где доска представлена в виде списка из девяти списков длины девять. Проблема / 2 присваивает частично созданной плате номер проблемы. Чтобы использовать его, вы должны выполнить
? - problem (1, Board), sudoku (Board).
Вы должны прочитать предикаты, используемые в документации .