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

Вниз

Access Violation и все тут, млин....   Найти похожие ветки 

 
SkyRanger ©   (2003-06-19 14:08) [0]

Пишу класс для хранения поверхности состоящей из треугольников. вот так описываю типы и классы:


type

//Тип описывающий положение точки в 3D пространстве
TGLPoint = record
x : GLDouble; //Положение точки в пространстве
y : GLDouble; //Положение точки в пространстве
z : GLDouble; //Положение точки в пространстве
Latitude : GLDouble; //Наклон точки
Longitude : GLDouble; //Наклон точки
end;

//Тип описывающий треугольник
TGLTriangle = record
xyz1 : TGLPoint;
xyz2 : TGLPoint;
xyz3: TGlPoint;
TexID : Cardinal;
IsVis : Boolean;
end;

//Класс описывающий поверхность
TGLSurface = class

Triangles : array of TGLTriangle;

procedure AddTriangle(Triangle : TGLTriangle); //Добавить треугольник

....

procedure LoadFromFile(FileName : String);

end;

//Реализация используемых функции, остальые пока не приделах

procedure TGLSurface.AddTriangle(Triangle : TGLTriangle);
Begin
SetLength(Triangles,Length(Triangles)+1);
Triangles[Length(Triangles)]:=Triangle;
Triangles[Length(Triangles)].IsVis:=True;
End;


Затем загружать пытаюсь и (типа) Raw файла вершины и упихивать все енто дело в класс... Вот эта процедура...


procedure TGLSurface.LoadFromFile(FileName : String);
var
strnum : Integer;
s:string;
a : array [0..8] of string;
i, j, k : integer;
x : integer;
f:TextFile;
tri:TGLTriangle;
Begin
try
x:=0;

assignfile(f,FileName);
reset(f);

while not eof(f) do
begin

for i:=0 to 8 do
a[i]:="";

readln(f,s);

j:=0;

for i:=1 to length(s) do
Begin
if (copy(s,i,1)=" ") then
if (i<>1) then
inc(j);

if (copy(s,i,1)=Trim(chr(46))) then
if (DecimalSeparator=",") then
a[j]:=a[j]+","
else
a[j]:=a[j]+"."
else
a[j]:=a[j]+copy(s,i,1);
End;


k:=0;

tri.xyz1.x:=StrToFloat(a[k]);
tri.xyz1.y:=StrToFloat(a[k+1]);
tri.xyz1.z:=StrToFloat(a[k+2]);

tri.xyz2.x:=StrToFloat(a[k+3]);
tri.xyz2.y:=StrToFloat(a[k+4]);
tri.xyz2.z:=StrToFloat(a[k+5]);

tri.xyz3.x:=StrToFloat(a[k+6]);
tri.xyz3.y:=StrToFloat(a[k+7]);
tri.xyz3.z:=StrToFloat(a[k+8]);

AddTriangle(tri);

End;//while


closefile(f);

except
ExceptionHandler("RAWModels", FileName ,"Sky3DEng.log");
halt(0);
end;//try

End;


В общем все идет вроде ОК, но в этом куске

readln(f,s);

j:=0;

for i:=1 to length(s) do
Begin
if (copy(s,i,1)=" ") then
if (i<>1) then
inc(j);

if (copy(s,i,1)=Trim(chr(46))) then
if (DecimalSeparator=",") then
a[j]:=a[j]+","
else
a[j]:=a[j]+"."
else
a[j]:=a[j]+copy(s,i,1);
End;


На выделенной жирным строчке дает Access Violation...
Непонятно почему.. Я ужо дебугил по строкам безполезно он считывают нормально строку а в разных местах дает ошибку...
У меня есть подозрение что я намутил с выделением памяти но где понять не могу хоть убейте...


var
i, j : integer;
surf:TGLSurface;
begin
surf:=TGLSurface.Create;

surf.LoadFromFile("model.raw");



А это кусок основной программы вызывается по нажатию клавиши на форме...

Может кто найдет где тут ошибка... Где то я тут накосячил.. А где хз... Я в недоумении... Таких глюковраньше не встречал... :(


 
@Ujin ©   (2003-06-19 14:11) [1]

for i:=1 to length(s) do
попробуй
for i:=1 to length(s)-1 do


 
Palladin ©   (2003-06-19 14:21) [2]

чет тут всякой херни, извиняюсь за выражение, понавешено
вся вот эта твоя байда
for i:=1 to length(s) do
Begin
if (copy(s,i,1)=" ") then
if (i<>1) then
inc(j);

if (copy(s,i,1)=Trim(chr(46))) then
if (DecimalSeparator=",") then
a[j]:=a[j]+","
else
a[j]:=a[j]+"."
else
a[j]:=a[j]+copy(s,i,1);
end;

сводится к
var
sTmp:tstringlist; // вместо a:array[0..8] of string;

sTmp.Delimiter:=" ";
sTmp.DelimitedText:=s;
for i:=0 to sTmp.count-1 do StringReplace(sTmp[i],".",DecimalSeparator,[]);


 
SkyRanger ©   (2003-06-19 14:22) [3]

2@Ujin: Не помогло... Ему пофигу...
Он на работе у меня в строке выделенной жирным давал ошибку...
Теперь в другой...
Какой то косяк с памятью а какой понять не могу... :(


 
@Ujin ©   (2003-06-19 14:24) [4]

SkyRanger, послушай Palladin"а


 
Palladin ©   (2003-06-19 14:24) [5]

:) и даже скажу больше
for i:=0 to sTmp.count-1 do StringReplace(sTmp[i],".",DecimalSeparator,[]);

можно перед этим еще и проверку поставить для избавления от ненужных пробегов

if "."<>DecimalSeparator then
for .......


 
SkyRanger ©   (2003-06-19 14:30) [6]

Все равно при первом заходе в

for i:=0 to sTmp.count-1 do StringReplace(sTmp[i],".",DecimalSeparator,[]);

Он опять дает ошибку...


 
Palladin ©   (2003-06-19 14:33) [7]

я твои мысли читать не умею и рядом не сижу, что за ошибка, какого рода, в какой сторке?

sTmp:=TStringList.Create; сделал?


 
SkyRanger ©   (2003-06-19 14:57) [8]

Да все равно ошибку дает уже на другой строке...


 
SkyRanger ©   (2003-06-19 15:07) [9]

А вообще насчет компактности кода могу сказать только то, что специально делал чтобы не подключать левые модули... Все работало с массивом типа
TSurface = Array of Array of double;
А коы я введ класс то начались глюки... :(



 
Palladin ©   (2003-06-19 15:09) [10]

у тебя какое то неизлечимое не понимание, я тебе вопрос задал, даже два, ты как то мимо него пролез, ну черт с тобой...


 
Юрий Федоров ©   (2003-06-19 15:10) [11]

А вот еще :

procedure TGLSurface.AddTriangle(Triangle : TGLTriangle);
Begin
SetLength(Triangles,Length(Triangles)+1);
Triangles[Length(Triangles)1]:=Triangle;
Triangles[Length(Triangles)].IsVis:=True;
End;

Нужно
Triangles[Length(Triangles) -1]:=Triangle;
Triangles[Length(Triangles) -1].IsVis:=True;



 
SkyRanger ©   (2003-06-19 15:33) [12]

Я тебе ответил
>>Да, все равно ошибку дает, уже на другой строке...
Ну извини если ты без запятых не понял...



 
SkyRanger ©   (2003-06-19 15:36) [13]

Всем спасибо особенно Юрий Федоров все вроде заработало...
Palladin не обижайся плиз, просто туплю я малость уже у меня 23:30...
но все равно спасибо за идею...
Еще раз всем огромное пасиба :)
P.S. Все я пошел спать...



Страницы: 1 вся ветка

Текущий архив: 2003.06.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
14-97823
Кен
2003-06-10 02:20
2003.06.30
Посоветуйте, пожалуйста, компонент для работы с запароленными


1-97580
Maxim Pshevlotsky
2003-06-15 07:10
2003.06.30
Скорость выполнения MTS


6-97766
porky
2003-04-25 18:02
2003.06.30
local links?


1-97643
smolin
2003-06-19 11:28
2003.06.30
выход из цикла ???


1-97651
R
2003-06-20 06:42
2003.06.30
Создание свойств в компаненте