Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
4-97919
il
2003-04-28 14:24
2003.06.30
Как выбрать пункт главного меню чужого приложения (окна)


1-97602
Last
2003-06-19 10:05
2003.06.30
ShowModal


14-97849
Fennek^Red
2003-06-12 21:48
2003.06.30
Давайте сделаем рассказ


14-97874
Jumbo
2003-06-10 18:35
2003.06.30
Adobe PDF формат


8-97752
SuperMagic
2003-03-16 13:34
2003.06.30
Кривые второго порядка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский