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

Вниз

Ошибка   Найти похожие ветки 

 
Ann ©   (2003-11-03 14:12) [0]

Мне очень нужна Ваша помощь. Разбираюсь с чужой программой, написанной на делфи3, парадоксовская база.
И вылетает следующая ошибка при расчете "Access violation at address 00583731 in module PrProgram.exe"
вылетает на следующих строках
Zc:=dim.GetData(0,i);
if ZcArtTableColor.Value<>Null then Zc^.Color:=ZcArtTableColor.Value else Zc^.Color:=0;
if ZcArtTableUp.Value<>Null then Zc^.Typ:=ZcArtTableUp.Value else Zc^.Typ:=0;
if ZcArtTableProcent.Value<> Null then Zc^.Proc:=ZcArtTableProcent.Value else Zc^.Proc:=0;
Уже полдня воюю с этой ошибкой и никак, а трассировкой не проверить, данных очень много, да и расчет жутко громоздкий. А вылетает не сразу, а к концу рассчета.
Понимаю, что дать совет на такие "абстрактные" вопросы трудно, но буду рада любым предположениям!


 
Zacho ©   (2003-11-03 14:15) [1]

А что такое dim и Zc ? Приведи объявления.


 
Romkin ©   (2003-11-03 14:21) [2]

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


 
Romkin ©   (2003-11-03 14:24) [3]

Кстати, насчет трассировки:
http://www.gexperts.org/download.html
у них есть внешний трассировщик, ставишь в коде выдачу сообщений, вроде assert, и смотришь, что происходит.


 
Ann ©   (2003-11-03 14:26) [4]


> [2] Romkin © (03.11.03 14:21)
> Поубывав бы...

кого? :(
и еще прикол в том, что этот же расчет проходит за предыдущий месяц, а в этом ругается .. вот и понять не могу почему..

> [1] Zacho © (03.11.03 14:15)
> А что такое dim и Zc ? Приведи объявления.

type
ColorRec=record Color:integer;Proc:double;end;
_ColorRec=^ColorRec;
var
ZC:_ColorRec;

а dim
var
dim:TDinArray;
заганяет в массив данные для расчета... там расчет продукции по цветам..


 
Romkin ©   (2003-11-03 14:30) [5]

Ann © (03.11.03 14:26) [4]

>> [2] Romkin © (03.11.03 14:21) > Поубывав бы...
>кого? :(
Автора этого неповторимого кода :)))
Под ZC где-то память не выделяется или наоборот, рано освободилась. Ловить трудно, если освободилась, она может еще и не быть занятой, тогда без AV пройдет
А что такое TdinArray?


 
Anatoly Podgoretsky ©   (2003-11-03 14:33) [6]

А меня смущает это Null почему Variant, так и должно быть? Но к ошибке наверно это не имеет отношения.


 
Romkin ©   (2003-11-03 14:40) [7]

Вообще-то надо бы if not ZcArtTableColor.isNULL ... Вроде должно быть в D3. А так - может быть, хотя вряд ли, была бы ошибка насчет конвертации варианта


 
Ann ©   (2003-11-03 14:42) [8]


> [5] Romkin © (03.11.03 14:30)
> А что такое TdinArray?

unit DinArray;
{ DINAMIC ARRAY OBJECT IMPLEMENTATION MODULE
работает с элементами фиксированной длины
interface

type
TDADimension=(DAD_1D,DAD_2D);

TDinArray=class(TObject)
private
FPtr:pointer;
FDim:TDADimension;
FMaxX:integer;
FMaxY:integer;
FGran:integer;
procedure SetGranularity(Value:integer);
procedure SetMaxX(Value:integer);
procedure SetMaxY(Value:integer);
procedure SetDim(Value:TDADimension);
procedure Resize;
public
constructor Create;
destructor Destroy;override;
property Granularity:integer read FGran write SetGranularity;
property NumCols:integer read FMaxX write SetMaxX;
property NumRows:integer read FMaxY write SetMaxY;
property Dimension:TDADimension read FDim write SetDim;
function GetData(X,Y:integer):pointer;
function GetByte(X,Y:integer):byte;
function GetWord(X,Y:integer):word;
function GetInteger(X,Y:integer):integer;
procedure SetData(X,Y:integer;D:pointer);
procedure SetByte(X,Y:integer;D:Byte);
procedure SetWord(X,Y:integer;D:Word);
procedure SetInteger(X,Y:integer;D:Integer);
procedure Clear;
end;
и т.д. :)


 
Anatoly Podgoretsky ©   (2003-11-03 14:44) [9]

Romkin © (03.11.03 14:40) [7]
Варианты вообще то немного капризная штука, особенно в младщих версиях. Для полей isNULL правильнее.


 
Ann ©   (2003-11-03 14:45) [10]


> [7] Romkin © (03.11.03 14:40)
> Вообще-то надо бы if not ZcArtTableColor.isNULL ... Вроде
> должно быть в D3. А так - может быть, хотя вряд ли, была
> бы ошибка насчет конвертации варианта

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


 
Romkin ©   (2003-11-03 14:49) [11]

Тогда может и здесь вылетать :))) Zc:=dim.GetData(0,i);
Уточнить строку нельзя? А то как-то стремно.


 
Ann ©   (2003-11-03 14:51) [12]


> [11] Romkin © (03.11.03 14:49)
> Тогда может и здесь вылетать :))) Zc:=dim.GetData(0,i);
> Уточнить строку нельзя? А то как-то стремно.

не поняла.. какую строку уточнить? вернее, весь код привести?


 
Romkin ©   (2003-11-03 14:54) [13]

Нет,
1. в SetData выполняется копирование памяти или просто присвоение значения FPtr? Если второе, надо смотреть, что присваивается и когда освобождается.
2. Поставить лог внутри GetData, пусть сбрасывает, что указатель выдан.
Хотя хотелось бы на код этих методов глянуть.
Уточнить строку, в которой AV выпадает


 
Ann ©   (2003-11-03 14:59) [14]

AV вылетает на if ZcArtTableColor.Value<>Null then Zc^.Color:=ZcArtTableColor.Value else Zc^.Color:=0;

код GetData следующий
function TDinArray.GetData(X,Y:integer):pointer;
begin
if (FDim = DAD_1D) then
begin
if (X>=FMaxX) or (FPtr=nil) then result:=nil
else result:=pointer(integer(FPtr)+X*FGran);
end
else
begin
if (X>=FMaxX) or (Y>=FMaxY) or (FPtr=nil) then result:=nil
else result:=pointer(integer(FPtr)+(Y*FMaxX+X)*FGran);
end;
end;

а на счет первого (SetData) ..
procedure TDinArray.SetData(X,Y:integer;D:pointer);
var p:pointer;
begin
if (FDim = DAD_1D) then
begin
if (X>=FMaxX) or (FPtr=nil) then exit;
p:= pointer(integer(FPtr)+X*FGran);
end
else
begin
if (X>=FMaxX) or (Y>=FMaxY) or (FPtr=nil) then exit;
p:= pointer(integer(FPtr)+(Y*FMaxX+X)*FGran);
end;
move(D^,p^,FGran);
end;


 
Romkin ©   (2003-11-03 15:11) [15]

Мда... Кошмар...
Совсем мне это не нравится. Код надо бы менять, с дополнительными проверками. Память, как я вижу, копируется.
То, что вылетает на указанной тобой строке - не факт, скорее всего именно на GetData, есть такое свойство, останов происходит на следующей строке.
Трассировать надо, однако...


 
Ann ©   (2003-11-03 15:14) [16]


> [15] Romkin © (03.11.03 15:11)
> Мда... Кошмар...
> Совсем мне это не нравится. Код надо бы менять, с дополнительными
> проверками. Память, как я вижу, копируется.
> То, что вылетает на указанной тобой строке - не факт, скорее
> всего именно на GetData, есть такое свойство, останов происходит
> на следующей строке.
> Трассировать надо, однако...

мда.. действительно кошмар, а времени переписывать сейчас нет, другая задача весит. :(
Спасибо большое за помощь :)
пошла трассировать..............


 
Ann ©   (2003-11-03 16:41) [17]

А можно еще один глупый вопрос(мозги уже закипают :( )?
А вот что должна вернуть в качестве результата например такая процедура:
procedure setzc(ColorCount:word);
var i:word;ZC:_Rec;
begin
With DataModule1 do begin{with}
dim:=TDinArray.Create;
dim.Granularity:=sizeof(TRec);
dim.Dimension:=DAD_2D;
dim.NumRows:=ColorCount;
dim.NumCols:=1;
dim.Clear;
i:=0;
ZcArtTable.First;
While not ZcArtTable.EOF do begin {ZcArtTable}
Zc:=dim.GetData(0,i);
Zc^.Color:=ZcArtTableColor.Value;
Zc^.Typ:=ZcArtTableUp.Value;
Zc^.Proc:=ZcArtTableProcent.Value;
i:=i+1;
ZcArtTable.Next;end;{ZcArtTable}
i:=0;
dim.Clear;
ZcRazTable.First;
While not ZcRazTable.EOF do begin {ZcArtTable}
Zc:=dim.GetData(0,i);
Zc^.Color:=ZcRazTableColor.Value;
Zc^.Typ:=ZcRazTableUp.Value;
Zc^.Proc:=ZcRazTableProcent.Value;
i:=i+1;
ZcRazTable.Next;end;{ZcArtTable}
dim.Destroy;
end;//with
end;
уже минут тридцать тупо на нее смотрю и не понимаю чего она вернет..
Простите, за глупые вопросы и не ругайте сильно....


 
VAleksey ©   (2003-11-03 16:47) [18]

Она ничего не вернет.
Просто выполнит код внутри себя.
;-)


 
Ann ©   (2003-11-03 16:49) [19]

не.. я не к тому..
извините, я уже разобралась..


 
Sandman25 ©   (2003-11-03 16:54) [20]

[19] Ann © (03.11.03 16:49)

Перед тем, как разбираться, рекомендую исправить форматирование текста, поставив отступы, где надо. Тогда мозги перестанут помнить лишний контекст (while еще выполняется, из if еще не вышли, зашли в case...) и не будут кипеть :)


 
NAlexey ©   (2003-11-03 16:55) [21]

Вот так вот... Посмотришь посмотришь вот так как люди мучаются, и начинаешь в два, нет, в три раза лучше форматировать и оттачивать код, сколько бы времени не уходило. Лучшеуж день потерять, потом за пять минут долететь.:)


 
Ann ©   (2003-11-03 16:55) [22]


> [21] NAlexey © (03.11.03 16:55)
> Вот так вот... Посмотришь посмотришь вот так как люди мучаются,
> и начинаешь в два, нет, в три раза лучше форматировать и
> оттачивать код, сколько бы времени не уходило. Лучшеуж день
> потерять, потом за пять минут долететь.:)

легко долетать на своей программе..


 
ЮЮ ©   (2003-11-04 02:32) [23]

Т.к. GetData может возвращать nil, то в коде это следует учесть:

if Zc <> nil then begin
...
end;

если же такая ситуация не должна возникать, то поставь точки останова в строках типа
if (X>=FMaxX) or (FPtr=nil) then
result:=nil <здесь Break Point>
и анализируй как туда попали


 
MORA ©   (2003-11-04 04:38) [24]

Проверь типы данных, они могут отличаться от 3 версии - Integer: -1 и $FFFFFFFF одно и то же. Real {$REALCOMPATIBILITY ON}


 
Ann ©   (2003-11-04 09:52) [25]


> [23] ЮЮ © (04.11.03 02:32)
> Т.к. GetData может возвращать nil, то в коде это следует
> учесть:
>
> if Zc <> nil then begin
> ...
> end;

Спасибо большое за совет!
Помогло.. после следующего все прошло нормально
Zc:=dim6.GetData(0,i);
if Zc <> nil then Zc^.Color:=ZcArtTableColor.Value;
if Zc <> nil then Zc^.Typ:=ZcArtTableUp.Value;
if Zc <> nil then Zc^.Proc:=ZcArtTableProcent.Value;



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

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

Наверх




Память: 0.53 MB
Время: 0.019 c
7-79206
Незнайко
2003-09-13 15:00
2003.11.24
Время копирования


11-78867
vgb
2003-03-07 13:58
2003.11.24
Размер EXE увеличился на 300Kb


14-79154
Света
2003-10-31 07:35
2003.11.24
Фабрика


3-78827
dolmat
2003-11-04 12:07
2003.11.24
хранимая процедура не создается


1-78888
GH@ST
2003-11-13 10:50
2003.11.24
Кто нибудь программировал MS Agent?