Форум: "Базы";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];
ВнизОшибка Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.009 c