Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.042 c
2-1143826232
FBI Agent
2006-03-31 21:30
2006.04.16
Пароли и *.ini


1-1142232526
Guf
2006-03-13 09:48
2006.04.16
Не прямоугольные кнопки и прозрачные формы


2-1143875943
tort
2006-04-01 11:19
2006.04.16
Почему окно вылезает два и более раз?


2-1143922266
He3Hauka
2006-04-02 00:11
2006.04.16
Топологическая сортировка TreeView


2-1143798714
KyRo
2006-03-31 13:51
2006.04.16
Операции с датой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский