Следуйте совету Рубанцева.
Другие бубны не помогут.
Это не проблемы сборок. Такие ошибки компилятор выдаёт и с другими сторонними библиотеками.
У компилятора время от времени ум заходит за разум.
Если дать ему время очухаться, то всё снова заработает.
На Си-шарпе все сборки работают. Я целую книгу написал про SFML на Си-шарпе. Там проблем нет.
PascalABC.NET - прекрасная вещь, но всё же хотелось бы большей надёжности в поведении.
Я стараюсь рекламировать и в меру сил продвигать эту систему, но подобные ошибки убивают энтузиазм.
Дело в том, что в Combinations(2) возвращался всё время один массив. Пришлось делать клоны всякий раз. Стало ещё более неэффективно. Зато сохраняется запись “в строчку”.
Видимо, надо сделать функцию NextCombination, которая переставляла бы элементы массива. Тогда бы программист думал бы, как сделать клоны этого массива и потом отсортировать.
Вы забыли залить файл SyntaxVisitors\PatternsVisitors\ReplaceNamesInIsVarVisitor.cs на гитхаб - без него ничего не собирается.
А файл TestSuite\pointers12.pas:
type
TPerson = record
fam: string[15];
name: string[10];
id: integer;
end;
type
PPerson = ^TPerson;
var x: array[1..3] of TPerson;
p: PPerson;
procedure test1;
begin
var p1: PPerson := @x[1];
for var i := 1 to 1000 do
begin
p1^.name := 'abc';
assert(p1^.name = 'abc');
end;
end;
procedure test2;
begin
var p2: PPerson := @x[2];
for var i := 1 to 1000 do
begin
p2^.name := 'abc';
assert(p2^.name = 'abc');
end;
end;
begin
{$omp parallel sections}
begin
test1;
test2;
end;
p := @x[1];
p^.name := 'abc';
assert(p^.name = 'abc');
p := @x[2];
p^.name := 'def';
assert(p^.name = 'def');
end.
У меня на ноутбуке время от времени падает. И понятно почему - @x[] создаёт нестабильный указатель, который сломается когда ему захочется.
На пк не падало, наверное, только потому что там не было таких проблем с объёмом RAM…
Я понимаю что эта конструкция нужна “лишь бы совместимость” - но, пожалуйста, выкиньте эту жуть из тестов. Тесты это только для того - что точно всегда должно работать. А то мешает проверять стабильность моих изменений…
Я вам уже несколько раз объяснял, почему @a[] - не может быть стабильно. Оно или даёт утечку памяти, или падает. Редко, но падает.
Чтоб упало - нужна очень неудачная сборка мусора между созданием указателя и использованием данных.
Если у вас по хотя бы 16гигов оперативки - понятно что вам нереально увидеть эту ошибку. Но я ещё неделю буду со своим старым ноутбуком, у которого всего 4гига. Он задыхается от одного только браузера, и без студии.
Ну, я пишу не о проблеме слабых компов. “обычно не упадёт, но если вы очень неудачны упадёт” - это ужасное поведение. Если что, понять что пошло не так - будет нереально. Поэтому такой код не должен быть в тестах - в том, что используется для поиска проблем.
В его фиксе этот иногда_падающий файл теста и добавили. GCHandle только запрещает удалять объект. А память фиксирует именно GCHandleType.Pinned.
Да и кстати, раз уж подняли эту тему - пожалуйста, добавьте хоть предупреждение, для записи @a[...], где a - или массив, или строка. С текстом в этом духе:
Запись @a[...] приводит к утечкам памяти [и редким вылетам], её использование не рекомендуется. Используйте типы вроде GCHandle.
А то я хоть и написал об этом в общей справке OpenCL/OpenGL, но всё равно как то боязно, что народ будет насматриваться старых туториалов (а новых для OpenGL в PABC.Net в принципе нет), использовать @[] в своём коде, видеть что память утекает и думать что паскаль/модуль какой то не такой.
Стало неправдой. Вы не фиксируете память массивов записей с полем типа string, вам это GCHandle не позволит.
Какая разница, на сколько редко они могут падать - если всё равно когда то да упадут? И таки уже упало, хоть у меня и были более благоприятные для падения условия…
Вот я говорю - добавлять код с неопределённым поведение в тесты принципиально неправильно.
Там - только про утечку памяти. Случай с записями, содержащими string - вряд ли встретится в OpenCL и OpenGL. Подробнее - почитайте сами, страница справки Маршлинг >> Массивы.
Конечно, Debug.WriteLine - это хак, совершенно непонятно как работающий.
Но он всё равно показывает, что массив может перемещаться в памяти, когда системе захочется.