Динамические массивы и объекты

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
ВладиМИР48
Сообщения: 4
Зарегистрирован: 10 мар 2008, 23:00

Есть двойной динамический массив в объекте.
Например
Type Tmassiv=array of integer;
TPmassiv=array of Tmassiv;

TObj=object
public:
....
procedure Init(size:integer;vert:Tmassiv);
private:
mas:TPmassiv;
count:integer;
end;

Создаю при помощи GetMem так:
GetMem(mas,(count)*sizeof(Tmassiv));
for i:=0 to count-1 do
GetMem(mas,(count)*sizeof(integer));

освобождаю при FreeMem, так
for i:=0 to count-1 do
FreeMem(mas);
FreeMem(mas);

в проге создаю этот объект и использую его (для графики OpenGL). Но вот суть проблемы: в Init использую константный массив и указываю его размер. Когда создаю один объект или пару одинаковых, то все работает нормально, но когда создаю разные (путем установки в Init других массивов) появляется сообщение об ошибке : Invalid Pointer operation.
При проработке всех массивов в отдельности все работает, но при совмещении нет. Если кто-нибудь понял меня или знает ответ, прошу написать. Заранее благодарю
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

ВладиМИР48 писал(а):но когда создаю разные (путем установки в Init других массивов) появляется сообщение об ошибке : Invalid Pointer operation.
При проработке всех массивов в отдельности все работает, но при совмещении нет.
пример в коде приведите
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Вроде, для выделения (или изменения размера выделенной) памяти динамических массивов используется ф-я SetLength.
ВладиМИР48
Сообщения: 4
Зарегистрирован: 10 мар 2008, 23:00

Привер в коде.
Есть массив констант:
const
size_val=40;
vertex_val : Array [0..(size_val)-1] of integer=(
4,1,7,5,8,6,1,6, ... ); всего 40
size_bok=20;
vertex_bok : Array [0..(size_bok)-1] of integer=(
9,5,4,3,2,6,5,3, ... ); всего 20

далее использ obj.Init(size_val,@vertex_val); -- это работает
и в другой раз obj2.Init(size_bok,@vertex_bok); -- это работает тоже
но если сразу компилю и obj и obj1 с разными значениями, то на второй выскакивает ошибка. При этом проверял окончание создания и место ошибки, объект создается, а сразу после создания второго ошибка.
А SetLenght попробую, хотя массив работает и так норм. Может проблема в выделяемых объемах?
ВладиМИР48
Сообщения: 4
Зарегистрирован: 10 мар 2008, 23:00

А как удалить память после SetLength?
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

что-то вы мудрите, этот код для квадратных матриц?

Код: Выделить всё

GetMem(mas,([B]count[/B])*sizeof(Tmassiv));
for i:=0 to count-1 do 
GetMem(mas[i],([B]count[/B])*sizeof(integer));
у вас вроде вектор
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

ВладиМИР48 писал(а):А как удалить память после SetLength?
См. Delphi Help, статья "Dynamic arrays".

Код: Выделить всё

[b]Dynamic arrays[/b]

................................
For example,

var MyFlexibleArray: array of Real;

declares a one-dimensional dynamic array of reals. The declaration does not allocate
 memory for MyFlexibleArray. To create the array in memory, call SetLength. For example, 
given the declaration above,

SetLength(MyFlexibleArray, 20);

................................

 [u]To deallocate a dynamic array, assign  [b]nil[/b] to a variable that references the array or pass the
 variable to  [b]Finalize[/b]; either of these methods disposes of the array, provided there are no 
other references to it.[/u] Dynamic arrays of length 0 have the value nil. Do not apply the 
dereference operator (^) to a dynamic-array variable or pass it to the New or Dispose 
procedure.
ВладиМИР48
Сообщения: 4
Зарегистрирован: 10 мар 2008, 23:00

Это вс хорошо, но почему тогда по-отдельности объекты создаются, а вместе уже нет? Вы думаете это от динамическиъх массивов?
Ответить