Форум: "Основная";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c