Форум: "Начинающим";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
ВнизОшибка при вызове SetLength применительно к динамическим массивам Найти похожие ветки
← →
SilentDon © (2006-03-31 17:41) [0]У меня проблемы с динамическими массивами. Дело в том что у меня много структур, содержащих динамические массивы(в которых ещё структуры с динамическими массивами) и я в коде пользуюсь GetMem и SetLength. Всё работает, но если я заключаю эти функции в цикл (исполняется где-то 100 раз), то на некотором цикле SetLength вызывает AV. Он пишет что не может записать адрес 0X(и здесь какое то огромное значение типа FFFAF234). Чем больше ф SetLength я включаю в цикл тем раньше выдаётся AV. Без массивов мне никак не обойтись, так что хотелось бы решить эту проблему. Может есть какой-нибудь заменитель SetLength или это можно как-то обойти?
← →
MBo © (2006-03-31 17:46) [1]Заменителя SetLength нет.
А как SetLength сочетается с GetMem ?
Хотелось бы увидеть код.
← →
SilentDon © (2006-03-31 17:59) [2]Функции ReadVertexList/ReadFaceList
function DS_READER.ReadVertexList(NUM_VERTS:WORD):TVERTEXLIST;
var
VL:TVERTEXLIST;
begin
VL:=TVERTEXLIST.Create;
VL.num_entry:=NUM_VERTS;
GETMem(VL.Vertices,VL.num_entry*sizeof(TPOINT));
SetLength(VL.Vertices^,NUM_VERTS);
a:=0;
WHILE A<VL.Num_Entry DO BEGIN
VL.Vertices^[A]:=TPOINT.Create;
ReadLN(FI,VL.Vertices^[A].x,VL.Vertices^[A].y,VL.Vertices^[A].z);
A:=A+1;
END;
result:=VL;
end;
function DS_READER.ReadFaceList(NUM_FACES:WORD):TFACELIST;
var
FL:TFACELIST;
begin
FL:=TFACELIST.Create;
FL.num_entry:=NUM_FACES;
GetMem(FL.Faces,sizeof(TFACE)*FL.num_entry);
SetLength(FL.Faces^,FL.Num_entry);
a:=0;
WHILE A<FL.Num_Entry DO BEGIN
FL.Faces^[a]:=TFACE.Create;
ReadLN(FI,FL.Faces^[A].i1,FL.Faces^[A].i2,FL.Faces^[A].i3);
A:=A+1;
END;
result:=FL;
end;
ReadMesh:
function DS_READER.ReadMesh(FRAME:WORD):TMESHINFRAME;
begin
Result:=TMESHINFRAME.Create;
READLN(FI,LINE);
READLN(FI,NUM_VERTS,NUM_FACES);
A:=0;
WHILE (LINE<>"End Object") DO BEGIN
ReadLN(FI,line);
IF LINE="Start VertexList" THEN BEGIN
Result.Verts:=TVertexList.Create;
Result.Verts:=ReadVertexList(NUM_VERTS);
ReadLN(FI,line);
END;
IF LINE="Start FaceList" THEN BEGIN
Result.Faces:=TFaceList.Create;
Result.Faces:=ReadFaceList(NUM_FACES);
READLN(FI,line);
END;
IF LINE="Start FasetNormalList" THEN BEGIN
Result.FasetNormals:=TVertexList.Create;
Result.FasetNormals:=ReadVertexList(NUM_FACES-1);
READLN(FI,LINE);
END;
IF LINE="Start SmoothNormalList" THEN BEGIN
Result.SmoothNormals:=TVertexList.Create;
Result.SmoothNormals:=ReadVertexList(NUM_VERTS-1);
READLN(FI,LINE);
END;
END;
Result.Frame:=FRAME+SIZEOF(POINTER);;
end;
function DS_READER.ReadFrames():PFRAMES;
var FIF:TFRAME;
D:WORD;
begin
ReadLN(FI,Num_FRAMES);
GETMEM(RESULT,Sizeof(PFrameS));
SetLength(RESULT^,NUM_FRAMES);
D:=0;
WHILE (line<>"Start Texture")AND(EOF(FI)=FALSE) DO BEGIN
READLN(FI,LINE);
IF LINE<>"Start Texture" THEN BEGIN
FRAME:=StrToInt(LINE);
FIF:=TFRAME.Create;
FIF.Frame:=FRAME;
READLN(FI,LINE);
IF LINE="Start Object" THEN BEGIN
READLN(FI,LINE);
IF LINE="Start Mesh" THEN BEGIN
IF FIF.Num_Mesh=0 THEN BEGIN
GetMem(FIF.Meshes,Sizeof(TMESHINFRAME));
SetLength(FIF.Meshes^,FIF.Num_Mesh+1);
FIF.Meshes^[FIF.Num_Mesh]:=TMESHINFRAME.Create;
FIF.Meshes^[FIF.Num_Mesh]:=ReadMesh(FRAME);
FIF.Num_Mesh:=FIF.Num_Mesh+1;
END
ELSE
IF FIF.Num_Mesh>0 THEN BEGIN
FIF.Meshes:=ResizeArray( FIF.Meshes,FIF.Num_Mesh*sizeof(TMESHINFRAME)
,(FIF.Num_Mesh+1)*sizeof(TMESHINFRAME));
SetLength(FIF.MEshes^,FIF.Num_Mesh+1);
FIF.Meshes^[FIF.Num_Mesh]:=TMESHINFRAME.Create;
FIF.Meshes^[Fif.Num_Mesh]:=ReadMesh(FRAME);
FIF.Num_Mesh:=FIF.Num_Mesh+1;
END;
FIF.Frame:=FRAME;
END;
END
ELSE IF LINE<>"Start Mesh" THEN BEGIN
WHILE LINE<>"End Object" DO BEGIN
READLN(FI,LINE);
END;
END;
Result^[D]:=TFrame.Create;
Result^[D]:=FIF;
D:=D+1;
END;
END;
end;
PS:я знаю что код сакает))
← →
tesseract © (2006-03-31 18:00) [3]
> Без массивов мне никак не обойтись,
TLIST не котируется?
> Всё работает, но если я заключаю эти функции в цикл (исполняется
> где-то 100 раз), то на некотором цикле SetLength вызывает
> AV
SetLength надо использовать как можно реже.
Выделение памяти -крайне медленная задача.
← →
SilentDon © (2006-03-31 18:02) [4]Структуры:
type
TPoint=class
public
x,
y,
z:GLFLOAT;
end;
PPoint=^TPoint;
TPoints=array of TPoint;
PPoints=^TPoints;
TVertexList=class
public
num_entry:WORD;
Vertices:PPoints;
end;
PVertexList=^TVertexList;
TFace=class
public
i1,
i2,
i3:WORD;
end;
PFace=^TFace;
TFaces=array of TFace;
PFaces=^TFaces;
TFaceList=class
public
num_entry:WORD;
Faces:PFaces;
end;
PFaceList=^TFaceList;
TMeshInFrame=class
public
Frame:WORD;//
Verts:TVertexList;
Faces:TFaceList;
SmoothNormals:TVertexList;
FasetNormals:TVertexList;
end;
PMeshInFrame=^TMeshInFrame;
TFrameMeshes=array of TMeshInFrame;
PFrameMeshes=^TFrameMeshes;
TFrame=class
public
Frame:WORD;
Num_Mesh:WORD;
Meshes:PFrameMeshes;
end;
PFrame=^Tframe;
TFrames=array of TFrame;
PFrames=^TFrames;
← →
tesseract © (2006-03-31 18:04) [5]
> Result.SmoothNormals:=TVertexList.Create;
> Result.SmoothNormals:=ReadVertexList(NUM_VERTS-1);
Зачем SmoothNormals сначала создавать, а потом присваивать им другой объект?
Причём созданный в вызываемой процедуре, которая, кстати в принципе должна освободить все переменные созданные в ней?
← →
SilentDon © (2006-03-31 18:05) [6]2tesseract:
А TList не будет тормозить если в нём будет ещё Tlist c Tlist внутри? Он вроде ресурсов много жрёт.
← →
tesseract © (2006-03-31 18:08) [7]
> А TList не будет тормозить если в нём будет ещё Tlist c
> Tlist внутри? Он вроде ресурсов много жрёт.
Гораздо быстрее кучи SetLength.
Ресурсов он кушает нормально.
Tlist в Tlist - изврат.
А многомерные массивы не пробовал? Или массивы записей?
← →
MBo © (2006-03-31 18:09) [8]У тебя дикая мешанина из указателей, дин массивов и т.д.
Выделение памяти и через GetMem, и через диспетчер дин. структур - SetLength для одного и того же.
Непременно стоит сначала разобраться в языке.
← →
SilentDon © (2006-03-31 18:13) [9]2 Tesseract :
проверил без
:=BLAH.Create
не пашет, выдаёт ошибку.
2 MBo
1)GetMem без SetLength выдаёт массив формы P^=() и ему нельзя ничего присвоить(присвоить можно, но потом он данные куда то удаляет)
2) Я и пытаюсь)
← →
MBo © (2006-03-31 18:22) [10]Для начала измени объявления примерно так.
Указатели на классы ни к чему - класс и так указатели.
И вообще здесь классы не нужны, ведь никаких действий они не совершают, достаточно записей.
Указатели на дин. массивы тоже не нужны.
TPoint3D = record
x, y, z:GLFLOAT;
end;
TPoints3D=array of TPoint3D;
TVertexList = record
num_entry:WORD;
Vertices:TPoints3D;
end;
TFace = record
i1, i2, i3: WORD;
end;
TFaces=array of TFace;
TFaceList= record
num_entry:WORD;
Faces:TFaces;
end;
TMeshInFrame= record
Frame:WORD;//
Verts:TVertexList;
Faces:TFaceList;
SmoothNormals:TVertexList;
FasetNormals:TVertexList;
end;
TFrameMeshes=array of TMeshInFrame;
TFrame=record
Frame:WORD;
Num_Mesh:WORD;
Meshes:TFrameMeshes;
end;
TFrames=array of TFrame;
← →
tesseract © (2006-03-31 18:24) [11]
> :=BLAH.Create
Правильно делает. Класс-то должен освободится после выхода из функции.
← →
SilentDon © (2006-03-31 18:31) [12]Как же задать размер ,к примеру , того же Vertices из TVertexList?
Пользоваться SetLength?
← →
MBo © (2006-03-31 18:36) [13]>Как же задать размер ,к примеру , того же Vertices из TVertexList?
>Пользоваться SetLength?
Конечно.
Если у тебя часто происходит увеличение массивов, то тебе правильно подсказали про TList.
← →
SilentDon © (2006-03-31 18:36) [14]Спасибо вам всем огромное, буду сидеть переваривать новую информацию))
Полагаю, что тема закрыта.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.047 c