Динамические массивы и объекты
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
-
- Сообщения: 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.
При проработке всех массивов в отдельности все работает, но при совмещении нет. Если кто-нибудь понял меня или знает ответ, прошу написать. Заранее благодарю
Например
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.
При проработке всех массивов в отдельности все работает, но при совмещении нет. Если кто-нибудь понял меня или знает ответ, прошу написать. Заранее благодарю
пример в коде приведитеВладиМИР48 писал(а):но когда создаю разные (путем установки в Init других массивов) появляется сообщение об ошибке : Invalid Pointer operation.
При проработке всех массивов в отдельности все работает, но при совмещении нет.
Вроде, для выделения (или изменения размера выделенной) памяти динамических массивов используется ф-я SetLength.
-
- Сообщения: 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 попробую, хотя массив работает и так норм. Может проблема в выделяемых объемах?
Есть массив констант:
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 попробую, хотя массив работает и так норм. Может проблема в выделяемых объемах?
-
- Сообщения: 4
- Зарегистрирован: 10 мар 2008, 23:00
А как удалить память после SetLength?
что-то вы мудрите, этот код для квадратных матриц?
у вас вроде вектор
Код: Выделить всё
GetMem(mas,([B]count[/B])*sizeof(Tmassiv));
for i:=0 to count-1 do
GetMem(mas[i],([B]count[/B])*sizeof(integer));
См. Delphi Help, статья "Dynamic arrays".ВладиМИР48 писал(а):А как удалить память после SetLength?
Код: Выделить всё
[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.
-
- Сообщения: 4
- Зарегистрирован: 10 мар 2008, 23:00
Это вс хорошо, но почему тогда по-отдельности объекты создаются, а вместе уже нет? Вы думаете это от динамическиъх массивов?