![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка [D3]
Ann © (2003-11-03 14:12:00)
Мне очень нужна Ваша помощь. Разбираюсь с чужой программой, написанной на делфи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;
Уже полдня воюю с этой ошибкой и никак, а трассировкой не проверить, данных очень много, да и расчет жутко громоздкий. А вылетает не сразу, а к концу рассчета.
Понимаю, что дать совет на такие "абстрактные" вопросы трудно, но буду рада любым предположениям!
Ann (2003-11-04 09:52:00) [1]
> [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;
MORA (2003-11-04 04:38:00) [2]
Проверь типы данных, они могут отличаться от 3 версии - Integer: -1 и $FFFFFFFF одно и то же. Real {$REALCOMPATIBILITY ON}
ЮЮ (2003-11-04 02:32:00) [3]
Т.к. GetData может возвращать nil, то в коде это следует учесть:
if Zc <> nil then begin
...
end;
если же такая ситуация не должна возникать, то поставь точки останова в строках типа
if (X>=FMaxX) or (FPtr=nil) then
result:=nil <здесь Break Point>
и анализируй как туда попали
Ann (2003-11-03 16:55:00) [4]
> [21] NAlexey © (03.11.03 16:55)
> Вот так вот... Посмотришь посмотришь вот так как люди мучаются,
> и начинаешь в два, нет, в три раза лучше форматировать и
> оттачивать код, сколько бы времени не уходило. Лучшеуж день
> потерять, потом за пять минут долететь.:)
легко долетать на своей программе..
NAlexey (2003-11-03 16:55:00) [5]
Вот так вот... Посмотришь посмотришь вот так как люди мучаются, и начинаешь в два, нет, в три раза лучше форматировать и оттачивать код, сколько бы времени не уходило. Лучшеуж день потерять, потом за пять минут долететь.:)
Sandman25 (2003-11-03 16:54:00) [6]
[19] Ann © (03.11.03 16:49)
Перед тем, как разбираться, рекомендую исправить форматирование текста, поставив отступы, где надо. Тогда мозги перестанут помнить лишний контекст (while еще выполняется, из if еще не вышли, зашли в case...) и не будут кипеть :)
Ann (2003-11-03 16:49:00) [7]
не.. я не к тому..
извините, я уже разобралась..
VAleksey (2003-11-03 16:47:00) [8]
Она ничего не вернет.
Просто выполнит код внутри себя.
;-)
Ann (2003-11-03 16:41:00) [9]
А можно еще один глупый вопрос(мозги уже закипают :( )?
А вот что должна вернуть в качестве результата например такая процедура:
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;
уже минут тридцать тупо на нее смотрю и не понимаю чего она вернет..
Простите, за глупые вопросы и не ругайте сильно....
Ann (2003-11-03 15:14:00) [10]
> [15] Romkin © (03.11.03 15:11)
> Мда... Кошмар...
> Совсем мне это не нравится. Код надо бы менять, с дополнительными
> проверками. Память, как я вижу, копируется.
> То, что вылетает на указанной тобой строке - не факт, скорее
> всего именно на GetData, есть такое свойство, останов происходит
> на следующей строке.
> Трассировать надо, однако...
мда.. действительно кошмар, а времени переписывать сейчас нет, другая задача весит. :(
Спасибо большое за помощь :)
пошла трассировать..............
Romkin (2003-11-03 15:11:00) [11]
Мда... Кошмар...
Совсем мне это не нравится. Код надо бы менять, с дополнительными проверками. Память, как я вижу, копируется.
То, что вылетает на указанной тобой строке - не факт, скорее всего именно на GetData, есть такое свойство, останов происходит на следующей строке.
Трассировать надо, однако...
Ann (2003-11-03 14:59:00) [12]
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 14:54:00) [13]
Нет,
1. в SetData выполняется копирование памяти или просто присвоение значения FPtr? Если второе, надо смотреть, что присваивается и когда освобождается.
2. Поставить лог внутри GetData, пусть сбрасывает, что указатель выдан.
Хотя хотелось бы на код этих методов глянуть.
Уточнить строку, в которой AV выпадает
Ann (2003-11-03 14:51:00) [14]
> [11] Romkin © (03.11.03 14:49)
> Тогда может и здесь вылетать :))) Zc:=dim.GetData(0,i);
> Уточнить строку нельзя? А то как-то стремно.
не поняла.. какую строку уточнить? вернее, весь код привести?
Romkin (2003-11-03 14:49:00) [15]
Тогда может и здесь вылетать :))) Zc:=dim.GetData(0,i);
Уточнить строку нельзя? А то как-то стремно.
Ann (2003-11-03 14:45:00) [16]
> [7] Romkin © (03.11.03 14:40)
> Вообще-то надо бы if not ZcArtTableColor.isNULL ... Вроде
> должно быть в D3. А так - может быть, хотя вряд ли, была
> бы ошибка насчет конвертации варианта
там пустых значений нет, я пробывала убирать, не помогает..
Anatoly Podgoretsky (2003-11-03 14:44:00) [17]
Romkin © (03.11.03 14:40) [7]
Варианты вообще то немного капризная штука, особенно в младщих версиях. Для полей isNULL правильнее.
Ann (2003-11-03 14:42:00) [18]
> [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;
и т.д. :)
Romkin (2003-11-03 14:40:00) [19]
Вообще-то надо бы if not ZcArtTableColor.isNULL ... Вроде должно быть в D3. А так - может быть, хотя вряд ли, была бы ошибка насчет конвертации варианта
Anatoly Podgoretsky (2003-11-03 14:33:00) [20]
А меня смущает это Null почему Variant, так и должно быть? Но к ошибке наверно это не имеет отношения.