Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Ошибка при вызове 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
15-1143037767
Харько
2006-03-22 17:29
2006.04.16
Задачка в среду


3-1140417228
Os
2006-02-20 09:33
2006.04.16
Удаление дублирующих записей


2-1144099736
ctudent
2006-04-04 01:28
2006.04.16
TreeView+База данных


15-1143542456
McSimm
2006-03-28 14:40
2006.04.16
Подскажите какие-нибудь команды для Делфи с описанием


2-1144192096
Tester83
2006-04-05 03:08
2006.04.16
Проблема со шрифтами